11.14Schristos/* $NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos Exp $ */ 21.9Skleink 31.1Sjtc/* 41.13Ssalo * 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.14Schristos__RCSID("$NetBSD: l64a.c,v 1.14 2012/03/13 21:13:48 christos 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.12Smycroft__weak_alias(l64a,_l64a) 211.12Smycroft__weak_alias(l64a_r,_l64a_r) 221.6Sjtc#endif 231.1Sjtc 241.1Sjtcchar * 251.14Schristosl64a(long value) 261.1Sjtc{ 271.1Sjtc static char buf[8]; 281.9Skleink 291.14Schristos (void)l64a_r(value, buf, (int)sizeof (buf)); 301.9Skleink return buf; 311.9Skleink} 321.9Skleink 331.9Skleinkint 341.14Schristosl64a_r(long value, char *buffer, int buflen) 351.9Skleink{ 361.9Skleink char *s = buffer; 371.1Sjtc int digit; 381.8Schristos unsigned long v = value; 391.10Slukem 401.10Slukem _DIAGASSERT(buffer != NULL); 411.1Sjtc 421.9Skleink if (value == 0UL) 431.7Skleink goto out; 441.1Sjtc 451.9Skleink for (; v != 0 && buflen > 1; s++, buflen--) { 461.8Schristos digit = (int)(v & 0x3f); 471.1Sjtc 481.1Sjtc if (digit < 2) 491.1Sjtc *s = digit + '.'; 501.1Sjtc else if (digit < 12) 511.1Sjtc *s = digit + '0' - 2; 521.1Sjtc else if (digit < 38) 531.1Sjtc *s = digit + 'A' - 12; 541.1Sjtc else 551.1Sjtc *s = digit + 'a' - 38; 561.8Schristos v >>= 6; 571.1Sjtc } 581.1Sjtc 591.7Skleinkout: 601.1Sjtc *s = '\0'; 611.1Sjtc 621.9Skleink return (v == 0UL ? 0 : -1); 631.1Sjtc} 64