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