xref: /dragonfly/lib/libc/stdlib/a64l.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1 /*-
2  * Written by J.T. Conklin <jtc@netbsd.org>.
3  * Public domain.
4  *
5  * $NetBSD: a64l.c,v 1.8 2000/01/22 22:19:19 mycroft Exp $
6  * $FreeBSD: src/lib/libc/stdlib/a64l.c,v 1.2 2006/05/19 19:06:38 jkim Exp $
7  */
8 
9 #include <stdlib.h>
10 #include <inttypes.h>
11 
12 long
a64l(const char * s)13 a64l(const char *s)
14 {
15           long shift;
16           int digit, i, value;
17 
18           value = 0;
19           shift = 0;
20           for (i = 0; *s != '\0' && i < 6; i++, s++) {
21                     if (*s <= '/')
22                               digit = *s - '/' + 1;
23                     else if (*s <= '0' + 9)
24                               digit = *s - '0' + 2;
25                     else if (*s <= 'A' + 25)
26                               digit = *s - 'A' + 12;
27                     else
28                               digit = *s - 'a' + 38;
29 
30                     value |= digit << shift;
31                     shift += 6;
32           }
33           return (value);
34 }
35