@@ -801,13 +801,6 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
801
801
int base ;
802
802
mrb_int len ;
803
803
804
- switch (* p ) {
805
- case 'd' :
806
- case 'i' :
807
- sign = 1 ; break ;
808
- default :
809
- break ;
810
- }
811
804
if (flags & FSHARP ) {
812
805
switch (* p ) {
813
806
case 'o' : prefix = "0" ; break ;
@@ -845,22 +838,14 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
845
838
case 'b' :
846
839
case 'B' :
847
840
base = 2 ; break ;
848
- case 'u' :
849
841
case 'd' :
850
842
case 'i' :
843
+ sign = 1 ;
844
+ case 'u' :
851
845
default :
852
846
base = 10 ; break ;
853
847
}
854
848
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
- }
864
849
if (sign ) {
865
850
if (v > 0 ) {
866
851
if (flags & FPLUS ) {
@@ -872,37 +857,33 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
872
857
width -- ;
873
858
}
874
859
}
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 ;
888
864
}
865
+ mrb_assert (base == 10 );
866
+ snprintf (nbuf , sizeof (nbuf ), "%" MRB_PRId , v );
889
867
s = nbuf ;
890
868
}
891
869
else {
892
870
s = nbuf ;
893
- if (base != 10 && v < 0 ) {
871
+ if (v < 0 ) {
894
872
dots = 1 ;
895
873
}
896
874
switch (base ) {
897
875
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
+ }
898
882
strncpy (++ s , RSTRING_PTR (val ), sizeof (nbuf )- 1 );
899
883
break ;
900
884
case 8 :
901
885
snprintf (++ s , sizeof (nbuf )- 1 , "%" MRB_PRIo , v );
902
886
break ;
903
- case 10 :
904
- snprintf (++ s , sizeof (nbuf )- 1 , "%" MRB_PRId , v );
905
- break ;
906
887
case 16 :
907
888
snprintf (++ s , sizeof (nbuf )- 1 , "%" MRB_PRIx , v );
908
889
break ;
@@ -930,11 +911,6 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
930
911
len = (mrb_int )size ;
931
912
}
932
913
933
- if (dots ) {
934
- prec -= 2 ;
935
- width -= 2 ;
936
- }
937
-
938
914
if (* p == 'X' ) {
939
915
char * pp = s ;
940
916
int c ;
@@ -990,7 +966,11 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
990
966
int plen = (int )strlen (prefix );
991
967
PUSH (prefix , plen );
992
968
}
993
- if (dots ) PUSH (".." , 2 );
969
+ if (dots ) {
970
+ prec -= 2 ;
971
+ width -= 2 ;
972
+ PUSH (".." , 2 );
973
+ }
994
974
995
975
if (prec > len ) {
996
976
CHECK (prec - len );
0 commit comments