1/* $OpenBSD: a64l.c,v 1.5 2005/08/08 08:05:36 espie Exp $ */ 2/* 3 * Written by J.T. Conklin <jtc@netbsd.org>. 4 * Public domain. 5 */ 6 7#include <errno.h> 8#include <stdlib.h> 9 10long 11a64l(const char *s) 12{ 13 long value, digit, shift; 14 int i; 15 16 if (s == NULL) { 17 errno = EINVAL; 18 return(-1L); 19 } 20 21 value = 0; 22 shift = 0; 23 for (i = 0; *s && i < 6; i++, s++) { 24 if (*s >= '.' && *s <= '/') 25 digit = *s - '.'; 26 else if (*s >= '0' && *s <= '9') 27 digit = *s - '0' + 2; 28 else if (*s >= 'A' && *s <= 'Z') 29 digit = *s - 'A' + 12; 30 else if (*s >= 'a' && *s <= 'z') 31 digit = *s - 'a' + 38; 32 else { 33 errno = EINVAL; 34 return(-1L); 35 } 36 37 value |= digit << shift; 38 shift += 6; 39 } 40 41 return(value); 42} 43