xref: /minix3/lib/libc/stdlib/l64a.c (revision f14fb602092e015ff630df58e17c2a9cd57d29b3)
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