From 9d6e1cdb73e59ac188fa10a35cbc8a11f1d2a4d7 Mon Sep 17 00:00:00 2001 From: usa Date: Tue, 18 Jul 2006 06:22:28 +0000 Subject: * intern.h (st_foreach_safe): fix prototype. * node.h (NODE_LMASK): bigger than long on LLP64. * missing/vsnprintf.c (BSD__uqtoa): new function to support LLP64. all changes are derived from [ruby-dev:29045] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10557 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- missing/vsnprintf.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'missing/vsnprintf.c') diff --git a/missing/vsnprintf.c b/missing/vsnprintf.c index 0cfa5046aa..3c8b76686a 100644 --- a/missing/vsnprintf.c +++ b/missing/vsnprintf.c @@ -349,6 +349,72 @@ BSD__sbprintf(register FILE *fp, const char *fmt, va_list ap) #define is_digit(c) ((unsigned)to_digit(c) <= 9) #define to_char(n) ((n) + '0') +#ifdef _HAVE_SANE_QUAD_ +/* + * Convert an unsigned long long to ASCII for printf purposes, returning + * a pointer to the first character of the string representation. + * Octal numbers can be forced to have a leading zero; hex numbers + * use the given digits. + */ +static char * +BSD__uqtoa(register u_quad_t val, char *endp, int base, int octzero, char *xdigs) +{ + register char *cp = endp; + register long sval; + + /* + * Handle the three cases separately, in the hope of getting + * better/faster code. + */ + switch (base) { + case 10: + if (val < 10) { /* many numbers are 1 digit */ + *--cp = to_char(val); + return (cp); + } + /* + * On many machines, unsigned arithmetic is harder than + * signed arithmetic, so we do at most one unsigned mod and + * divide; this is sufficient to reduce the range of + * the incoming value to where signed arithmetic works. + */ + if (val > LLONG_MAX) { + *--cp = to_char(val % 10); + sval = val / 10; + } else + sval = val; + do { + *--cp = to_char(sval % 10); + sval /= 10; + } while (sval != 0); + break; + + case 8: + do { + *--cp = to_char(val & 7); + val >>= 3; + } while (val); + if (octzero && *cp != '0') + *--cp = '0'; + break; + + case 16: + do { + *--cp = xdigs[val & 15]; + val >>= 4; + } while (val); + break; + + default: /* oops */ + /* + abort(); + */ + break; /* fjc 7-31-97. Don't reference abort() here */ + } + return (cp); +} +#endif /* _HAVE_SANE_QUAD_ */ + /* * Convert an unsigned long to ASCII for printf purposes, returning * a pointer to the first character of the string representation. @@ -867,7 +933,7 @@ number: if ((dprec = prec) >= 0) #ifdef _HAVE_SANE_QUAD_ if (flags & QUADINT) { if (uqval != 0 || prec != 0) - cp = __uqtoa(uqval, cp, base, + cp = BSD__uqtoa(uqval, cp, base, flags & ALT, xdigs); } else { #else /* _HAVE_SANE_QUAD_ */ -- cgit v1.2.3