xref: /csrg-svn/usr.bin/f77/libI77/fmtlib.c (revision 2493)
1*2493Sdlw /*
2*2493Sdlw char id_fmtlib[] = "@(#)fmtlib.c	1.1";
3*2493Sdlw  *
4*2493Sdlw  * integer to ascii conversion
5*2493Sdlw  */
6*2493Sdlw 
7*2493Sdlw #include "fio.h"
8*2493Sdlw 
9*2493Sdlw char	_digit[] = "0123456789abcdefghijklmnopqrstuvwxyz";
10*2493Sdlw 
11*2493Sdlw char *icvt(value,ndigit,sign) long value; int *ndigit,*sign;
12*2493Sdlw {
13*2493Sdlw 	static char buf[MAXINTLENGTH+1];
14*2493Sdlw 	register int i;
15*2493Sdlw 	long kludge, rem, mask = 0x7fffffff;
16*2493Sdlw 	int one = 1;
17*2493Sdlw 	char c;
18*2493Sdlw 
19*2493Sdlw 	if (value == 0)
20*2493Sdlw 	{	*sign=0;
21*2493Sdlw 		*ndigit=one;
22*2493Sdlw 		buf[MAXINTLENGTH]='0';
23*2493Sdlw 		return(&buf[MAXINTLENGTH]);
24*2493Sdlw 	}
25*2493Sdlw 	else if (signit)	/* signed */
26*2493Sdlw 	{
27*2493Sdlw 		*sign = (value < 0);
28*2493Sdlw 		c = (int)(value % radix);
29*2493Sdlw 		value /= radix;
30*2493Sdlw 		if (*sign)
31*2493Sdlw 		{	value = -value;
32*2493Sdlw 			c = -c;
33*2493Sdlw 		}
34*2493Sdlw 	}
35*2493Sdlw 	else			/* unsigned */
36*2493Sdlw 	{	*sign = 0;
37*2493Sdlw 		if (value < 0)
38*2493Sdlw 		{	/* ALL THIS IS TO SIMULATE UNSIGNED MOD & DIV */
39*2493Sdlw 			kludge = mask - (radix - one);
40*2493Sdlw 			value &= mask;
41*2493Sdlw 			rem = (kludge % radix) + (value % radix);
42*2493Sdlw 			value = (kludge / radix) + (value / radix)
43*2493Sdlw 				 + (rem / radix) + one;
44*2493Sdlw 			c = (int)(rem % radix);
45*2493Sdlw 		}
46*2493Sdlw 		else
47*2493Sdlw 		{
48*2493Sdlw 			c = (int)(value % radix);
49*2493Sdlw 			value /= radix;
50*2493Sdlw 		}
51*2493Sdlw 	}
52*2493Sdlw 	*(buf+MAXINTLENGTH) = _digit[c];
53*2493Sdlw 	for(i=MAXINTLENGTH-one; value!=0; i--)
54*2493Sdlw 	{
55*2493Sdlw 		c = (int)(value % radix);
56*2493Sdlw 		*(buf+i) = _digit[c];
57*2493Sdlw 		value /= radix;
58*2493Sdlw 	}
59*2493Sdlw 	*ndigit = MAXINTLENGTH - i;
60*2493Sdlw 	return(&buf[i+one]);
61*2493Sdlw }
62