]> git.lizzy.rs Git - rust.git/commitdiff
Merge pull request #4466 from ScriptDevil/master
authorTim Chevalier <chevalier@alum.wellesley.edu>
Wed, 23 Jan 2013 00:10:48 +0000 (16:10 -0800)
committerTim Chevalier <chevalier@alum.wellesley.edu>
Wed, 23 Jan 2013 00:10:48 +0000 (16:10 -0800)
Range checking and miscellaneous fixes tin time library

1  2 
src/libstd/time.rs

index 940a49408799f3d81905b330388f972ce7aaae2f,02ed3692a989579f3737f42342be1e265089c498..8e7ffde65ece237ed4e9ae12bc2f29674aa10049
@@@ -423,24 -413,25 +434,25 @@@ priv fn do_strptime(s: &str, format: &s
              None => Err(~"Invalid year")
            },
            'c' => {
 -            parse_type(s, pos, 'a', tm)
 +            parse_type(s, pos, 'a', &mut *tm)
                  .chain(|pos| parse_char(s, pos, ' '))
 -                .chain(|pos| parse_type(s, pos, 'b', tm))
 +                .chain(|pos| parse_type(s, pos, 'b', &mut *tm))
                  .chain(|pos| parse_char(s, pos, ' '))
 -                .chain(|pos| parse_type(s, pos, 'e', tm))
 +                .chain(|pos| parse_type(s, pos, 'e', &mut *tm))
                  .chain(|pos| parse_char(s, pos, ' '))
 -                .chain(|pos| parse_type(s, pos, 'T', tm))
 +                .chain(|pos| parse_type(s, pos, 'T', &mut *tm))
                  .chain(|pos| parse_char(s, pos, ' '))
 -                .chain(|pos| parse_type(s, pos, 'Y', tm))
 +                .chain(|pos| parse_type(s, pos, 'Y', &mut *tm))
            }
            'D' | 'x' => {
 -            parse_type(s, pos, 'm', tm)
 +            parse_type(s, pos, 'm', &mut *tm)
                  .chain(|pos| parse_char(s, pos, '/'))
 -                .chain(|pos| parse_type(s, pos, 'd', tm))
 +                .chain(|pos| parse_type(s, pos, 'd', &mut *tm))
                  .chain(|pos| parse_char(s, pos, '/'))
 -                .chain(|pos| parse_type(s, pos, 'y', tm))
 +                .chain(|pos| parse_type(s, pos, 'y', &mut *tm))
            }
-           'd' => match match_digits(s, pos, 2u, false) {
+           'd' => match match_digits_in_range(s, pos, 2u, false, 1_i32,
+                                              31_i32) {
              Some(item) => { let (v, pos) = item; tm.tm_mday = v; Ok(pos) }
              None => Err(~"Invalid day of the month")
            },
              None => Err(~"Invalid day of the month")
            },
            'F' => {
 -            parse_type(s, pos, 'Y', tm)
 +            parse_type(s, pos, 'Y', &mut *tm)
                  .chain(|pos| parse_char(s, pos, '-'))
 -                .chain(|pos| parse_type(s, pos, 'm', tm))
 +                .chain(|pos| parse_type(s, pos, 'm', &mut *tm))
                  .chain(|pos| parse_char(s, pos, '-'))
 -                .chain(|pos| parse_type(s, pos, 'd', tm))
 +                .chain(|pos| parse_type(s, pos, 'd', &mut *tm))
            }
            'H' => {
-             // FIXME (#2350): range check.
-             match match_digits(s, pos, 2u, false) {
+             match match_digits_in_range(s, pos, 2u, false, 0_i32, 23_i32) {
                Some(item) => { let (v, pos) = item; tm.tm_hour = v; Ok(pos) }
                None => Err(~"Invalid hour")
              }
              None => Err(~"Invalid hour")
            },
            'R' => {
 -            parse_type(s, pos, 'H', tm)
 +            parse_type(s, pos, 'H', &mut *tm)
                  .chain(|pos| parse_char(s, pos, ':'))
 -                .chain(|pos| parse_type(s, pos, 'M', tm))
 +                .chain(|pos| parse_type(s, pos, 'M', &mut *tm))
            }
            'r' => {
 -            parse_type(s, pos, 'I', tm)
 +            parse_type(s, pos, 'I', &mut *tm)
                  .chain(|pos| parse_char(s, pos, ':'))
 -                .chain(|pos| parse_type(s, pos, 'M', tm))
 +                .chain(|pos| parse_type(s, pos, 'M', &mut *tm))
                  .chain(|pos| parse_char(s, pos, ':'))
 -                .chain(|pos| parse_type(s, pos, 'S', tm))
 +                .chain(|pos| parse_type(s, pos, 'S', &mut *tm))
                  .chain(|pos| parse_char(s, pos, ' '))
 -                .chain(|pos| parse_type(s, pos, 'p', tm))
 +                .chain(|pos| parse_type(s, pos, 'p', &mut *tm))
            }
            'S' => {
-             // FIXME (#2350): range check.
-             match match_digits(s, pos, 2u, false) {
+             match match_digits_in_range(s, pos, 2u, false, 0_i32, 60_i32) {
                Some(item) => {
                  let (v, pos) = item;
                  tm.tm_sec = v;