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: l64a.c,v 1.13 2003/07/26 19:24:54 salo Exp $"); 9153707Strhodes#endif /* not lint */ 10153707Strhodes#endif 11153707Strhodes 12153707Strhodes#include <sys/cdefs.h> 13153707Strhodes__FBSDID("$FreeBSD$"); 14153707Strhodes 15153707Strhodes#include <stdlib.h> 16153707Strhodes 17153707Strhodes#define ADOT 46 /* ASCII '.' */ 18153707Strhodes#define ASLASH ADOT + 1 /* ASCII '/' */ 19153707Strhodes#define A0 48 /* ASCII '0' */ 20153707Strhodes#define AA 65 /* ASCII 'A' */ 21153707Strhodes#define Aa 97 /* ASCII 'a' */ 22153707Strhodes 23153707Strhodeschar * 24153707Strhodesl64a(long value) 25153707Strhodes{ 26153707Strhodes static char buf[8]; 27153707Strhodes 28153707Strhodes (void)l64a_r(value, buf, sizeof(buf)); 29153707Strhodes return (buf); 30153707Strhodes} 31153707Strhodes 32153707Strhodesint 33153707Strhodesl64a_r(long value, char *buffer, int buflen) 34153707Strhodes{ 35153707Strhodes long v; 36153707Strhodes int digit; 37153707Strhodes 38153707Strhodes v = value & (long)0xffffffff; 39153707Strhodes for (; v != 0 && buflen > 1; buffer++, buflen--) { 40153707Strhodes digit = v & 0x3f; 41153707Strhodes if (digit < 2) 42153707Strhodes *buffer = digit + ADOT; 43153707Strhodes else if (digit < 12) 44153707Strhodes *buffer = digit + A0 - 2; 45153707Strhodes else if (digit < 38) 46153707Strhodes *buffer = digit + AA - 12; 47153707Strhodes else 48153707Strhodes *buffer = digit + Aa - 38; 49153707Strhodes v >>= 6; 50153707Strhodes } 51153707Strhodes return (v == 0 ? 0 : -1); 52153707Strhodes} 53