xref: /dflybsd-src/lib/libc/stdlib/l64a.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino  * Written by J.T. Conklin <jtc@NetBSD.org>.
3*86d7f5d3SJohn Marino  * Public domain.
4*86d7f5d3SJohn Marino  *
5*86d7f5d3SJohn Marino  * $NetBSD: l64a.c,v 1.13 2003/07/26 19:24:54 salo Exp $
6*86d7f5d3SJohn Marino  * $FreeBSD: src/lib/libc/stdlib/l64a.c,v 1.1 2005/12/24 22:37:59 trhodes Exp $
7*86d7f5d3SJohn Marino  */
8*86d7f5d3SJohn Marino 
9*86d7f5d3SJohn Marino #include <stdlib.h>
10*86d7f5d3SJohn Marino 
11*86d7f5d3SJohn Marino char *
l64a(long value)12*86d7f5d3SJohn Marino l64a(long value)
13*86d7f5d3SJohn Marino {
14*86d7f5d3SJohn Marino 	static char buf[8];
15*86d7f5d3SJohn Marino 
16*86d7f5d3SJohn Marino 	l64a_r(value, buf, sizeof(buf));
17*86d7f5d3SJohn Marino 	return (buf);
18*86d7f5d3SJohn Marino }
19*86d7f5d3SJohn Marino 
20*86d7f5d3SJohn Marino int
l64a_r(long value,char * buffer,int buflen)21*86d7f5d3SJohn Marino l64a_r(long value, char *buffer, int buflen)
22*86d7f5d3SJohn Marino {
23*86d7f5d3SJohn Marino 	long v;
24*86d7f5d3SJohn Marino 	int digit;
25*86d7f5d3SJohn Marino 
26*86d7f5d3SJohn Marino 	v = value & (long)0xffffffff;
27*86d7f5d3SJohn Marino 	for (; v != 0 && buflen > 1; buffer++, buflen--) {
28*86d7f5d3SJohn Marino 		digit = v & 0x3f;
29*86d7f5d3SJohn Marino 		if (digit < 2)
30*86d7f5d3SJohn Marino 			*buffer = digit + '.';
31*86d7f5d3SJohn Marino 		else if (digit < 12)
32*86d7f5d3SJohn Marino 			*buffer = digit + '0' - 2;
33*86d7f5d3SJohn Marino 		else if (digit < 38)
34*86d7f5d3SJohn Marino 			*buffer = digit + 'A' - 12;
35*86d7f5d3SJohn Marino 		else
36*86d7f5d3SJohn Marino 			*buffer = digit + 'a' - 38;
37*86d7f5d3SJohn Marino 		v >>= 6;
38*86d7f5d3SJohn Marino 	}
39*86d7f5d3SJohn Marino 	return (v == 0 ? 0 : -1);
40*86d7f5d3SJohn Marino }
41