diff options
| author | Brian Anderson <[email protected]> | 2011-04-18 21:35:45 -0400 |
|---|---|---|
| committer | Brian Anderson <[email protected]> | 2011-04-18 21:36:04 -0400 |
| commit | 59d5267936934f8f653be44d2728fe7f618b89a4 (patch) | |
| tree | 24da21d28791669fa9013e27f73192a9362ee551 /src/lib/ExtFmt.rs | |
| parent | Left-justification overrides 0-padding in #fmt (diff) | |
| download | rust-59d5267936934f8f653be44d2728fe7f618b89a4.tar.xz rust-59d5267936934f8f653be44d2728fe7f618b89a4.zip | |
Rearrange ExtFmt.RT.pad to recover some horizontal space
Diffstat (limited to 'src/lib/ExtFmt.rs')
| -rw-r--r-- | src/lib/ExtFmt.rs | 100 |
1 files changed, 51 insertions, 49 deletions
diff --git a/src/lib/ExtFmt.rs b/src/lib/ExtFmt.rs index 938e86b6..79f86038 100644 --- a/src/lib/ExtFmt.rs +++ b/src/lib/ExtFmt.rs @@ -458,64 +458,66 @@ mod RT { } fn pad(&conv cv, str s, pad_type pt) -> str { + auto uwidth; alt (cv.width) { case (count_implied) { ret s; } case (count_is(?width)) { // FIXME: Maybe width should be uint - auto uwidth = width as uint; - auto strlen = _str.char_len(s); - if (strlen < uwidth) { - auto padchar = ' '; - auto diff = uwidth - strlen; - 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; - } - } - case (pad_unsigned) { - if (have_flag(cv.flags, flag_left_zero_pad)) { - 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; - } - - ret padstr + s; + uwidth = width as uint; + } + } + + auto strlen = _str.char_len(s); + if (uwidth <= strlen) { + ret s; + } + + auto padchar = ' '; + auto diff = uwidth - strlen; + 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; + } + } + case (pad_unsigned) { + if (have_flag(cv.flags, flag_left_zero_pad)) { + padchar = '0'; + zero_padding = true; } - } else { - ret s; } } + + 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; + } + + ret padstr + s; } } |