1/* $NetBSD: l64a.c,v 1.13 2003/07/26 19:24:54 salo Exp $ */ 2 3/* 4 * Written by J.T. Conklin <jtc@NetBSD.org>. 5 * Public domain. 6 */ 7 8#include <sys/cdefs.h> 9#if defined(LIBC_SCCS) && !defined(lint) 10__RCSID("$NetBSD: l64a.c,v 1.13 2003/07/26 19:24:54 salo Exp $"); 11#endif 12 13#include "namespace.h" 14 15#include <assert.h> 16#include <errno.h> 17#include <stdlib.h> 18 19#ifdef __weak_alias 20__weak_alias(l64a,_l64a) 21__weak_alias(l64a_r,_l64a_r) 22#endif 23 24char * 25l64a(long value) 26{ 27 static char buf[8]; 28 29 (void)l64a_r(value, buf, (int)sizeof (buf)); 30 return buf; 31} 32 33int 34l64a_r(long value, char *buffer, int buflen) 35{ 36 char *s = buffer; 37 int digit; 38 unsigned long v = value; 39 40 _DIAGASSERT(buffer != NULL); 41 42 if (value == 0UL) 43 goto out; 44 45 for (; v != 0 && buflen > 1; s++, buflen--) { 46 digit = (int)(v & 0x3f); 47 48 if (digit < 2) 49 *s = digit + '.'; 50 else if (digit < 12) 51 *s = digit + '0' - 2; 52 else if (digit < 38) 53 *s = digit + 'A' - 12; 54 else 55 *s = digit + 'a' - 38; 56 v >>= 6; 57 } 58 59out: 60 *s = '\0'; 61 62 return (v == 0UL ? 0 : -1); 63} 64