Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use ASCII case-insensitivity functions from std::ascii
  • Loading branch information
SimonSapin committed Aug 7, 2013
commit 4b0b08ce971cfb8d4514509da098deeaaec3c404
3 changes: 2 additions & 1 deletion color.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::libc::c_float;
use std::ascii::to_ascii_lower;

use ast::*;
use super::to_ascii_lower;
use self::color_data::{COLOR_KEYWORDS, COLOR_VALUES};

mod color_data;
Expand Down
91 changes: 0 additions & 91 deletions cssparser.rc
Original file line number Diff line number Diff line change
Expand Up @@ -14,94 +14,3 @@ pub mod color;

#[cfg(test)]
mod tests;


#[cfg(not(test))]
static CFG_TEST: bool = false;

#[cfg(test)]
static CFG_TEST: bool = true;


/// Return whether `string` is an ASCII case-insensitive match for `reference`,
/// where `reference` is already in ASCII lower-case.
pub fn eq_ascii_lower(string: &str, reference: &str) -> bool {
#[inline]
fn eq(string: &str, reference: &str) -> bool {
for i in range(0, string.len()) {
if ASCII_LOWER_MAP[string[i]] != reference[i] {
return false
}
}
true
}

if CFG_TEST {
assert!(eq(reference, reference), ~"Reference must be ASCII lower case.");
}
string.len() == reference.len() && eq(string, reference)
}


/// Return an ASCII lower-case copy of `string`:
/// A-Z is replaced by a-z, non-ASCII letters are unchanged.
pub fn to_ascii_lower(string: &str) -> ~str {
let mut lower = string.to_owned();
for i in range(0, lower.len()) {
lower[i] = ASCII_LOWER_MAP[lower[i]];
}
lower
}


#[test]
fn test_ascii_lower() {
assert!(eq_ascii_lower("url()URL()uRl()Ürl", "url()url()url()Ürl"));
assert!(to_ascii_lower("url()URL()uRl()Ürl") == ~"url()url()url()Ürl");
// Dotted capital I, Kelvin sign, Sharp S.
assert!(eq_ascii_lower("HİKß", "hİKß"));
assert!(to_ascii_lower("HİKß") == ~"hİKß");

for i in range(0, 128) {
let c = i as char;
let lower = if 'A' <= c && c <= 'Z' { c + 'a' - 'A' } else { c };
assert!(ASCII_LOWER_MAP[i] as char == lower)
}
}


// This is UTF8-safe because only bytes in the ASCII range are affected.
static ASCII_LOWER_MAP: &'static [u8] = &[
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
];
4 changes: 2 additions & 2 deletions parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@

use std::iterator::Iterator;
use std::vec;
use std::ascii::eq_ignore_ascii_case;

use ast::*;
use tokenizer::*;
use super::eq_ascii_lower;


// TODO: Use a trait?
Expand Down Expand Up @@ -234,7 +234,7 @@ fn parse_declaration_important(iter: &mut ComponentValueIterator) -> bool {
Some((Ident(value), _)) => value,
_ => return false,
};
if !eq_ascii_lower(ident_value, "important") { return false }
if !eq_ignore_ascii_case(ident_value, "important") { return false }
match iter.next_non_whitespace() {
Some((Semicolon, _)) => true,
None => true,
Expand Down
4 changes: 2 additions & 2 deletions tokenizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
// http://dev.w3.org/csswg/css3-syntax/#tokenization

use std::{str, u32, i64, f64};
use std::ascii::eq_ignore_ascii_case;

use ast::*;
use super::eq_ascii_lower;


struct Parser {
Expand Down Expand Up @@ -347,7 +347,7 @@ fn is_ident_start(parser: &mut Parser) -> bool {
fn consume_ident_like(parser: &mut Parser) -> ComponentValue {
let value = consume_name(parser);
if !parser.is_eof() && parser.current_char() == '(' {
if eq_ascii_lower(value, "url") { consume_url(parser) }
if eq_ignore_ascii_case(value, "url") { consume_url(parser) }
else { Function(value, consume_block(parser, CloseParenthesis)) }
} else {
Ident(value)
Expand Down