Skip to content

Commit 9fa5972

Browse files
committed
---
yaml --- r: 2146 b: refs/heads/master c: 7f90000 h: refs/heads/master v: v3
1 parent 9dcba14 commit 9fa5972

File tree

3 files changed

+61
-36
lines changed

3 files changed

+61
-36
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 59d5267936934f8f653be44d2728fe7f618b89a4
2+
refs/heads/master: 7f90000ab6d823300c73a232715bb965935c932d

trunk/src/lib/ExtFmt.rs

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -451,13 +451,13 @@ mod RT {
451451
ret _str.unsafe_from_bytes(svec);
452452
}
453453

454-
tag pad_type {
454+
tag pad_mode {
455455
pad_signed;
456456
pad_unsigned;
457457
pad_nozero;
458458
}
459459

460-
fn pad(&conv cv, str s, pad_type pt) -> str {
460+
fn pad(&conv cv, str s, pad_mode mode) -> str {
461461
auto uwidth;
462462
alt (cv.width) {
463463
case (count_implied) {
@@ -479,44 +479,59 @@ mod RT {
479479
if (have_flag(cv.flags, flag_left_justify)) {
480480
auto padstr = str_init_elt(padchar, diff);
481481
ret s + padstr;
482-
} else {
483-
auto zero_padding = false;
484-
auto signed = false;
485-
alt (pt) {
486-
case (pad_nozero) {
487-
// fallthrough
488-
}
489-
case (pad_signed) {
490-
signed = true;
491-
if (have_flag(cv.flags, flag_left_zero_pad)) {
492-
padchar = '0';
493-
zero_padding = true;
494-
}
482+
}
483+
484+
auto might_zero_pad = false;
485+
auto signed = false;
486+
487+
alt (mode) {
488+
case (pad_nozero) {
489+
// fallthrough
490+
}
491+
case (pad_signed) {
492+
might_zero_pad = true;
493+
signed = true;
494+
}
495+
case (pad_unsigned) {
496+
might_zero_pad = true;
497+
}
498+
}
499+
500+
fn have_precision(&conv cv) -> bool {
501+
alt (cv.precision) {
502+
case (count_implied) {
503+
ret false;
495504
}
496-
case (pad_unsigned) {
497-
if (have_flag(cv.flags, flag_left_zero_pad)) {
498-
padchar = '0';
499-
zero_padding = true;
500-
}
505+
case (_) {
506+
ret true;
501507
}
502508
}
509+
}
503510

504-
auto padstr = str_init_elt(padchar, diff);
511+
auto zero_padding = false;
512+
if (might_zero_pad
513+
&& have_flag(cv.flags, flag_left_zero_pad)
514+
&& !have_precision(cv)) {
505515

506-
// This is completely heinous. If we have a signed value then
507-
// potentially rip apart the intermediate result and insert some
508-
// zeros. It may make sense to convert zero padding to a precision
509-
// instead.
510-
if (signed
511-
&& zero_padding
512-
&& _str.byte_len(s) > 0u
513-
&& s.(0) == '-' as u8) {
514-
515-
auto bytelen = _str.byte_len(s);
516-
auto numpart = _str.substr(s, 1u, bytelen - 1u);
517-
ret "-" + padstr + numpart;
518-
}
516+
padchar = '0';
517+
zero_padding = true;
518+
}
519+
520+
auto padstr = str_init_elt(padchar, diff);
519521

522+
// This is completely heinous. If we have a signed value then
523+
// potentially rip apart the intermediate result and insert some
524+
// zeros. It may make sense to convert zero padding to a precision
525+
// instead.
526+
if (signed
527+
&& zero_padding
528+
&& _str.byte_len(s) > 0u
529+
&& s.(0) == '-' as u8) {
530+
531+
auto bytelen = _str.byte_len(s);
532+
auto numpart = _str.substr(s, 1u, bytelen - 1u);
533+
ret "-" + padstr + numpart;
534+
} else {
520535
ret padstr + s;
521536
}
522537
}

trunk/src/test/run-pass/syntax-extension-fmt.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,17 @@ fn main() {
150150
test(#fmt("%-05s", "test"), "test ");
151151
test(#fmt("%-05b", true), "true ");
152152

153-
// TODO: Precision overrides 0-padding
153+
// Precision overrides 0-padding
154+
test(#fmt("%06.5d", 0), " 00000");
155+
test(#fmt("%06.5u", 0u), " 00000");
156+
test(#fmt("%06.5x", 0u), " 00000");
157+
test(#fmt("%06.5d", 10), " 00010");
158+
test(#fmt("%06.5d", -10), "-00010");
159+
test(#fmt("%06.5u", 10u), " 00010");
160+
test(#fmt("%06.5s", "test"), " test");
161+
test(#fmt("%06.5x", 127u), " 0007f");
162+
test(#fmt("%06.5X", 127u), " 0007F");
163+
154164
// TODO: Padding and +
155165
// TODO: Padding and ' '
156166
}

0 commit comments

Comments
 (0)