Browse Source

Fix fmt integer width printing

Ginger Bill 8 years ago
parent
commit
18b3c0b2fc
2 changed files with 24 additions and 40 deletions
  1. 1 1
      code/demo.odin
  2. 23 39
      core/fmt.odin

+ 1 - 1
code/demo.odin

@@ -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);

+ 23 - 39
core/fmt.odin

@@ -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: