about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAngus Lees <gus@inodes.org>2014-08-01 15:37:04 +1000
committerAngus Lees <gus@inodes.org>2014-08-01 15:39:00 +1000
commit17d5c64941176c555f8084f3ce638de0de7ca215 (patch)
tree241a339baf6dc9bdeda3cf3dc046f14d99339c7b
parentb495933a7fdc5e7b28ddbb058d1e2dab330ace7b (diff)
downloadrust-17d5c64941176c555f8084f3ce638de0de7ca215.tar.gz
rust-17d5c64941176c555f8084f3ce638de0de7ca215.zip
Change strptime::match_strs to use borrowed rather than owned strings
Also modernise a few constructs in match_strs().
-rw-r--r--src/libtime/lib.rs104
1 files changed, 45 insertions, 59 deletions
diff --git a/src/libtime/lib.rs b/src/libtime/lib.rs
index 53e6bdc5641..16e8f764a89 100644
--- a/src/libtime/lib.rs
+++ b/src/libtime/lib.rs
@@ -387,29 +387,15 @@ impl Tm {
 /// Parses the time from the string according to the format string.
 pub fn strptime(s: &str, format: &str) -> Result<Tm, String> {
     fn match_str(s: &str, pos: uint, needle: &str) -> bool {
-        let mut i = pos;
-        for ch in needle.bytes() {
-            if s.as_bytes()[i] != ch {
-                return false;
-            }
-            i += 1u;
-        }
-        return true;
+        return s.slice_from(pos).starts_with(needle);
     }
 
-    fn match_strs(ss: &str, pos: uint, strs: &[(String, i32)])
+    fn match_strs(ss: &str, pos: uint, strs: &[(&str, i32)])
       -> Option<(i32, uint)> {
-        let mut i = 0u;
-        let len = strs.len();
-        while i < len {
-            match strs[i] { // can't use let due to let-pattern bugs
-                (ref needle, value) => {
-                    if match_str(ss, pos, needle.as_slice()) {
-                        return Some((value, pos + needle.len()));
-                    }
-                }
+        for &(needle, value) in strs.iter() {
+            if match_str(ss, pos, needle) {
+                return Some((value, pos + needle.len()));
             }
-            i += 1u;
         }
 
         None
@@ -493,59 +479,59 @@ pub fn strptime(s: &str, format: &str) -> Result<Tm, String> {
       -> Result<uint, String> {
         match ch {
           'A' => match match_strs(s, pos, [
-              ("Sunday".to_string(), 0_i32),
-              ("Monday".to_string(), 1_i32),
-              ("Tuesday".to_string(), 2_i32),
-              ("Wednesday".to_string(), 3_i32),
-              ("Thursday".to_string(), 4_i32),
-              ("Friday".to_string(), 5_i32),
-              ("Saturday".to_string(), 6_i32)
+              ("Sunday", 0_i32),
+              ("Monday", 1_i32),
+              ("Tuesday", 2_i32),
+              ("Wednesday", 3_i32),
+              ("Thursday", 4_i32),
+              ("Friday", 5_i32),
+              ("Saturday", 6_i32)
           ]) {
             Some(item) => { let (v, pos) = item; tm.tm_wday = v; Ok(pos) }
             None => Err("Invalid day".to_string())
           },
           'a' => match match_strs(s, pos, [
-              ("Sun".to_string(), 0_i32),
-              ("Mon".to_string(), 1_i32),
-              ("Tue".to_string(), 2_i32),
-              ("Wed".to_string(), 3_i32),
-              ("Thu".to_string(), 4_i32),
-              ("Fri".to_string(), 5_i32),
-              ("Sat".to_string(), 6_i32)
+              ("Sun", 0_i32),
+              ("Mon", 1_i32),
+              ("Tue", 2_i32),
+              ("Wed", 3_i32),
+              ("Thu", 4_i32),
+              ("Fri", 5_i32),
+              ("Sat", 6_i32)
           ]) {
             Some(item) => { let (v, pos) = item; tm.tm_wday = v; Ok(pos) }
             None => Err("Invalid day".to_string())
           },
           'B' => match match_strs(s, pos, [
-              ("January".to_string(), 0_i32),
-              ("February".to_string(), 1_i32),
-              ("March".to_string(), 2_i32),
-              ("April".to_string(), 3_i32),
-              ("May".to_string(), 4_i32),
-              ("June".to_string(), 5_i32),
-              ("July".to_string(), 6_i32),
-              ("August".to_string(), 7_i32),
-              ("September".to_string(), 8_i32),
-              ("October".to_string(), 9_i32),
-              ("November".to_string(), 10_i32),
-              ("December".to_string(), 11_i32)
+              ("January", 0_i32),
+              ("February", 1_i32),
+              ("March", 2_i32),
+              ("April", 3_i32),
+              ("May", 4_i32),
+              ("June", 5_i32),
+              ("July", 6_i32),
+              ("August", 7_i32),
+              ("September", 8_i32),
+              ("October", 9_i32),
+              ("November", 10_i32),
+              ("December", 11_i32)
           ]) {
             Some(item) => { let (v, pos) = item; tm.tm_mon = v; Ok(pos) }
             None => Err("Invalid month".to_string())
           },
           'b' | 'h' => match match_strs(s, pos, [
-              ("Jan".to_string(), 0_i32),
-              ("Feb".to_string(), 1_i32),
-              ("Mar".to_string(), 2_i32),
-              ("Apr".to_string(), 3_i32),
-              ("May".to_string(), 4_i32),
-              ("Jun".to_string(), 5_i32),
-              ("Jul".to_string(), 6_i32),
-              ("Aug".to_string(), 7_i32),
-              ("Sep".to_string(), 8_i32),
-              ("Oct".to_string(), 9_i32),
-              ("Nov".to_string(), 10_i32),
-              ("Dec".to_string(), 11_i32)
+              ("Jan", 0_i32),
+              ("Feb", 1_i32),
+              ("Mar", 2_i32),
+              ("Apr", 3_i32),
+              ("May", 4_i32),
+              ("Jun", 5_i32),
+              ("Jul", 6_i32),
+              ("Aug", 7_i32),
+              ("Sep", 8_i32),
+              ("Oct", 9_i32),
+              ("Nov", 10_i32),
+              ("Dec", 11_i32)
           ]) {
             Some(item) => { let (v, pos) = item; tm.tm_mon = v; Ok(pos) }
             None => Err("Invalid month".to_string())
@@ -659,13 +645,13 @@ pub fn strptime(s: &str, format: &str) -> Result<Tm, String> {
           }
           'n' => parse_char(s, pos, '\n'),
           'P' => match match_strs(s, pos,
-                                  [("am".to_string(), 0_i32), ("pm".to_string(), 12_i32)]) {
+                                  [("am", 0_i32), ("pm", 12_i32)]) {
 
             Some(item) => { let (v, pos) = item; tm.tm_hour += v; Ok(pos) }
             None => Err("Invalid hour".to_string())
           },
           'p' => match match_strs(s, pos,
-                                  [("AM".to_string(), 0_i32), ("PM".to_string(), 12_i32)]) {
+                                  [("AM", 0_i32), ("PM", 12_i32)]) {
 
             Some(item) => { let (v, pos) = item; tm.tm_hour += v; Ok(pos) }
             None => Err("Invalid hour".to_string())