diff options
| author | Brian Anderson <[email protected]> | 2011-04-18 22:24:27 -0400 |
|---|---|---|
| committer | Brian Anderson <[email protected]> | 2011-04-18 22:53:26 -0400 |
| commit | 7f90000ab6d823300c73a232715bb965935c932d (patch) | |
| tree | ced515ef18ad488f13a61f2b10c5c5272c2edf4f /src | |
| parent | Rearrange ExtFmt.RT.pad to recover some horizontal space (diff) | |
| download | rust-7f90000ab6d823300c73a232715bb965935c932d.tar.xz rust-7f90000ab6d823300c73a232715bb965935c932d.zip | |
Precision overrides 0-padding in #fmt
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/ExtFmt.rs | 83 | ||||
| -rw-r--r-- | src/test/run-pass/syntax-extension-fmt.rs | 12 |
2 files changed, 60 insertions, 35 deletions
diff --git a/src/lib/ExtFmt.rs b/src/lib/ExtFmt.rs index 79f86038..64157cda 100644 --- a/src/lib/ExtFmt.rs +++ b/src/lib/ExtFmt.rs @@ -451,13 +451,13 @@ mod RT { ret _str.unsafe_from_bytes(svec); } - tag pad_type { + tag pad_mode { pad_signed; pad_unsigned; pad_nozero; } - fn pad(&conv cv, str s, pad_type pt) -> str { + fn pad(&conv cv, str s, pad_mode mode) -> str { auto uwidth; alt (cv.width) { case (count_implied) { @@ -479,44 +479,59 @@ mod RT { if (have_flag(cv.flags, flag_left_justify)) { auto padstr = str_init_elt(padchar, diff); ret s + padstr; - } else { - auto zero_padding = false; - auto signed = false; - alt (pt) { - case (pad_nozero) { - // fallthrough - } - case (pad_signed) { - signed = true; - if (have_flag(cv.flags, flag_left_zero_pad)) { - padchar = '0'; - zero_padding = true; - } + } + + auto might_zero_pad = false; + auto signed = false; + + alt (mode) { + case (pad_nozero) { + // fallthrough + } + case (pad_signed) { + might_zero_pad = true; + signed = true; + } + case (pad_unsigned) { + might_zero_pad = true; + } + } + + fn have_precision(&conv cv) -> bool { + alt (cv.precision) { + case (count_implied) { + ret false; } - case (pad_unsigned) { - if (have_flag(cv.flags, flag_left_zero_pad)) { - padchar = '0'; - zero_padding = true; - } + case (_) { + ret true; } } + } - auto padstr = str_init_elt(padchar, diff); + auto zero_padding = false; + if (might_zero_pad + && have_flag(cv.flags, flag_left_zero_pad) + && !have_precision(cv)) { - // This is completely heinous. If we have a signed value then - // potentially rip apart the intermediate result and insert some - // zeros. It may make sense to convert zero padding to a precision - // instead. - if (signed - && zero_padding - && _str.byte_len(s) > 0u - && s.(0) == '-' as u8) { - - auto bytelen = _str.byte_len(s); - auto numpart = _str.substr(s, 1u, bytelen - 1u); - ret "-" + padstr + numpart; - } + padchar = '0'; + zero_padding = true; + } + + auto padstr = str_init_elt(padchar, diff); + // This is completely heinous. If we have a signed value then + // potentially rip apart the intermediate result and insert some + // zeros. It may make sense to convert zero padding to a precision + // instead. + if (signed + && zero_padding + && _str.byte_len(s) > 0u + && s.(0) == '-' as u8) { + + auto bytelen = _str.byte_len(s); + auto numpart = _str.substr(s, 1u, bytelen - 1u); + ret "-" + padstr + numpart; + } else { ret padstr + s; } } diff --git a/src/test/run-pass/syntax-extension-fmt.rs b/src/test/run-pass/syntax-extension-fmt.rs index c3b2cd76..c5ad77f8 100644 --- a/src/test/run-pass/syntax-extension-fmt.rs +++ b/src/test/run-pass/syntax-extension-fmt.rs @@ -150,7 +150,17 @@ fn main() { test(#fmt("%-05s", "test"), "test "); test(#fmt("%-05b", true), "true "); - // TODO: Precision overrides 0-padding + // Precision overrides 0-padding + test(#fmt("%06.5d", 0), " 00000"); + test(#fmt("%06.5u", 0u), " 00000"); + test(#fmt("%06.5x", 0u), " 00000"); + test(#fmt("%06.5d", 10), " 00010"); + test(#fmt("%06.5d", -10), "-00010"); + test(#fmt("%06.5u", 10u), " 00010"); + test(#fmt("%06.5s", "test"), " test"); + test(#fmt("%06.5x", 127u), " 0007f"); + test(#fmt("%06.5X", 127u), " 0007F"); + // TODO: Padding and + // TODO: Padding and ' ' } |