From f8d7a1c2586ad1fda7358b445114c02b048149f5 Mon Sep 17 00:00:00 2001 From: Lenny222 Date: Sun, 1 Jan 2012 17:30:12 +0100 Subject: [PATCH] "str": extract to_upper/lower_case() into "char" --- src/libcore/char.rs | 30 +++++++++++++++++++++++++++++- src/libcore/str.rs | 32 ++++++++++++++++++-------------- src/test/stdtest/char.rs | 16 ++++++++++++++++ 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/libcore/char.rs b/src/libcore/char.rs index 0bdda6f0afbd..815637b1a423 100644 --- a/src/libcore/char.rs +++ b/src/libcore/char.rs @@ -41,7 +41,7 @@ export is_alphabetic, is_XID_start, is_XID_continue, is_lowercase, is_uppercase, is_whitespace, is_alphanumeric, - to_digit, maybe_digit, cmp; + to_digit, to_lowercase, to_uppercase, maybe_digit, cmp; import is_alphabetic = unicode::derived_property::Alphabetic; import is_XID_start = unicode::derived_property::XID_Start; @@ -136,6 +136,34 @@ pure fn maybe_digit(c: char) -> option::t { } } +/* + Function: to_lowercase + + Convert a char to the corresponding lower case. + + FIXME: works only on ASCII +*/ +pure fn to_lowercase(c: char) -> char { + alt c { + 'A' to 'Z' { ((c as u8) + 32u8) as char } + _ { c } + } +} + +/* + Function: to_uppercase + + Convert a char to the corresponding upper case. + + FIXME: works only on ASCII +*/ +pure fn to_uppercase(c: char) -> char { + alt c { + 'a' to 'z' { ((c as u8) - 32u8) as char } + _ { c } + } +} + /* Function: cmp diff --git a/src/libcore/str.rs b/src/libcore/str.rs index 6cb3ada6a880..449cc95aa214 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -7,10 +7,10 @@ String manipulation. export eq, lteq, hash, is_empty, is_not_empty, is_whitespace, byte_len, byte_len_range, index, rindex, find, starts_with, ends_with, substr, slice, split, splitn, - split_str, concat, connect, to_upper, replace, char_slice, trim_left, - trim_right, trim, unshift_char, shift_char, pop_char, push_char, - is_utf8, from_chars, to_chars, char_len, char_len_range, char_at, - bytes, is_ascii, shift_byte, pop_byte, + split_str, concat, connect, to_lower, to_upper, replace, char_slice, + trim_left, trim_right, trim, unshift_char, shift_char, pop_char, + push_char, is_utf8, from_chars, to_chars, char_len, char_len_range, + char_at, bytes, is_ascii, shift_byte, pop_byte, unsafe_from_byte, unsafe_from_bytes, from_char, char_range_at, str_from_cstr, sbuf, as_buf, push_byte, utf8_char_width, safe_slice, contains, iter_chars, loop_chars, loop_chars_sub, @@ -832,7 +832,18 @@ fn connect(v: [str], sep: str) -> str { ret s; } -// FIXME: This only handles ASCII +/* +Function: to_lower + +Convert a string to lowercase +*/ +fn to_lower(s: str) -> str { + let outstr = ""; + iter_chars(s) { |c| + push_char(outstr, char::to_lowercase(c)); + } + ret outstr; +} /* Function: to_upper @@ -840,15 +851,8 @@ Convert a string to uppercase */ fn to_upper(s: str) -> str { let outstr = ""; - let ascii_a = 'a' as u8; - let ascii_z = 'z' as u8; - let diff = 32u8; - for byte: u8 in s { - let next; - if ascii_a <= byte && byte <= ascii_z { - next = byte - diff; - } else { next = byte; } - push_byte(outstr, next); + iter_chars(s) { |c| + push_char(outstr, char::to_uppercase(c)); } ret outstr; } diff --git a/src/test/stdtest/char.rs b/src/test/stdtest/char.rs index 1ed61f5632f0..23101ee34bdd 100644 --- a/src/test/stdtest/char.rs +++ b/src/test/stdtest/char.rs @@ -60,3 +60,19 @@ fn test_to_digit_fail_1() { fn test_to_digit_fail_2() { char::to_digit('$'); } + +#[test] +fn test_to_lowercase() { + assert (char::to_lowercase('H') == 'h'); + assert (char::to_lowercase('e') == 'e'); + //assert (char::to_lowercase('Ö') == 'ö'); + assert (char::to_lowercase('ß') == 'ß'); +} + +#[test] +fn test_to_uppercase() { + assert (char::to_uppercase('l') == 'L'); + assert (char::to_uppercase('Q') == 'Q'); + //assert (char::to_uppercase('ü') == 'Ü'); + assert (char::to_uppercase('ß') == 'ß'); +}