about summary refs log tree commit diff
path: root/src/libextra/semver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libextra/semver.rs')
-rw-r--r--src/libextra/semver.rs65
1 files changed, 33 insertions, 32 deletions
diff --git a/src/libextra/semver.rs b/src/libextra/semver.rs
index 02c35000ce3..0ab38cdb5df 100644
--- a/src/libextra/semver.rs
+++ b/src/libextra/semver.rs
@@ -30,8 +30,6 @@
 
 use std::char;
 use std::cmp;
-use std::io::{ReaderUtil};
-use std::io;
 use std::option::{Option, Some, None};
 use std::to_str::ToStr;
 
@@ -147,14 +145,19 @@ condition! {
     bad_parse: () -> ();
 }
 
-fn take_nonempty_prefix(rdr: @io::Reader,
-                        ch: char,
-                        pred: &fn(char) -> bool) -> (~str, char) {
+fn take_nonempty_prefix<T: Iterator<char>>(rdr: &mut T,
+                        pred: &fn(char) -> bool) -> (~str, Option<char>) {
     let mut buf = ~"";
-    let mut ch = ch;
-    while pred(ch) {
-        buf.push_char(ch);
-        ch = rdr.read_char();
+    let mut ch = rdr.next();
+    loop {
+        match ch {
+            None => break,
+            Some(c) if !pred(c) => break,
+            Some(c) => {
+                buf.push_char(c);
+                ch = rdr.next();
+            }
+        }
     }
     if buf.is_empty() {
         bad_parse::cond.raise(())
@@ -163,16 +166,16 @@ fn take_nonempty_prefix(rdr: @io::Reader,
     (buf, ch)
 }
 
-fn take_num(rdr: @io::Reader, ch: char) -> (uint, char) {
-    let (s, ch) = take_nonempty_prefix(rdr, ch, char::is_digit);
+fn take_num<T: Iterator<char>>(rdr: &mut T) -> (uint, Option<char>) {
+    let (s, ch) = take_nonempty_prefix(rdr, char::is_digit);
     match from_str::<uint>(s) {
         None => { bad_parse::cond.raise(()); (0, ch) },
         Some(i) => (i, ch)
     }
 }
 
-fn take_ident(rdr: @io::Reader, ch: char) -> (Identifier, char) {
-    let (s,ch) = take_nonempty_prefix(rdr, ch, char::is_alphanumeric);
+fn take_ident<T: Iterator<char>>(rdr: &mut T) -> (Identifier, Option<char>) {
+    let (s,ch) = take_nonempty_prefix(rdr, char::is_alphanumeric);
     if s.iter().all(char::is_digit) {
         match from_str::<uint>(s) {
             None => { bad_parse::cond.raise(()); (Numeric(0), ch) },
@@ -183,38 +186,38 @@ fn take_ident(rdr: @io::Reader, ch: char) -> (Identifier, char) {
     }
 }
 
-fn expect(ch: char, c: char) {
-    if ch != c {
+fn expect(ch: Option<char>, c: char) {
+    if ch != Some(c) {
         bad_parse::cond.raise(())
     }
 }
 
-fn parse_reader(rdr: @io::Reader) -> Version {
-    let (major, ch) = take_num(rdr, rdr.read_char());
+fn parse_iter<T: Iterator<char>>(rdr: &mut T) -> Version {
+    let (major, ch) = take_num(rdr);
     expect(ch, '.');
-    let (minor, ch) = take_num(rdr, rdr.read_char());
+    let (minor, ch) = take_num(rdr);
     expect(ch, '.');
-    let (patch, ch) = take_num(rdr, rdr.read_char());
+    let (patch, ch) = take_num(rdr);
 
     let mut pre = ~[];
     let mut build = ~[];
 
     let mut ch = ch;
-    if ch == '-' {
+    if ch == Some('-') {
         loop {
-            let (id, c) = take_ident(rdr, rdr.read_char());
+            let (id, c) = take_ident(rdr);
             pre.push(id);
             ch = c;
-            if ch != '.' { break; }
+            if ch != Some('.') { break; }
         }
     }
 
-    if ch == '+' {
+    if ch == Some('+') {
         loop {
-            let (id, c) = take_ident(rdr, rdr.read_char());
+            let (id, c) = take_ident(rdr);
             build.push(id);
             ch = c;
-            if ch != '.' { break; }
+            if ch != Some('.') { break; }
         }
     }
 
@@ -236,13 +239,11 @@ pub fn parse(s: &str) -> Option<Version> {
     let s = s.trim();
     let mut bad = false;
     do bad_parse::cond.trap(|_| { debug!("bad"); bad = true }).inside {
-        do io::with_str_reader(s) |rdr| {
-            let v = parse_reader(rdr);
-            if bad || v.to_str() != s.to_owned() {
-                None
-            } else {
-                Some(v)
-            }
+        let v = parse_iter(&mut s.iter());
+        if bad || v.to_str() != s.to_owned() {
+            None
+        } else {
+            Some(v)
         }
     }
 }