xref: /csrg-svn/local/toolchest/ksh/shlib/utos.c (revision 35202)
1*35202Smarc /*
2*35202Smarc 
3*35202Smarc  *      Copyright (c) 1984, 1985, 1986 AT&T
4*35202Smarc  *      All Rights Reserved
5*35202Smarc 
6*35202Smarc  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*35202Smarc  *      CODE OF AT&T.
8*35202Smarc  *      The copyright notice above does not
9*35202Smarc  *      evidence any actual or intended
10*35202Smarc  *      publication of such source code.
11*35202Smarc 
12*35202Smarc  */
13*35202Smarc /* @(#)utos.c	1.1 */
14*35202Smarc 
15*35202Smarc /*
16*35202Smarc  *   UTOS.C
17*35202Smarc  *
18*35202Smarc  *   Programmer:  D. G. Korn
19*35202Smarc  *
20*35202Smarc  *         Date:  May 3, 1982
21*35202Smarc  *
22*35202Smarc  *
23*35202Smarc  *
24*35202Smarc  *   LTOS (SINT, BASE)
25*35202Smarc  *
26*35202Smarc  *        Return a pointer to a string denoting the value of
27*35202Smarc  *        the signed long integer SINT in base BASE.
28*35202Smarc  *
29*35202Smarc  *   UTOS (USINT, BASE)
30*35202Smarc  *
31*35202Smarc  *        Return a pointer to a string denoting the value of
32*35202Smarc  *        the unsigned long integer USINT in base BASE.
33*35202Smarc  *
34*35202Smarc  *
35*35202Smarc  *
36*35202Smarc  *   See Also:  arith(III)
37*35202Smarc  */
38*35202Smarc 
39*35202Smarc 
40*35202Smarc #define BASEMAX	 (4+16*sizeof(int))
41*35202Smarc static char hexstr[BASEMAX];
42*35202Smarc extern char hdigits[];
43*35202Smarc char *utos();
44*35202Smarc char *ltos();
45*35202Smarc 
46*35202Smarc /*
47*35202Smarc  *   LTOS (SINT, BASE)
48*35202Smarc  *
49*35202Smarc  *        long USINT;
50*35202Smarc  *
51*35202Smarc  *        int BASE;
52*35202Smarc  *
53*35202Smarc  *   Return a pointer to a string denoting the value of SINT
54*35202Smarc  *   in base BASE.  The string will be stored within HEXSTR.
55*35202Smarc  *   It will begin with the base followed by a single '#'.
56*35202Smarc  *   A minus sign will be prepended for negative numbers
57*35202Smarc  *
58*35202Smarc  */
59*35202Smarc 
60*35202Smarc 
ltos(sint,base)61*35202Smarc char *ltos(sint,base)
62*35202Smarc long sint;
63*35202Smarc int base;
64*35202Smarc {
65*35202Smarc 	register char *sp;
66*35202Smarc 	register long l = (sint>=0?sint:-sint);
67*35202Smarc #ifdef pdp11
68*35202Smarc 	sp = utos(l,base);
69*35202Smarc #else
70*35202Smarc 	sp = utos((unsigned long)l,base);
71*35202Smarc #endif /* pdp11 */
72*35202Smarc 	if(sint<0)
73*35202Smarc 		*--sp = '-';
74*35202Smarc 	return(sp);
75*35202Smarc }
76*35202Smarc 
77*35202Smarc /*
78*35202Smarc  *   UTOS (USINT, BASE)
79*35202Smarc  *
80*35202Smarc  *        unsigned USINT;
81*35202Smarc  *
82*35202Smarc  *        int BASE;
83*35202Smarc  *
84*35202Smarc  *   Return a pointer to a string denoting the value of USINT
85*35202Smarc  *   in base BASE.  The string will be stored within HEXSTR.
86*35202Smarc  *   It will begin with the base followed by a single '#'.
87*35202Smarc  *
88*35202Smarc  */
89*35202Smarc 
90*35202Smarc 
91*35202Smarc 
utos(usint,base)92*35202Smarc char *utos(usint,base)
93*35202Smarc register int base;
94*35202Smarc #ifdef pdp11
95*35202Smarc  /* unsigned longs are not supported on pdp11 */
96*35202Smarc long usint;
97*35202Smarc {
98*35202Smarc 	long l = usint;
99*35202Smarc #else
100*35202Smarc unsigned long usint;
101*35202Smarc {
102*35202Smarc 	register unsigned long l = usint;
103*35202Smarc #endif	/* pdp11 */
104*35202Smarc 	register char *cp = hexstr+(BASEMAX-1);
105*35202Smarc 	if(base < 2 || base > BASEMAX)
106*35202Smarc 		return(cp);
107*35202Smarc 	for(*cp = 0;cp > hexstr && l;l /= base)
108*35202Smarc 		*--cp = hdigits[(l%base)<<1];
109*35202Smarc 	if(usint==0)
110*35202Smarc 		*--cp = '0';
111*35202Smarc 	if(base==10)
112*35202Smarc 		return(cp);
113*35202Smarc 	*--cp = '#';
114*35202Smarc 	*--cp = hdigits[(base%10)<<1];
115*35202Smarc 	if(base /= 10)
116*35202Smarc 		*--cp = hdigits[(base%10)<<1];
117*35202Smarc 	return(cp);
118*35202Smarc }
119