xref: /minix3/lib/libc/stdlib/a64l.c (revision f14fb602092e015ff630df58e17c2a9cd57d29b3)
12fe8fb19SBen Gras /*
22fe8fb19SBen Gras  * Written by J.T. Conklin <jtc@NetBSD.org>.
32fe8fb19SBen Gras  * Public domain.
42fe8fb19SBen Gras  */
52fe8fb19SBen Gras 
62fe8fb19SBen Gras #include <sys/cdefs.h>
72fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint)
8*f14fb602SLionel Sambuc __RCSID("$NetBSD: a64l.c,v 1.10 2012/06/08 11:15:26 abs Exp $");
92fe8fb19SBen Gras #endif
102fe8fb19SBen Gras 
112fe8fb19SBen Gras #include "namespace.h"
122fe8fb19SBen Gras 
132fe8fb19SBen Gras #include <assert.h>
142fe8fb19SBen Gras #include <stdlib.h>
152fe8fb19SBen Gras 
162fe8fb19SBen Gras #ifdef __weak_alias
__weak_alias(a64l,_a64l)172fe8fb19SBen Gras __weak_alias(a64l,_a64l)
182fe8fb19SBen Gras #endif
192fe8fb19SBen Gras 
202fe8fb19SBen Gras long
21*f14fb602SLionel Sambuc a64l(const char *s)
222fe8fb19SBen Gras {
232fe8fb19SBen Gras 	long value, digit, shift;
242fe8fb19SBen Gras 	int i;
252fe8fb19SBen Gras 
262fe8fb19SBen Gras 	_DIAGASSERT(s != NULL);
272fe8fb19SBen Gras 
282fe8fb19SBen Gras 	value = 0;
292fe8fb19SBen Gras 	shift = 0;
302fe8fb19SBen Gras 	for (i = 0; *s && i < 6; i++, s++) {
312fe8fb19SBen Gras 		if (*s <= '/')
322fe8fb19SBen Gras 			digit = *s - '.';
332fe8fb19SBen Gras 		else if (*s <= '9')
342fe8fb19SBen Gras 			digit = *s - '0' + 2;
352fe8fb19SBen Gras 		else if (*s <= 'Z')
362fe8fb19SBen Gras 			digit = *s - 'A' + 12;
372fe8fb19SBen Gras 		else
382fe8fb19SBen Gras 			digit = *s - 'a' + 38;
392fe8fb19SBen Gras 
402fe8fb19SBen Gras 		value |= digit << shift;
412fe8fb19SBen Gras 		shift += 6;
422fe8fb19SBen Gras 	}
432fe8fb19SBen Gras 
442fe8fb19SBen Gras 	return (long) value;
452fe8fb19SBen Gras }
46