1153707Strhodes/*
2153707Strhodes * Written by J.T. Conklin <jtc@NetBSD.org>.
3153707Strhodes * Public domain.
4153707Strhodes */
5153707Strhodes
6153707Strhodes#if 0
7153707Strhodes#if defined(LIBC_SCCS) && !defined(lint)
8153707Strhodes__RCSID("$NetBSD: l64a.c,v 1.13 2003/07/26 19:24:54 salo Exp $");
9153707Strhodes#endif /* not lint */
10153707Strhodes#endif
11153707Strhodes
12153707Strhodes#include <sys/cdefs.h>
13153707Strhodes__FBSDID("$FreeBSD$");
14153707Strhodes
15153707Strhodes#include <stdlib.h>
16153707Strhodes
17153707Strhodes#define	ADOT	46		/* ASCII '.' */
18153707Strhodes#define	ASLASH	ADOT + 1	/* ASCII '/' */
19153707Strhodes#define	A0	48		/* ASCII '0' */
20153707Strhodes#define	AA	65		/* ASCII 'A' */
21153707Strhodes#define	Aa	97		/* ASCII 'a' */
22153707Strhodes
23153707Strhodeschar *
24153707Strhodesl64a(long value)
25153707Strhodes{
26153707Strhodes	static char buf[8];
27153707Strhodes
28153707Strhodes	(void)l64a_r(value, buf, sizeof(buf));
29153707Strhodes	return (buf);
30153707Strhodes}
31153707Strhodes
32153707Strhodesint
33153707Strhodesl64a_r(long value, char *buffer, int buflen)
34153707Strhodes{
35153707Strhodes	long v;
36153707Strhodes	int digit;
37153707Strhodes
38153707Strhodes	v = value & (long)0xffffffff;
39153707Strhodes	for (; v != 0 && buflen > 1; buffer++, buflen--) {
40153707Strhodes		digit = v & 0x3f;
41153707Strhodes		if (digit < 2)
42153707Strhodes			*buffer = digit + ADOT;
43153707Strhodes		else if (digit < 12)
44153707Strhodes			*buffer = digit + A0 - 2;
45153707Strhodes		else if (digit < 38)
46153707Strhodes			*buffer = digit + AA - 12;
47153707Strhodes		else
48153707Strhodes			*buffer = digit + Aa - 38;
49153707Strhodes		v >>= 6;
50153707Strhodes	}
51153707Strhodes	return (v == 0 ? 0 : -1);
52153707Strhodes}
53