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