l64a.c revision 1.10
11.10Slukem/* $NetBSD: l64a.c,v 1.10 1999/09/16 11:45:34 lukem Exp $ */ 21.9Skleink 31.1Sjtc/* 41.4Sjtc * Written by J.T. Conklin <jtc@netbsd.org>. 51.4Sjtc * Public domain. 61.1Sjtc */ 71.1Sjtc 81.5Schristos#include <sys/cdefs.h> 91.1Sjtc#if defined(LIBC_SCCS) && !defined(lint) 101.10Slukem__RCSID("$NetBSD: l64a.c,v 1.10 1999/09/16 11:45:34 lukem Exp $"); 111.1Sjtc#endif 121.1Sjtc 131.6Sjtc#include "namespace.h" 141.10Slukem 151.10Slukem#include <assert.h> 161.10Slukem#include <errno.h> 171.1Sjtc#include <stdlib.h> 181.6Sjtc 191.6Sjtc#ifdef __weak_alias 201.6Sjtc__weak_alias(l64a,_l64a); 211.9Skleink__weak_alias(l64a_r,_l64a_r); 221.6Sjtc#endif 231.1Sjtc 241.1Sjtcchar * 251.1Sjtcl64a (value) 261.1Sjtc long value; 271.1Sjtc{ 281.1Sjtc static char buf[8]; 291.9Skleink 301.9Skleink (void)l64a_r(value, buf, sizeof (buf)); 311.9Skleink return buf; 321.9Skleink} 331.9Skleink 341.9Skleinkint 351.9Skleinkl64a_r (value, buffer, buflen) 361.9Skleink long value; 371.9Skleink char *buffer; 381.9Skleink int buflen; 391.9Skleink{ 401.9Skleink char *s = buffer; 411.1Sjtc int digit; 421.8Schristos unsigned long v = value; 431.10Slukem 441.10Slukem _DIAGASSERT(buffer != NULL); 451.10Slukem#ifdef _DIAGNOSTIC 461.10Slukem if (buffer == NULL) { 471.10Slukem errno = EFAULT; 481.10Slukem return (-1); 491.10Slukem } 501.10Slukem#endif 511.1Sjtc 521.9Skleink if (value == 0UL) 531.7Skleink goto out; 541.1Sjtc 551.9Skleink for (; v != 0 && buflen > 1; s++, buflen--) { 561.8Schristos digit = (int)(v & 0x3f); 571.1Sjtc 581.1Sjtc if (digit < 2) 591.1Sjtc *s = digit + '.'; 601.1Sjtc else if (digit < 12) 611.1Sjtc *s = digit + '0' - 2; 621.1Sjtc else if (digit < 38) 631.1Sjtc *s = digit + 'A' - 12; 641.1Sjtc else 651.1Sjtc *s = digit + 'a' - 38; 661.8Schristos v >>= 6; 671.1Sjtc } 681.1Sjtc 691.7Skleinkout: 701.1Sjtc *s = '\0'; 711.1Sjtc 721.9Skleink return (v == 0UL ? 0 : -1); 731.1Sjtc} 74