diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | intern.h | 3 | ||||
-rw-r--r-- | missing/vsnprintf.c | 68 | ||||
-rw-r--r-- | node.h | 2 |
4 files changed, 79 insertions, 3 deletions
@@ -1,3 +1,12 @@ +Tue Jul 18 15:19:07 2006 NAKAMURA Usaku <usa@ruby-lang.org> + + * 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] + Tue Jul 18 14:38:40 2006 Yukihiro Matsumoto <matz@ruby-lang.org> * process.c (rb_f_system): call rb_sys_fail(0) if rb_last_status @@ -20,6 +20,7 @@ #else # include <varargs.h> #endif +#include <st.h> /* * Functions and variables that are used by more than one source file of @@ -314,7 +315,7 @@ VALUE rb_gc_enable(void); VALUE rb_gc_disable(void); VALUE rb_gc_start(void); /* hash.c */ -void st_foreach_safe(struct st_table *, int (*)(ANYARGS), unsigned long); +void st_foreach_safe(struct st_table *, int (*)(ANYARGS), st_data_t); void rb_hash_foreach(VALUE, int (*)(ANYARGS), VALUE); VALUE rb_hash(VALUE); VALUE rb_hash_new(void); 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_ */ @@ -166,7 +166,7 @@ typedef struct RNode { RNODE(n)->flags=((RNODE(n)->flags&~NODE_TYPEMASK)|(((t)<<NODE_TYPESHIFT)&NODE_TYPEMASK)) #define NODE_LSHIFT (NODE_TYPESHIFT+7) -#define NODE_LMASK (((long)1<<(sizeof(NODE*)*CHAR_BIT-NODE_LSHIFT))-1) +#define NODE_LMASK (((VALUE)1<<(sizeof(NODE*)*CHAR_BIT-NODE_LSHIFT))-1) #define nd_line(n) ((unsigned int)(((RNODE(n))->flags>>NODE_LSHIFT)&NODE_LMASK)) #define nd_set_line(n,l) \ RNODE(n)->flags=((RNODE(n)->flags&~(-1<<NODE_LSHIFT))|(((l)&NODE_LMASK)<<NODE_LSHIFT)) |