aboutsummaryrefslogtreecommitdiff
path: root/sys/libc/cstrupk.c
blob: c8e26e19231a34a2aede78606ee197c0a1a22877 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
*/

#define	import_libc
#define	import_spp
#include <iraf.h>

/* C_STRUPK -- Unpack a C string into an SPP string.  This procedure should
** be called from C in preference to the SPP procedure STRUPK because the
** input string is declared to be of type char, rather than as an XCHAR
** array containing packed chars as in STRUPK.  The output string is however
** of type XCHAR since it is expected to be passed to an SPP procedure.  A
** pointer to the output string is returned as the function value for use
** in argument lists.
*/
XCHAR *
c_strupk (
  char	*str,			/* C string			*/
  XCHAR	*outstr,		/* SPP string			*/
  int	maxch			/* max chars out, incl EOS	*/
)
{
	register char	*ip = str;
	register XCHAR	*op = outstr;
	register int	  n = maxch-1;


	/* Is is necessary to determine the length of the string in order to
	 * be able to unpack the string in place, i.e., from right to left.
	 */
	if (maxch)
	    if (sizeof(char) != sizeof(XCHAR) || str != (char *)outstr) {
		n = min (n, strlen(ip));
		op[n] = XEOS;

		for (n = n - 1;  n >= 0;  --n)
		    op[n] = ip[n];
	    }

	return (outstr);
}