aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/bootlib/osstrupk.c
blob: e0617089bc6685ed1d6a8381f1fb8ae76308093c (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
42
43
44
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
 */

#include <stdio.h>

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

/* OS_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 *
os_strupk (
  char	*str,			/* C string			*/
  XCHAR	*outstr,		/* SPP string			*/
  int	maxch 			/* max chars out, excl EOS	*/
)
{
	register char	*ip = str;
	register XCHAR	*op = outstr;
	register int	  n = maxch;


	/* 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;

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

	return (outstr);
}