summaryrefslogtreecommitdiff
path: root/sprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'sprintf.c')
-rw-r--r--sprintf.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/sprintf.c b/sprintf.c
index 2d5f13e372..69f9fa3ff3 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -38,6 +38,7 @@ remove_sign_bits(str, base)
}
}
else if (base == 8) {
+ if (*t == '3') t++;
while (t<end && *t == '7') {
t++;
}
@@ -53,6 +54,26 @@ remove_sign_bits(str, base)
return str;
}
+static char
+sign_bits(base, p)
+ int base;
+ char *p;
+{
+ char c = '.';
+
+ switch (base) {
+ case 16:
+ if (*p == 'X') c = 'F';
+ else c = 'f';
+ break;
+ case 8:
+ c = '7'; break;
+ case 2:
+ c = '1'; break;
+ }
+ return c;
+}
+
#define FNONE 0
#define FSHARP 1
#define FMINUS 2
@@ -529,25 +550,15 @@ rb_f_sprintf(argc, argv)
}
CHECK(prec - len);
if (!bignum && v < 0) {
- char c = '.';
-
- switch (base) {
- case 16:
- if (*p == 'X') c = 'F';
- else c = 'f';
- break;
- case 8:
- c = '7'; break;
- case 2:
- c = '1'; break;
- }
+ char c = sign_bits(base, p);
while (len < prec--) {
buf[blen++] = c;
}
}
else {
+ char c = sign_bits(base, p);
while (len < prec--) {
- buf[blen++] = '0';
+ buf[blen++] = c;
}
}
PUSH(s, len);