Add support for upper-case hex and binary output to #fmt.

Only works for uints at present. Necessitated the addition of _str.to_upper.
This commit is contained in:
Brian Anderson 2011-04-13 21:36:32 -04:00
parent 5c0f4c1939
commit 99a697b56a
5 changed files with 40 additions and 0 deletions

View file

@ -246,6 +246,9 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
case (ty_hex(_)) {
ret make_conv_call(arg.span, "uint", cnv, arg);
}
case (ty_bits) {
ret make_conv_call(arg.span, "uint", cnv, arg);
}
case (_) {
log unsupported;
fail;

View file

@ -315,6 +315,12 @@ mod RT {
case (ty_hex_lower) {
ret _uint.to_str(u, 16u);
}
case (ty_hex_upper) {
ret _str.to_upper(_uint.to_str(u, 16u));
}
case (ty_bits) {
ret _uint.to_str(u, 2u);
}
}
}

View file

@ -470,6 +470,24 @@ fn connect(vec[str] v, str sep) -> str {
ret s;
}
// FIXME: This only handles ASCII
fn to_upper(str s) -> str {
auto outstr = "";
auto ascii_a = 'a' as u8;
auto ascii_z = 'z' as u8;
auto diff = 32u8;
for (u8 byte in s) {
auto next;
if (ascii_a <= byte && byte <= ascii_z) {
next = byte - diff;
} else {
next = byte;
}
push_byte(outstr, next);
}
ret outstr;
}
// Local Variables:
// mode: rust;

View file

@ -89,6 +89,16 @@ fn test_connect() {
t(vec("hi"), " ", "hi");
}
fn test_to_upper() {
// to_upper doesn't understand unicode yet,
// but we need to at least preserve it
auto unicode = "\u65e5\u672c";
auto input = "abcDEF" + unicode + "xyz:.;";
auto expected = "ABCDEF" + unicode + "XYZ:.;";
auto actual = _str.to_upper(input);
check (_str.eq(expected, actual));
}
fn main() {
test_bytes_len();
@ -98,4 +108,5 @@ fn main() {
test_substr();
test_concat();
test_connect();
test_to_upper();
}

View file

@ -23,4 +23,6 @@ fn main() {
test(#fmt("%b", false), "false");
test(#fmt("%c", 'A'), "A");
test(#fmt("%x", 0xff_u), "ff");
test(#fmt("%X", 0x12ab_u), "12AB");
test(#fmt("%t", 0b11010101_u), "11010101");
}