aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-04-17 19:50:58 -0400
committerBrian Anderson <[email protected]>2011-04-17 19:50:58 -0400
commit9976bb93d6c2ab46979c2bc13480266069fd8b3e (patch)
tree036dee6d7f8d2b9f96b6611d407caf687f755cd3 /src/comp/front
parentSupport + flag in #fmt (diff)
downloadrust-9976bb93d6c2ab46979c2bc13480266069fd8b3e.tar.xz
rust-9976bb93d6c2ab46979c2bc13480266069fd8b3e.zip
Support the space flag in #fmt
Diffstat (limited to 'src/comp/front')
-rw-r--r--src/comp/front/extfmt.rs54
1 files changed, 35 insertions, 19 deletions
diff --git a/src/comp/front/extfmt.rs b/src/comp/front/extfmt.rs
index c05c74d1..287c7e55 100644
--- a/src/comp/front/extfmt.rs
+++ b/src/comp/front/extfmt.rs
@@ -28,7 +28,7 @@ import std.ExtFmt.CT.ty_hex;
import std.ExtFmt.CT.flag;
import std.ExtFmt.CT.flag_left_justify;
import std.ExtFmt.CT.flag_left_zero_pad;
-import std.ExtFmt.CT.flag_left_space_pad;
+import std.ExtFmt.CT.flag_space_for_sign;
import std.ExtFmt.CT.flag_sign_always;
import std.ExtFmt.CT.flag_alternate;
import std.ExtFmt.CT.count;
@@ -180,6 +180,10 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
auto fstr = "flag_sign_always";
flagexprs += vec(make_rt_path_expr(sp, fstr));
}
+ case (flag_space_for_sign) {
+ auto fstr = "flag_space_for_sign";
+ flagexprs += vec(make_rt_path_expr(sp, fstr));
+ }
}
}
@@ -268,6 +272,25 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
fn make_new_conv(conv cnv, @ast.expr arg) -> @ast.expr {
+ // FIXME: Extract all this validation into ExtFmt.CT
+ fn is_signed_type(conv cnv) -> bool {
+ alt (cnv.ty) {
+ case (ty_int(?s)) {
+ alt (s) {
+ case (signed) {
+ ret true;
+ }
+ case (unsigned) {
+ ret false;
+ }
+ }
+ }
+ case (_) {
+ ret false;
+ }
+ }
+ }
+
auto unsupported = "conversion not supported in #fmt string";
alt (cnv.param) {
@@ -284,23 +307,16 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
case (flag_left_justify) {
}
case (flag_sign_always) {
- auto err = "+ flag only valid in signed #fmt conversions";
- alt (cnv.ty) {
- case (ty_int(?s)) {
- alt (s) {
- case (signed) {
- // Valid
- }
- case (unsigned) {
- log err;
- fail;
- }
- }
- }
- case (_) {
- log err;
- fail;
- }
+ if (!is_signed_type(cnv)) {
+ log "+ flag only valid in signed #fmt conversions";
+ fail;
+ }
+ }
+ case (flag_space_for_sign) {
+ if (!is_signed_type(cnv)) {
+ log "space flag only valid in "
+ + "signed #fmt conversions";
+ fail;
}
}
case (_) {
@@ -382,7 +398,7 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
case (flag_left_zero_pad) {
log "flag: left zero pad";
}
- case (flag_left_space_pad) {
+ case (flag_space_for_sign) {
log "flag: left space pad";
}
case (flag_sign_always) {