xref: /netbsd-src/lib/libc/stdlib/l64a.c (revision c5e820cae412164fcbee52f470436200af5358ea)
1*c5e820caSchristos /*	$NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos Exp $	*/
2e2b924d2Skleink 
31f10b502Sjtc /*
499410184Ssalo  * Written by J.T. Conklin <jtc@NetBSD.org>.
59ae90685Sjtc  * Public domain.
61f10b502Sjtc  */
71f10b502Sjtc 
8bd906777Schristos #include <sys/cdefs.h>
91f10b502Sjtc #if defined(LIBC_SCCS) && !defined(lint)
10*c5e820caSchristos __RCSID("$NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos Exp $");
111f10b502Sjtc #endif
121f10b502Sjtc 
1343fa6fe3Sjtc #include "namespace.h"
14b48252f3Slukem 
15b48252f3Slukem #include <assert.h>
16b48252f3Slukem #include <errno.h>
171f10b502Sjtc #include <stdlib.h>
181f10b502Sjtc 
1943fa6fe3Sjtc #ifdef __weak_alias
__weak_alias(l64a,_l64a)2060549036Smycroft __weak_alias(l64a,_l64a)
2160549036Smycroft __weak_alias(l64a_r,_l64a_r)
2243fa6fe3Sjtc #endif
2343fa6fe3Sjtc 
241f10b502Sjtc char *
25*c5e820caSchristos l64a(long value)
261f10b502Sjtc {
271f10b502Sjtc 	static char buf[8];
28e2b924d2Skleink 
29*c5e820caSchristos 	(void)l64a_r(value, buf, (int)sizeof (buf));
30e2b924d2Skleink 	return buf;
31e2b924d2Skleink }
32e2b924d2Skleink 
33e2b924d2Skleink int
l64a_r(long value,char * buffer,int buflen)34*c5e820caSchristos l64a_r(long value, char *buffer, int buflen)
35e2b924d2Skleink {
36e2b924d2Skleink 	char *s = buffer;
371f10b502Sjtc 	int digit;
3833edc15aSchristos 	unsigned long v = value;
391f10b502Sjtc 
40b48252f3Slukem 	_DIAGASSERT(buffer != NULL);
41b48252f3Slukem 
42e2b924d2Skleink 	if (value == 0UL)
43d4cc8682Skleink 		goto out;
441f10b502Sjtc 
45e2b924d2Skleink 	for (; v != 0 && buflen > 1; s++, buflen--) {
4633edc15aSchristos 		digit = (int)(v & 0x3f);
471f10b502Sjtc 
481f10b502Sjtc 		if (digit < 2)
491f10b502Sjtc 			*s = digit + '.';
501f10b502Sjtc 		else if (digit < 12)
511f10b502Sjtc 			*s = digit + '0' - 2;
521f10b502Sjtc 		else if (digit < 38)
531f10b502Sjtc 			*s = digit + 'A' - 12;
541f10b502Sjtc 		else
551f10b502Sjtc 			*s = digit + 'a' - 38;
5633edc15aSchristos 		v >>= 6;
571f10b502Sjtc 	}
581f10b502Sjtc 
59d4cc8682Skleink out:
601f10b502Sjtc 	*s = '\0';
611f10b502Sjtc 
62e2b924d2Skleink 	return (v == 0UL ? 0 : -1);
631f10b502Sjtc }
64