11.14Schristos/*	$NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos Exp $	*/
21.9Skleink
31.1Sjtc/*
41.13Ssalo * Written by J.T. Conklin <jtc@NetBSD.org>.
51.4Sjtc * Public domain.
61.1Sjtc */
71.1Sjtc
81.5Schristos#include <sys/cdefs.h>
91.1Sjtc#if defined(LIBC_SCCS) && !defined(lint)
101.14Schristos__RCSID("$NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos Exp $");
111.1Sjtc#endif
121.1Sjtc
131.6Sjtc#include "namespace.h"
141.10Slukem
151.10Slukem#include <assert.h>
161.10Slukem#include <errno.h>
171.1Sjtc#include <stdlib.h>
181.6Sjtc
191.6Sjtc#ifdef __weak_alias
201.12Smycroft__weak_alias(l64a,_l64a)
211.12Smycroft__weak_alias(l64a_r,_l64a_r)
221.6Sjtc#endif
231.1Sjtc
241.1Sjtcchar *
251.14Schristosl64a(long value)
261.1Sjtc{
271.1Sjtc	static char buf[8];
281.9Skleink
291.14Schristos	(void)l64a_r(value, buf, (int)sizeof (buf));
301.9Skleink	return buf;
311.9Skleink}
321.9Skleink
331.9Skleinkint
341.14Schristosl64a_r(long value, char *buffer, int buflen)
351.9Skleink{
361.9Skleink	char *s = buffer;
371.1Sjtc	int digit;
381.8Schristos	unsigned long v = value;
391.10Slukem
401.10Slukem	_DIAGASSERT(buffer != NULL);
411.1Sjtc
421.9Skleink	if (value == 0UL)
431.7Skleink		goto out;
441.1Sjtc
451.9Skleink	for (; v != 0 && buflen > 1; s++, buflen--) {
461.8Schristos		digit = (int)(v & 0x3f);
471.1Sjtc
481.1Sjtc		if (digit < 2)
491.1Sjtc			*s = digit + '.';
501.1Sjtc		else if (digit < 12)
511.1Sjtc			*s = digit + '0' - 2;
521.1Sjtc		else if (digit < 38)
531.1Sjtc			*s = digit + 'A' - 12;
541.1Sjtc		else
551.1Sjtc			*s = digit + 'a' - 38;
561.8Schristos		v >>= 6;
571.1Sjtc	}
581.1Sjtc
591.7Skleinkout:
601.1Sjtc	*s = '\0';
611.1Sjtc
621.9Skleink	return (v == 0UL ? 0 : -1);
631.1Sjtc}
64