Skip to content

Commit e9cdc88

Browse files
committed
Refactor sprintf() code.
1 parent 31bc2b0 commit e9cdc88

File tree

1 file changed

+20
-40
lines changed

1 file changed

+20
-40
lines changed

mrbgems/mruby-sprintf/src/sprintf.c

+20-40
Original file line numberDiff line numberDiff line change
@@ -801,13 +801,6 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
801801
int base;
802802
mrb_int len;
803803

804-
switch (*p) {
805-
case 'd':
806-
case 'i':
807-
sign = 1; break;
808-
default:
809-
break;
810-
}
811804
if (flags & FSHARP) {
812805
switch (*p) {
813806
case 'o': prefix = "0"; break;
@@ -845,22 +838,14 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
845838
case 'b':
846839
case 'B':
847840
base = 2; break;
848-
case 'u':
849841
case 'd':
850842
case 'i':
843+
sign = 1;
844+
case 'u':
851845
default:
852846
base = 10; break;
853847
}
854848

855-
if (base == 2) {
856-
if (v < 0 && !sign) {
857-
val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);
858-
dots = 1;
859-
}
860-
else {
861-
val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
862-
}
863-
}
864849
if (sign) {
865850
if (v > 0) {
866851
if (flags & FPLUS) {
@@ -872,37 +857,33 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
872857
width--;
873858
}
874859
}
875-
switch (base) {
876-
case 2:
877-
strncpy(nbuf, RSTRING_PTR(val), sizeof(nbuf));
878-
break;
879-
case 8:
880-
snprintf(nbuf, sizeof(nbuf), "%" MRB_PRIo, v);
881-
break;
882-
case 10:
883-
snprintf(nbuf, sizeof(nbuf), "%" MRB_PRId, v);
884-
break;
885-
case 16:
886-
snprintf(nbuf, sizeof(nbuf), "%" MRB_PRIx, v);
887-
break;
860+
else {
861+
sc = '-';
862+
width--;
863+
v = -v;
888864
}
865+
mrb_assert(base == 10);
866+
snprintf(nbuf, sizeof(nbuf), "%" MRB_PRId, v);
889867
s = nbuf;
890868
}
891869
else {
892870
s = nbuf;
893-
if (base != 10 && v < 0) {
871+
if (v < 0) {
894872
dots = 1;
895873
}
896874
switch (base) {
897875
case 2:
876+
if (v < 0) {
877+
val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);
878+
}
879+
else {
880+
val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
881+
}
898882
strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-1);
899883
break;
900884
case 8:
901885
snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRIo, v);
902886
break;
903-
case 10:
904-
snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRId, v);
905-
break;
906887
case 16:
907888
snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRIx, v);
908889
break;
@@ -930,11 +911,6 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
930911
len = (mrb_int)size;
931912
}
932913

933-
if (dots) {
934-
prec -= 2;
935-
width -= 2;
936-
}
937-
938914
if (*p == 'X') {
939915
char *pp = s;
940916
int c;
@@ -990,7 +966,11 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
990966
int plen = (int)strlen(prefix);
991967
PUSH(prefix, plen);
992968
}
993-
if (dots) PUSH("..", 2);
969+
if (dots) {
970+
prec -= 2;
971+
width -= 2;
972+
PUSH("..", 2);
973+
}
994974

995975
if (prec > len) {
996976
CHECK(prec - len);

0 commit comments

Comments
 (0)