summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-18 06:22:28 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-18 06:22:28 +0000
commit9d6e1cdb73e59ac188fa10a35cbc8a11f1d2a4d7 (patch)
treedd396cbf8cf1ddda56b0f938ca19578f6282e1de
parentddbebabd25dd8031bda5e31f061b89433c72b9e3 (diff)
* 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
-rw-r--r--ChangeLog9
-rw-r--r--intern.h3
-rw-r--r--missing/vsnprintf.c68
-rw-r--r--node.h2
4 files changed, 79 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index ab15aa2e60..f7771ba330 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/intern.h b/intern.h
index e393e0b940..04fbf7f113 100644
--- a/intern.h
+++ b/intern.h
@@ -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_ */
diff --git a/node.h b/node.h
index c51753ad6f..7d8f6fcc9a 100644
--- a/node.h
+++ b/node.h
@@ -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))