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  | 
     | 
     | 
     | 
    
    
    10  | 
     | 
     | 
    long  | 
    
    
    11  | 
     | 
     | 
    a64l(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  | 
     | 
     | 
    }  |