summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--pack.c41
-rw-r--r--sprintf.c14
3 files changed, 55 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 5ce764d..2f49f75 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Fri Nov 22 22:55:01 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * sprintf.c (rb_f_sprintf): preceding ".." for negative
+ hexadecimal numbers should not appear if prec (e.g. %.4) is
+ specified.
+
+ * pack.c (NUM2I32): support platforms which does not have 32bit
+ integers (e.g. Cray).
+
Fri Nov 22 19:20:36 2002 Akinori MUSHA <knu@iDaemons.org>
* instruby.rb: Install batch files on Windows. [Submitted by usa]
diff --git a/pack.c b/pack.c
index 0ec3741..a880083 100644
--- a/pack.c
+++ b/pack.c
@@ -309,11 +309,46 @@ typedef long I32;
typedef unsigned long U32;
#define NUM2I32(x) NUM2LONG(x)
#define NUM2U32(x) NUM2ULONG(x)
-#elif SIZEOF_INT == SIZE32
+#else
typedef int I32;
typedef unsigned int U32;
-#define NUM2I32(x) NUM2INT(x)
-#define NUM2U32(x) NUM2UINT(x)
+# if SIZEOF_INT == SIZE32
+# define NUM2I32(x) NUM2INT(x)
+# define NUM2U32(x) NUM2UINT(x)
+# else
+
+#define I32_MAX 2147483647
+#define I32_MIN (-I32_MAX-1)
+
+static I32
+num2i32(x)
+ VALUE x;
+{
+ long num = NUM2LONG(x);
+
+ if (num < I32_MIN || I32_MAX < num) {
+ rb_raise(rb_eRangeError, "integer %ld too big to convert to `I32'", num);
+ }
+ return (I32)num;
+}
+
+#define U32_MAX 4294967295
+
+static U32
+num2u32(x)
+ VALUE x;
+{
+ unsigned long num = NUM2ULONG(x);
+
+ if (U32_MAX < num) {
+ rb_raise(rb_eRangeError, "integer %ld too big to convert to `U32'", num);
+ }
+ return (U32)num;
+}
+
+# define NUM2I32(x) num2i32(x)
+# define NUM2U32(x) num2u32(x)
+# endif
#endif
#ifdef HAVE_LONG_LONG
diff --git a/sprintf.c b/sprintf.c
index 190af52..f5e9542 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -404,7 +404,7 @@ rb_f_sprintf(argc, argv)
if (base == 10) {
rb_warning("negative number for %%u specifier");
}
- else {
+ else if (!(flags&FPREC)) {
strcpy(s, "..");
s += 2;
}
@@ -463,8 +463,10 @@ rb_f_sprintf(argc, argv)
remove_sign_bits(++s, base);
val = rb_str_new(0, 3+strlen(s));
t = RSTRING(val)->ptr;
- strcpy(t, "..");
- t += 2;
+ if (!(flags&FPREC)) {
+ strcpy(t, "..");
+ t += 2;
+ }
switch (base) {
case 16:
if (s[0] != 'f') strcpy(t++, "f"); break;
@@ -492,7 +494,7 @@ rb_f_sprintf(argc, argv)
}
if (prec < len) prec = len;
width -= prec;
- if (!(flags&(FZERO|FMINUS)) && s[0] != '.') {
+ if (!(flags&(FZERO|FMINUS)) && v >= 0) {
CHECK(width);
while (width-->0) {
buf[blen++] = ' ';
@@ -507,7 +509,7 @@ rb_f_sprintf(argc, argv)
if (!(flags & FMINUS)) {
char c = ' ';
- if (s[0] == '.') {
+ if (v < 0) {
c = '.';
if ((flags & FPREC) && prec > len) {
pos = blen;
@@ -524,7 +526,7 @@ rb_f_sprintf(argc, argv)
}
CHECK(prec - len);
while (len < prec--) {
- buf[blen++] = s[0]=='.'?'.':'0';
+ buf[blen++] = v < 0 ? '.' : '0';
}
PUSH(s, len);
CHECK(width);