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