From 80c926c5e253d6db299698cfd4932dbcb61cd1bd Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Mon, 31 Oct 2011 07:34:58 -0700 Subject: [PATCH] Add a char::to_digit function --- src/lib/char.rs | 9 +++++++++ src/lib/int.rs | 6 +----- src/lib/uint.rs | 6 +----- src/test/stdtest/char.rs | 28 ++++++++++++++++++++++++++++ src/test/stdtest/stdtest.rc | 1 + 5 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 src/test/stdtest/char.rs diff --git a/src/lib/char.rs b/src/lib/char.rs index e91e8697dd86..28345fb19fe9 100644 --- a/src/lib/char.rs +++ b/src/lib/char.rs @@ -93,3 +93,12 @@ pure fn is_whitespace(c: char) -> bool { true } else if c == ch_no_break_space { true } else { false } } + +pure fn to_digit(c: char) -> u8 { + alt c { + '0' to '9' { c as u8 - ('0' as u8) } + 'a' to 'z' { c as u8 + 10u8 - ('a' as u8) } + 'A' to 'Z' { c as u8 + 10u8 - ('A' as u8) } + _ { fail; } + } +} diff --git a/src/lib/int.rs b/src/lib/int.rs index 1dae4488b0b9..62fb0a7cb63a 100644 --- a/src/lib/int.rs +++ b/src/lib/int.rs @@ -112,11 +112,7 @@ fn parse_buf(buf: [u8], radix: uint) -> int { } let n = 0; while true { - let digit = alt buf[i] as char { - '0' to '9' { buf[i] - ('0' as u8) } - 'a' to 'z' { 10u8 + buf[i] - ('a' as u8) } - 'A' to 'Z' { 10u8 + buf[i] - ('A' as u8) } - }; + let digit = char::to_digit(buf[i] as char); if (digit as uint) >= radix { fail; } diff --git a/src/lib/uint.rs b/src/lib/uint.rs index 12e2f65b9e60..5de9bd974e43 100644 --- a/src/lib/uint.rs +++ b/src/lib/uint.rs @@ -100,11 +100,7 @@ fn parse_buf(buf: [u8], radix: uint) -> uint { let power = 1u; let n = 0u; while true { - let digit = alt buf[i] as char { - '0' to '9' { buf[i] - ('0' as u8) } - 'a' to 'z' { 10u8 + buf[i] - ('a' as u8) } - 'A' to 'Z' { 10u8 + buf[i] - ('A' as u8) } - }; + let digit = char::to_digit(buf[i] as char); if (digit as uint) >= radix { fail; } diff --git a/src/test/stdtest/char.rs b/src/test/stdtest/char.rs new file mode 100644 index 000000000000..b2724ca325d6 --- /dev/null +++ b/src/test/stdtest/char.rs @@ -0,0 +1,28 @@ +use std; +import std::char; + +#[test] +fn test_is_whitespace() { + assert char::is_whitespace(' '); + assert char::is_whitespace('\u2007'); + assert char::is_whitespace('\t'); + assert char::is_whitespace('\n'); + + assert !char::is_whitespace('a'); + assert !char::is_whitespace('_'); + assert !char::is_whitespace('\u0000'); +} + +#[test] +fn test_to_digit() { + assert (char::to_digit('0') == 0u8); + assert (char::to_digit('1') == 1u8); + assert (char::to_digit('2') == 2u8); + assert (char::to_digit('9') == 9u8); + assert (char::to_digit('a') == 10u8); + assert (char::to_digit('A') == 10u8); + assert (char::to_digit('b') == 11u8); + assert (char::to_digit('B') == 11u8); + assert (char::to_digit('z') == 35u8); + assert (char::to_digit('Z') == 35u8); +} diff --git a/src/test/stdtest/stdtest.rc b/src/test/stdtest/stdtest.rc index c47b85c65f8a..501879c540f8 100644 --- a/src/test/stdtest/stdtest.rc +++ b/src/test/stdtest/stdtest.rc @@ -2,6 +2,7 @@ use std; mod bitv; mod box; +mod char; mod comm; mod deque; mod either;