1153707Strhodes/*- 2153707Strhodes * Written by J.T. Conklin <jtc@netbsd.org>. 3153707Strhodes * Public domain. 4153707Strhodes */ 5153707Strhodes 6153707Strhodes#if 0 7153707Strhodes#if defined(LIBC_SCCS) && !defined(lint) 8153707Strhodes__RCSID("$NetBSD: a64l.c,v 1.8 2000/01/22 22:19:19 mycroft Exp $"); 9153707Strhodes#endif /* not lint */ 10153707Strhodes#endif 11153707Strhodes 12153707Strhodes#include <sys/cdefs.h> 13153707Strhodes__FBSDID("$FreeBSD$"); 14153707Strhodes 15153707Strhodes#include <stdlib.h> 16153707Strhodes#include <inttypes.h> 17153707Strhodes 18153707Strhodes#define ADOT 46 /* ASCII '.' */ 19158749Sjkim#define ASLASH 47 /* ASCII '/' */ 20153707Strhodes#define A0 48 /* ASCII '0' */ 21153707Strhodes#define AA 65 /* ASCII 'A' */ 22153707Strhodes#define Aa 97 /* ASCII 'a' */ 23153707Strhodes 24153707Strhodeslong 25153707Strhodesa64l(const char *s) 26153707Strhodes{ 27153707Strhodes long shift; 28153707Strhodes int digit, i, value; 29153707Strhodes 30153707Strhodes value = 0; 31153707Strhodes shift = 0; 32153707Strhodes for (i = 0; *s != '\0' && i < 6; i++, s++) { 33153707Strhodes if (*s <= ASLASH) 34153707Strhodes digit = *s - ASLASH + 1; 35153707Strhodes else if (*s <= A0 + 9) 36153707Strhodes digit = *s - A0 + 2; 37153707Strhodes else if (*s <= AA + 25) 38153707Strhodes digit = *s - AA + 12; 39153707Strhodes else 40153707Strhodes digit = *s - Aa + 38; 41153707Strhodes 42153707Strhodes value |= digit << shift; 43153707Strhodes shift += 6; 44153707Strhodes } 45153707Strhodes return (value); 46153707Strhodes} 47