xref: /openbsd-src/lib/libc/stdlib/l64a.c (revision c2c925dec2134a12f472359f2a189e9a312dd721)
1*c2c925deSespie /*	$OpenBSD: l64a.c,v 1.5 2005/08/08 08:05:36 espie Exp $ */
2df930be7Sderaadt /*
3df930be7Sderaadt  * Written by J.T. Conklin <jtc@netbsd.org>.
4df930be7Sderaadt  * Public domain.
5df930be7Sderaadt  */
6df930be7Sderaadt 
7a8eb249eSmillert #include <errno.h>
8df930be7Sderaadt #include <stdlib.h>
9df930be7Sderaadt 
10df930be7Sderaadt char *
l64a(long value)11d8bc04e4Spat l64a(long value)
12df930be7Sderaadt {
13df930be7Sderaadt 	static char buf[8];
14df930be7Sderaadt 	char *s = buf;
15df930be7Sderaadt 	int digit;
16df930be7Sderaadt 	int i;
17df930be7Sderaadt 
18a8eb249eSmillert 	if (value < 0) {
19a8eb249eSmillert 		errno = EINVAL;
20a8eb249eSmillert 		return(NULL);
21a8eb249eSmillert 	}
22df930be7Sderaadt 
23df930be7Sderaadt 	for (i = 0; value != 0 && i < 6; i++) {
24df930be7Sderaadt 		digit = value & 0x3f;
25df930be7Sderaadt 
26df930be7Sderaadt 		if (digit < 2)
27df930be7Sderaadt 			*s = digit + '.';
28df930be7Sderaadt 		else if (digit < 12)
29df930be7Sderaadt 			*s = digit + '0' - 2;
30df930be7Sderaadt 		else if (digit < 38)
31df930be7Sderaadt 			*s = digit + 'A' - 12;
32df930be7Sderaadt 		else
33df930be7Sderaadt 			*s = digit + 'a' - 38;
34df930be7Sderaadt 
35df930be7Sderaadt 		value >>= 6;
36df930be7Sderaadt 		s++;
37df930be7Sderaadt 	}
38df930be7Sderaadt 
39df930be7Sderaadt 	*s = '\0';
40df930be7Sderaadt 
41a8eb249eSmillert 	return(buf);
42df930be7Sderaadt }
43