]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - lib/libc/stdlib/l64a.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / lib / libc / stdlib / l64a.c
1 /*
2  * Written by J.T. Conklin <jtc@NetBSD.org>.
3  * Public domain.
4  */
5
6 #if 0
7 #if defined(LIBC_SCCS) && !defined(lint)
8 __RCSID("$NetBSD: l64a.c,v 1.13 2003/07/26 19:24:54 salo Exp $");
9 #endif /* not lint */
10 #endif
11
12 #include <sys/cdefs.h>
13 __FBSDID("$FreeBSD$");
14
15 #include <stdlib.h>
16
17 #define ADOT    46              /* ASCII '.' */
18 #define ASLASH  ADOT + 1        /* ASCII '/' */
19 #define A0      48              /* ASCII '0' */
20 #define AA      65              /* ASCII 'A' */
21 #define Aa      97              /* ASCII 'a' */
22
23 char *
24 l64a(long value)
25 {
26         static char buf[8];
27
28         (void)l64a_r(value, buf, sizeof(buf));
29         return (buf);
30 }
31
32 int
33 l64a_r(long value, char *buffer, int buflen)
34 {
35         long v;
36         int digit;
37
38         v = value & (long)0xffffffff;
39         for (; v != 0 && buflen > 1; buffer++, buflen--) {
40                 digit = v & 0x3f;
41                 if (digit < 2)
42                         *buffer = digit + ADOT;
43                 else if (digit < 12)
44                         *buffer = digit + A0 - 2;
45                 else if (digit < 38)
46                         *buffer = digit + AA - 12;
47                 else
48                         *buffer = digit + Aa - 38;
49                 v >>= 6;
50         }
51         return (v == 0 ? 0 : -1);
52 }