* sprintf.c (rb_f_sprintf): clean up.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c87eaa3af2
commit
a7d4955188
@ -1,3 +1,7 @@
|
|||||||
|
Wed Feb 18 10:23:34 2004 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
|
* sprintf.c (rb_f_sprintf): clean up.
|
||||||
|
|
||||||
Tue Feb 17 23:40:34 2004 Guy Decoux <ts@moulon.inra.fr>
|
Tue Feb 17 23:40:34 2004 Guy Decoux <ts@moulon.inra.fr>
|
||||||
|
|
||||||
* sprintf.c (rb_f_sprintf): preserve original val for
|
* sprintf.c (rb_f_sprintf): preserve original val for
|
||||||
|
158
sprintf.c
158
sprintf.c
@ -444,7 +444,6 @@ rb_f_sprintf(argc, argv)
|
|||||||
long v = 0;
|
long v = 0;
|
||||||
int base, bignum = 0;
|
int base, bignum = 0;
|
||||||
int len, pos;
|
int len, pos;
|
||||||
VALUE tmp;
|
|
||||||
|
|
||||||
switch (*p) {
|
switch (*p) {
|
||||||
case 'd':
|
case 'd':
|
||||||
@ -514,6 +513,7 @@ rb_f_sprintf(argc, argv)
|
|||||||
default:
|
default:
|
||||||
base = 10; break;
|
base = 10; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bignum) {
|
if (!bignum) {
|
||||||
if (base == 2) {
|
if (base == 2) {
|
||||||
val = rb_int2big(v);
|
val = rb_int2big(v);
|
||||||
@ -537,92 +537,90 @@ rb_f_sprintf(argc, argv)
|
|||||||
}
|
}
|
||||||
sprintf(fbuf, "%%l%c", c);
|
sprintf(fbuf, "%%l%c", c);
|
||||||
sprintf(nbuf, fbuf, v);
|
sprintf(nbuf, fbuf, v);
|
||||||
s = nbuf;
|
|
||||||
goto format_integer;
|
|
||||||
}
|
|
||||||
s = nbuf;
|
|
||||||
if (v < 0) {
|
|
||||||
if (base == 10) {
|
|
||||||
rb_warning("negative number for %%u specifier");
|
|
||||||
}
|
|
||||||
else if (!(flags&FPREC)) {
|
|
||||||
strcpy(s, "..");
|
|
||||||
s += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sprintf(fbuf, "%%l%c", *p);
|
|
||||||
sprintf(s, fbuf, v);
|
|
||||||
if (v < 0) {
|
|
||||||
char d = 0;
|
|
||||||
|
|
||||||
remove_sign_bits(s, base);
|
|
||||||
switch (base) {
|
|
||||||
case 16:
|
|
||||||
d = 'f'; break;
|
|
||||||
case 8:
|
|
||||||
d = '7'; break;
|
|
||||||
}
|
|
||||||
if (d && *s != d) {
|
|
||||||
memmove(s+1, s, strlen(s)+1);
|
|
||||||
*s = d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s = nbuf;
|
|
||||||
goto format_integer;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sign) {
|
|
||||||
tmp = rb_big2str(val, base);
|
|
||||||
s = RSTRING(tmp)->ptr;
|
|
||||||
if (s[0] == '-') {
|
|
||||||
s++;
|
|
||||||
sc = '-';
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
else if (flags & FPLUS) {
|
|
||||||
sc = '+';
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
else if (flags & FSPACE) {
|
|
||||||
sc = ' ';
|
|
||||||
width--;
|
|
||||||
}
|
|
||||||
goto format_integer;
|
|
||||||
}
|
|
||||||
if (!RBIGNUM(val)->sign) {
|
|
||||||
val = rb_big_clone(val);
|
|
||||||
rb_big_2comp(val);
|
|
||||||
}
|
|
||||||
tmp = rb_big2str(val, base);
|
|
||||||
s = RSTRING(tmp)->ptr;
|
|
||||||
if (*s == '-') {
|
|
||||||
if (base == 10) {
|
|
||||||
rb_warning("negative number for %%u specifier");
|
|
||||||
s++;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
remove_sign_bits(++s, base);
|
s = nbuf;
|
||||||
tmp = rb_str_new(0, 3+strlen(s));
|
if (v < 0) {
|
||||||
t = RSTRING(tmp)->ptr;
|
if (base == 10) {
|
||||||
if (!(flags&FPREC)) {
|
rb_warning("negative number for %%u specifier");
|
||||||
strcpy(t, "..");
|
}
|
||||||
t += 2;
|
else if (!(flags&FPREC)) {
|
||||||
|
strcpy(s, "..");
|
||||||
|
s += 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
switch (base) {
|
sprintf(fbuf, "%%l%c", *p);
|
||||||
case 16:
|
sprintf(s, fbuf, v);
|
||||||
if (s[0] != 'f') strcpy(t++, "f"); break;
|
if (v < 0) {
|
||||||
case 8:
|
char d = 0;
|
||||||
if (s[0] != '7') strcpy(t++, "7"); break;
|
|
||||||
case 2:
|
remove_sign_bits(s, base);
|
||||||
if (s[0] != '1') strcpy(t++, "1"); break;
|
switch (base) {
|
||||||
|
case 16:
|
||||||
|
d = 'f'; break;
|
||||||
|
case 8:
|
||||||
|
d = '7'; break;
|
||||||
|
}
|
||||||
|
if (d && *s != d) {
|
||||||
|
memmove(s+1, s, strlen(s)+1);
|
||||||
|
*s = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s = nbuf;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (sign) {
|
||||||
|
tmp = rb_big2str(val, base);
|
||||||
|
s = RSTRING(tmp)->ptr;
|
||||||
|
if (s[0] == '-') {
|
||||||
|
s++;
|
||||||
|
sc = '-';
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
else if (flags & FPLUS) {
|
||||||
|
sc = '+';
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
else if (flags & FSPACE) {
|
||||||
|
sc = ' ';
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!RBIGNUM(val)->sign) {
|
||||||
|
val = rb_big_clone(val);
|
||||||
|
rb_big_2comp(val);
|
||||||
|
}
|
||||||
|
tmp = rb_big2str(val, base);
|
||||||
|
s = RSTRING(tmp)->ptr;
|
||||||
|
if (*s == '-') {
|
||||||
|
if (base == 10) {
|
||||||
|
rb_warning("negative number for %%u specifier");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
remove_sign_bits(++s, base);
|
||||||
|
tmp = rb_str_new(0, 3+strlen(s));
|
||||||
|
t = RSTRING(tmp)->ptr;
|
||||||
|
if (!(flags&FPREC)) {
|
||||||
|
strcpy(t, "..");
|
||||||
|
t += 2;
|
||||||
|
}
|
||||||
|
switch (base) {
|
||||||
|
case 16:
|
||||||
|
if (s[0] != 'f') strcpy(t++, "f"); break;
|
||||||
|
case 8:
|
||||||
|
if (s[0] != '7') strcpy(t++, "7"); break;
|
||||||
|
case 2:
|
||||||
|
if (s[0] != '1') strcpy(t++, "1"); break;
|
||||||
|
}
|
||||||
|
strcpy(t, s);
|
||||||
|
s = RSTRING(tmp)->ptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
strcpy(t, s);
|
|
||||||
bignum = 2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s = RSTRING(tmp)->ptr;
|
|
||||||
|
|
||||||
format_integer:
|
|
||||||
pos = -1;
|
pos = -1;
|
||||||
len = strlen(s);
|
len = strlen(s);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user