1*f14fb602SLionel Sambuc /* $NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos Exp $ */
22fe8fb19SBen Gras
32fe8fb19SBen Gras /*
42fe8fb19SBen Gras * Written by J.T. Conklin <jtc@NetBSD.org>.
52fe8fb19SBen Gras * Public domain.
62fe8fb19SBen Gras */
72fe8fb19SBen Gras
82fe8fb19SBen Gras #include <sys/cdefs.h>
92fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint)
10*f14fb602SLionel Sambuc __RCSID("$NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos Exp $");
112fe8fb19SBen Gras #endif
122fe8fb19SBen Gras
132fe8fb19SBen Gras #include "namespace.h"
142fe8fb19SBen Gras
152fe8fb19SBen Gras #include <assert.h>
162fe8fb19SBen Gras #include <errno.h>
172fe8fb19SBen Gras #include <stdlib.h>
182fe8fb19SBen Gras
192fe8fb19SBen Gras #ifdef __weak_alias
__weak_alias(l64a,_l64a)202fe8fb19SBen Gras __weak_alias(l64a,_l64a)
212fe8fb19SBen Gras __weak_alias(l64a_r,_l64a_r)
222fe8fb19SBen Gras #endif
232fe8fb19SBen Gras
242fe8fb19SBen Gras char *
25*f14fb602SLionel Sambuc l64a(long value)
262fe8fb19SBen Gras {
272fe8fb19SBen Gras static char buf[8];
282fe8fb19SBen Gras
29*f14fb602SLionel Sambuc (void)l64a_r(value, buf, (int)sizeof (buf));
302fe8fb19SBen Gras return buf;
312fe8fb19SBen Gras }
322fe8fb19SBen Gras
332fe8fb19SBen Gras int
l64a_r(long value,char * buffer,int buflen)34*f14fb602SLionel Sambuc l64a_r(long value, char *buffer, int buflen)
352fe8fb19SBen Gras {
362fe8fb19SBen Gras char *s = buffer;
372fe8fb19SBen Gras int digit;
382fe8fb19SBen Gras unsigned long v = value;
392fe8fb19SBen Gras
402fe8fb19SBen Gras _DIAGASSERT(buffer != NULL);
412fe8fb19SBen Gras
422fe8fb19SBen Gras if (value == 0UL)
432fe8fb19SBen Gras goto out;
442fe8fb19SBen Gras
452fe8fb19SBen Gras for (; v != 0 && buflen > 1; s++, buflen--) {
462fe8fb19SBen Gras digit = (int)(v & 0x3f);
472fe8fb19SBen Gras
482fe8fb19SBen Gras if (digit < 2)
492fe8fb19SBen Gras *s = digit + '.';
502fe8fb19SBen Gras else if (digit < 12)
512fe8fb19SBen Gras *s = digit + '0' - 2;
522fe8fb19SBen Gras else if (digit < 38)
532fe8fb19SBen Gras *s = digit + 'A' - 12;
542fe8fb19SBen Gras else
552fe8fb19SBen Gras *s = digit + 'a' - 38;
562fe8fb19SBen Gras v >>= 6;
572fe8fb19SBen Gras }
582fe8fb19SBen Gras
592fe8fb19SBen Gras out:
602fe8fb19SBen Gras *s = '\0';
612fe8fb19SBen Gras
622fe8fb19SBen Gras return (v == 0UL ? 0 : -1);
632fe8fb19SBen Gras }
64