mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-18 20:40:28 +00:00
Fix fmt integer width printing
This commit is contained in:
@@ -13,7 +13,7 @@ main :: proc() {
|
||||
x := 624.123;
|
||||
s := strconv.format_float(buf[:], x, 'f', 6, 64);
|
||||
fmt.println(s);
|
||||
fmt.printf("%.3f\n", x);
|
||||
fmt.printf("%3d\n", 102);
|
||||
|
||||
i := 123;
|
||||
fmt.println(123);
|
||||
|
||||
@@ -466,7 +466,7 @@ _write_int :: proc(fi: ^Fmt_Info, u: u64, base: int, neg: bool, digits: string)
|
||||
}
|
||||
BUF_SIZE :: 256;
|
||||
if fi.width_set || fi.prec_set {
|
||||
width := fi.width + fi.prec + 3;
|
||||
width := fi.width + fi.prec + 3; // 3 extra bytes for sign and prefix
|
||||
if width > BUF_SIZE {
|
||||
// TODO(bill):????
|
||||
panic("_write_int buffer overrun. Width and precision too big");
|
||||
@@ -477,10 +477,10 @@ _write_int :: proc(fi: ^Fmt_Info, u: u64, base: int, neg: bool, digits: string)
|
||||
if fi.prec_set {
|
||||
prec = fi.prec;
|
||||
if prec == 0 && u == 0 {
|
||||
old_zero := fi.zero;
|
||||
prev_zero := fi.zero;
|
||||
fi.zero = false;
|
||||
fmt_write_padding(fi, fi.width);
|
||||
fi.zero = old_zero;
|
||||
fi.zero = prev_zero;
|
||||
return;
|
||||
}
|
||||
} else if fi.zero && fi.width_set {
|
||||
@@ -505,27 +505,10 @@ _write_int :: proc(fi: ^Fmt_Info, u: u64, base: int, neg: bool, digits: string)
|
||||
if fi.space { flags |= strconv.Int_Flag.SPACE; }
|
||||
s := strconv.format_bits(buf[:], u, base, neg, digits, flags);
|
||||
|
||||
old_zero := fi.zero;
|
||||
defer fi.zero = old_zero;
|
||||
prev_zero := fi.zero;
|
||||
fi.zero = false;
|
||||
|
||||
if !fi.width_set || fi.width == 0 {
|
||||
buffer_write_string(fi.buf, s);
|
||||
} else {
|
||||
width := fi.width - utf8.rune_count(s);
|
||||
if width > 0 {
|
||||
if fi.minus {
|
||||
// Right pad
|
||||
buffer_write_string(fi.buf, s);
|
||||
fmt_write_padding(fi, width);
|
||||
} else {
|
||||
// Left pad
|
||||
fmt_write_padding(fi, width);
|
||||
buffer_write_string(fi.buf, s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defer fi.zero = prev_zero;
|
||||
_pad(fi, s);
|
||||
}
|
||||
|
||||
immutable __DIGITS_LOWER := "0123456789abcdefx";
|
||||
@@ -559,22 +542,23 @@ fmt_int :: proc(fi: ^Fmt_Info, u: u64, neg: bool, verb: rune) {
|
||||
}
|
||||
}
|
||||
|
||||
_pad :: proc(fi: ^Fmt_Info, s: string) {
|
||||
if !fi.width_set || fi.width == 0 {
|
||||
buffer_write_string(fi.buf, s);
|
||||
return;
|
||||
}
|
||||
width := fi.width - utf8.rune_count(s);
|
||||
if fi.minus { // right pad
|
||||
buffer_write_string(fi.buf, s);
|
||||
fmt_write_padding(fi, width);
|
||||
} else { // left pad
|
||||
fmt_write_padding(fi, width);
|
||||
buffer_write_string(fi.buf, s);
|
||||
}
|
||||
}
|
||||
|
||||
fmt_float :: proc(fi: ^Fmt_Info, v: f64, bit_size: int, verb: rune) {
|
||||
pad :: proc(fi: ^Fmt_Info, s: string) {
|
||||
if !fi.width_set || fi.width == 0 {
|
||||
buffer_write_string(fi.buf, s);
|
||||
return;
|
||||
}
|
||||
width := fi.width - utf8.rune_count(s);
|
||||
if fi.minus { // right pad
|
||||
buffer_write_string(fi.buf, s);
|
||||
fmt_write_padding(fi, width);
|
||||
} else { // left pad
|
||||
fmt_write_padding(fi, width);
|
||||
buffer_write_string(fi.buf, s);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
match verb {
|
||||
// case 'e', 'E', 'f', 'F', 'g', 'G', 'v':
|
||||
@@ -609,10 +593,10 @@ fmt_float :: proc(fi: ^Fmt_Info, v: f64, bit_size: int, verb: rune) {
|
||||
fmt_write_padding(fi, fi.width - str.count);
|
||||
buffer_write_string(fi.buf, str[1:]);
|
||||
} else {
|
||||
pad(fi, str);
|
||||
_pad(fi, str);
|
||||
}
|
||||
} else {
|
||||
pad(fi, str[1:]);
|
||||
_pad(fi, str[1:]);
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user