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