about summary refs log tree commit diff
path: root/src/libregex
diff options
context:
space:
mode:
Diffstat (limited to 'src/libregex')
-rw-r--r--src/libregex/compile.rs2
-rw-r--r--src/libregex/lib.rs5
-rw-r--r--src/libregex/parse.rs83
-rw-r--r--src/libregex/re.rs29
-rw-r--r--src/libregex/test/mod.rs2
-rw-r--r--src/libregex/test/tests.rs4
-rw-r--r--src/libregex/vm.rs5
7 files changed, 69 insertions, 61 deletions
diff --git a/src/libregex/compile.rs b/src/libregex/compile.rs
index d29a7a425c1..5803da1d335 100644
--- a/src/libregex/compile.rs
+++ b/src/libregex/compile.rs
@@ -105,7 +105,7 @@ impl Program {
         // This is a bit hacky since we have to skip over the initial
         // 'Save' instruction.
         let mut pre = String::with_capacity(5);
-        for inst in c.insts[1..].iter() {
+        for inst in c.insts.index(&(1..)).iter() {
             match *inst {
                 OneChar(c, FLAG_EMPTY) => pre.push(c),
                 _ => break
diff --git a/src/libregex/lib.rs b/src/libregex/lib.rs
index 0084be49b56..c039abc9aff 100644
--- a/src/libregex/lib.rs
+++ b/src/libregex/lib.rs
@@ -13,7 +13,6 @@
 //! Regular expressions implemented in Rust
 //!
 //! For official documentation, see the rust-lang/regex crate
-
 #![crate_name = "regex"]
 #![crate_type = "rlib"]
 #![crate_type = "dylib"]
@@ -24,9 +23,7 @@
        html_playground_url = "http://play.rust-lang.org/")]
 
 #![allow(unknown_features)]
-#![feature(macro_rules, slicing_syntax, globs)]
-#![feature(unboxed_closures)]
-#![feature(associated_types)]
+#![feature(slicing_syntax)]
 #![deny(missing_docs)]
 
 #[cfg(test)]
diff --git a/src/libregex/parse.rs b/src/libregex/parse.rs
index 07da86afcc9..dd11d42b8aa 100644
--- a/src/libregex/parse.rs
+++ b/src/libregex/parse.rs
@@ -18,6 +18,7 @@ use std::cmp;
 use std::fmt;
 use std::iter;
 use std::num;
+use std::ops::Index;
 
 /// Static data containing Unicode ranges for general categories and scripts.
 use unicode::regex::{UNICODE_CLASSES, PERLD, PERLS, PERLW};
@@ -39,7 +40,7 @@ pub struct Error {
 
 impl fmt::Show for Error {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Regex syntax error near position {}: {}",
+        write!(f, "Regex syntax error near position {}: {:?}",
                self.pos, self.msg)
     }
 }
@@ -121,7 +122,7 @@ impl BuildAst {
     fn flags(&self) -> Flags {
         match *self {
             Paren(flags, _, _) => flags,
-            _ => panic!("Cannot get flags from {}", self),
+            _ => panic!("Cannot get flags from {:?}", self),
         }
     }
 
@@ -129,7 +130,7 @@ impl BuildAst {
         match *self {
             Paren(_, 0, _) => None,
             Paren(_, c, _) => Some(c),
-            _ => panic!("Cannot get capture group from {}", self),
+            _ => panic!("Cannot get capture group from {:?}", self),
         }
     }
 
@@ -143,7 +144,7 @@ impl BuildAst {
                     Some(name.clone())
                 }
             }
-            _ => panic!("Cannot get capture name from {}", self),
+            _ => panic!("Cannot get capture name from {:?}", self),
         }
     }
 
@@ -157,7 +158,7 @@ impl BuildAst {
     fn unwrap(self) -> Result<Ast, Error> {
         match self {
             Expr(x) => Ok(x),
-            _ => panic!("Tried to unwrap non-AST item: {}", self),
+            _ => panic!("Tried to unwrap non-AST item: {:?}", self),
         }
     }
 }
@@ -284,8 +285,8 @@ impl<'a> Parser<'a> {
         match self.next_char() {
             true => Ok(()),
             false => {
-                self.err(format!("Expected {} but got EOF.",
-                                 expected)[])
+                self.err(format!("Expected {:?} but got EOF.",
+                                 expected).index(&FullRange))
             }
         }
     }
@@ -293,11 +294,11 @@ impl<'a> Parser<'a> {
     fn expect(&mut self, expected: char) -> Result<(), Error> {
         match self.next_char() {
             true if self.cur() == expected => Ok(()),
-            true => self.err(format!("Expected '{}' but got '{}'.",
-                                     expected, self.cur())[]),
+            true => self.err(format!("Expected '{:?}' but got '{:?}'.",
+                                     expected, self.cur()).index(&FullRange)),
             false => {
-                self.err(format!("Expected '{}' but got EOF.",
-                                 expected)[])
+                self.err(format!("Expected '{:?}' but got EOF.",
+                                 expected).index(&FullRange))
             }
         }
     }
@@ -394,7 +395,7 @@ impl<'a> Parser<'a> {
                             continue
                         }
                         Some(ast) =>
-                            panic!("Expected Class AST but got '{}'", ast),
+                            panic!("Expected Class AST but got '{:?}'", ast),
                         // Just drop down and try to add as a regular character.
                         None => {},
                     },
@@ -409,7 +410,7 @@ impl<'a> Parser<'a> {
                             return self.err(
                                 "\\A, \\z, \\b and \\B are not valid escape \
                                  sequences inside a character class."),
-                        ast => panic!("Unexpected AST item '{}'", ast),
+                        ast => panic!("Unexpected AST item '{:?}'", ast),
                     }
                 }
                 ']' if ranges.len() > 0 || alts.len() > 0 => {
@@ -442,15 +443,15 @@ impl<'a> Parser<'a> {
                     match try!(self.parse_escape()) {
                         Literal(c3, _) => c2 = c3, // allow literal escapes below
                         ast =>
-                            return self.err(format!("Expected a literal, but got {}.",
-                                                    ast)[]),
+                            return self.err(format!("Expected a literal, but got {:?}.",
+                                                    ast).index(&FullRange)),
                     }
                 }
                 if c2 < c {
                     return self.err(format!("Invalid character class \
                                              range '{}-{}'",
                                             c,
-                                            c2)[])
+                                            c2).index(&FullRange))
                 }
                 ranges.push((c, self.cur()))
             } else {
@@ -488,7 +489,7 @@ impl<'a> Parser<'a> {
                 FLAG_EMPTY
             };
         let name = self.slice(name_start, closer - 1);
-        match find_class(ASCII_CLASSES, name[]) {
+        match find_class(ASCII_CLASSES, name.index(&FullRange)) {
             None => None,
             Some(ranges) => {
                 self.chari = closer;
@@ -512,19 +513,19 @@ impl<'a> Parser<'a> {
                 None => {
                     return self.err(format!("No closing brace for counted \
                                              repetition starting at position \
-                                             {}.",
-                                            start)[])
+                                             {:?}.",
+                                            start).index(&FullRange))
                 }
             };
         self.chari = closer;
         let greed = try!(self.get_next_greedy());
-        let inner = self.chars[start+1..closer].iter().cloned()
+        let inner = self.chars.index(&((start+1)..closer)).iter().cloned()
                                                .collect::<String>();
 
         // Parse the min and max values from the regex.
         let (mut min, mut max): (uint, Option<uint>);
         if !inner.contains(",") {
-            min = try!(self.parse_uint(inner[]));
+            min = try!(self.parse_uint(inner.index(&FullRange)));
             max = Some(min);
         } else {
             let pieces: Vec<&str> = inner.splitn(1, ',').collect();
@@ -546,19 +547,19 @@ impl<'a> Parser<'a> {
         if min > MAX_REPEAT {
             return self.err(format!(
                 "{} exceeds maximum allowed repetitions ({})",
-                min, MAX_REPEAT)[]);
+                min, MAX_REPEAT).index(&FullRange));
         }
         if max.is_some() {
             let m = max.unwrap();
             if m > MAX_REPEAT {
                 return self.err(format!(
                     "{} exceeds maximum allowed repetitions ({})",
-                    m, MAX_REPEAT)[]);
+                    m, MAX_REPEAT).index(&FullRange));
             }
             if m < min {
                 return self.err(format!(
                     "Max repetitions ({}) cannot be smaller than min \
-                     repetitions ({}).", m, min)[]);
+                     repetitions ({}).", m, min).index(&FullRange));
             }
         }
 
@@ -622,7 +623,7 @@ impl<'a> Parser<'a> {
                 Ok(AstClass(ranges, flags))
             }
             _ => {
-                self.err(format!("Invalid escape sequence '\\\\{}'", c)[])
+                self.err(format!("Invalid escape sequence '\\\\{}'", c).index(&FullRange))
             }
         }
     }
@@ -642,7 +643,7 @@ impl<'a> Parser<'a> {
                     Some(i) => i,
                     None => return self.err(format!(
                         "Missing '}}' for unclosed '{{' at position {}",
-                        self.chari)[]),
+                        self.chari).index(&FullRange)),
                 };
             if closer - self.chari + 1 == 0 {
                 return self.err("No Unicode class name found.")
@@ -656,10 +657,10 @@ impl<'a> Parser<'a> {
             name = self.slice(self.chari + 1, self.chari + 2);
             self.chari += 1;
         }
-        match find_class(UNICODE_CLASSES, name[]) {
+        match find_class(UNICODE_CLASSES, name.index(&FullRange)) {
             None => {
                 return self.err(format!("Could not find Unicode class '{}'",
-                                        name)[])
+                                        name).index(&FullRange))
             }
             Some(ranges) => {
                 Ok(AstClass(ranges, negated | (self.flags & FLAG_NOCASE)))
@@ -682,11 +683,11 @@ impl<'a> Parser<'a> {
             }
         }
         let s = self.slice(start, end);
-        match num::from_str_radix::<u32>(s[], 8) {
+        match num::from_str_radix::<u32>(s.index(&FullRange), 8) {
             Some(n) => Ok(Literal(try!(self.char_from_u32(n)), FLAG_EMPTY)),
             None => {
-                self.err(format!("Could not parse '{}' as octal number.",
-                                 s)[])
+                self.err(format!("Could not parse '{:?}' as octal number.",
+                                 s).index(&FullRange))
             }
         }
     }
@@ -704,12 +705,12 @@ impl<'a> Parser<'a> {
                 None => {
                     return self.err(format!("Missing '}}' for unclosed \
                                              '{{' at position {}",
-                                            start)[])
+                                            start).index(&FullRange))
                 }
                 Some(i) => i,
             };
         self.chari = closer;
-        self.parse_hex_digits(self.slice(start, closer)[])
+        self.parse_hex_digits(self.slice(start, closer).index(&FullRange))
     }
 
     // Parses a two-digit hex number.
@@ -729,7 +730,7 @@ impl<'a> Parser<'a> {
         match num::from_str_radix::<u32>(s, 16) {
             Some(n) => Ok(Literal(try!(self.char_from_u32(n)), FLAG_EMPTY)),
             None => {
-                self.err(format!("Could not parse '{}' as hex number.", s)[])
+                self.err(format!("Could not parse '{}' as hex number.", s).index(&FullRange))
             }
         }
     }
@@ -755,7 +756,7 @@ impl<'a> Parser<'a> {
         }
         if self.names.contains(&name) {
             return self.err(format!("Duplicate capture group name '{}'.",
-                                    name)[])
+                                    name).index(&FullRange))
         }
         self.names.push(name.clone());
         self.chari = closer;
@@ -789,7 +790,7 @@ impl<'a> Parser<'a> {
                     if sign < 0 {
                         return self.err(format!(
                             "Cannot negate flags twice in '{}'.",
-                            self.slice(start, self.chari + 1))[])
+                            self.slice(start, self.chari + 1)).index(&FullRange))
                     }
                     sign = -1;
                     saw_flag = false;
@@ -800,7 +801,7 @@ impl<'a> Parser<'a> {
                         if !saw_flag {
                             return self.err(format!(
                                 "A valid flag does not follow negation in '{}'",
-                                self.slice(start, self.chari + 1))[])
+                                self.slice(start, self.chari + 1)).index(&FullRange))
                         }
                         flags = flags ^ flags;
                     }
@@ -812,7 +813,7 @@ impl<'a> Parser<'a> {
                     return Ok(())
                 }
                 _ => return self.err(format!(
-                    "Unrecognized flag '{}'.", self.cur())[]),
+                    "Unrecognized flag '{}'.", self.cur()).index(&FullRange)),
             }
         }
     }
@@ -910,7 +911,7 @@ impl<'a> Parser<'a> {
             Some(i) => Ok(i),
             None => {
                 self.err(format!("Expected an unsigned integer but got '{}'.",
-                                 s)[])
+                                 s).index(&FullRange))
             }
         }
     }
@@ -920,7 +921,7 @@ impl<'a> Parser<'a> {
             Some(c) => Ok(c),
             None => {
                 self.err(format!("Could not decode '{}' to unicode \
-                                  character.", n)[])
+                                  character.", n).index(&FullRange))
             }
         }
     }
@@ -953,7 +954,7 @@ impl<'a> Parser<'a> {
     }
 
     fn slice(&self, start: uint, end: uint) -> String {
-        self.chars[start..end].iter().cloned().collect()
+        self.chars.index(&(start..end)).iter().cloned().collect()
     }
 }
 
diff --git a/src/libregex/re.rs b/src/libregex/re.rs
index 1840a3343e6..37f9869f3bf 100644
--- a/src/libregex/re.rs
+++ b/src/libregex/re.rs
@@ -90,10 +90,19 @@ impl Clone for ExNative {
     }
 }
 
+#[cfg(stage0)]
+//FIXME: remove after stage0 snapshot
 impl fmt::Show for Regex {
     /// Shows the original regular expression.
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.as_str())
+        fmt::String::fmt(self.as_str(), f)
+    }
+}
+
+impl fmt::String for Regex {
+    /// Shows the original regular expression.
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::String::fmt(self.as_str(), f)
     }
 }
 
@@ -238,19 +247,19 @@ impl Regex {
             }
 
             let (s, e) = cap.pos(0).unwrap(); // captures only reports matches
-            new.push_str(text[last_match..s]);
-            new.push_str(rep.reg_replace(&cap)[]);
+            new.push_str(text.index(&(last_match..s)));
+            new.push_str(rep.reg_replace(&cap).index(&FullRange));
             last_match = e;
         }
-        new.push_str(text[last_match..text.len()]);
+        new.push_str(text.index(&(last_match..text.len())));
         return new;
     }
 
     /// Returns the original string of this regex.
     pub fn as_str<'a>(&'a self) -> &'a str {
         match *self {
-            Dynamic(ExDynamic { ref original, .. }) => original[],
-            Native(ExNative { ref original, .. }) => original[],
+            Dynamic(ExDynamic { ref original, .. }) => original.index(&FullRange),
+            Native(ExNative { ref original, .. }) => original.index(&FullRange),
         }
     }
 
@@ -347,13 +356,13 @@ impl<'r, 't> Iterator for RegexSplits<'r, 't> {
                 if self.last >= text.len() {
                     None
                 } else {
-                    let s = text[self.last..text.len()];
+                    let s = text.index(&(self.last..text.len()));
                     self.last = text.len();
                     Some(s)
                 }
             }
             Some((s, e)) => {
-                let matched = text[self.last..s];
+                let matched = text.index(&(self.last..s));
                 self.last = e;
                 Some(matched)
             }
@@ -384,7 +393,7 @@ impl<'r, 't> Iterator for RegexSplitsN<'r, 't> {
         } else {
             self.cur += 1;
             if self.cur >= self.limit {
-                Some(text[self.splits.last..text.len()])
+                Some(text.index(&(self.splits.last..text.len())))
             } else {
                 self.splits.next()
             }
@@ -517,7 +526,7 @@ impl<'t> Captures<'t> {
             })
         });
         let re = Regex::new(r"\$\$").unwrap();
-        re.replace_all(text[], NoExpand("$"))
+        re.replace_all(text.index(&FullRange), NoExpand("$"))
     }
 
     /// Returns the number of captured groups.
diff --git a/src/libregex/test/mod.rs b/src/libregex/test/mod.rs
index 48cc35aa5d9..e11094b1174 100644
--- a/src/libregex/test/mod.rs
+++ b/src/libregex/test/mod.rs
@@ -12,7 +12,7 @@ macro_rules! regex {
     ($re:expr) => (
         match ::regex::Regex::new($re) {
             Ok(re) => re,
-            Err(err) => panic!("{}", err),
+            Err(err) => panic!("{:?}", err),
         }
     );
 }
diff --git a/src/libregex/test/tests.rs b/src/libregex/test/tests.rs
index d087814b7f4..b69420ac05b 100644
--- a/src/libregex/test/tests.rs
+++ b/src/libregex/test/tests.rs
@@ -159,10 +159,10 @@ macro_rules! mat {
             // actual capture groups to match test set.
             let mut sgot = got.as_slice();
             if sgot.len() > expected.len() {
-                sgot = sgot[0..expected.len()]
+                sgot = &sgot[..expected.len()]
             }
             if expected != sgot {
-                panic!("For RE '{}' against '{}', expected '{}' but got '{}'",
+                panic!("For RE '{}' against '{}', expected '{:?}' but got '{:?}'",
                       $re, text, expected, sgot);
             }
         }
diff --git a/src/libregex/vm.rs b/src/libregex/vm.rs
index 914167019d2..04c430da4d2 100644
--- a/src/libregex/vm.rs
+++ b/src/libregex/vm.rs
@@ -152,7 +152,7 @@ impl<'r, 't> Nfa<'r, 't> {
                 // out early.
                 if self.prog.prefix.len() > 0 && clist.size == 0 {
                     let needle = self.prog.prefix.as_bytes();
-                    let haystack = self.input.as_bytes()[self.ic..];
+                    let haystack = self.input.as_bytes().index(&(self.ic..));
                     match find_prefix(needle, haystack) {
                         None => break,
                         Some(i) => {
@@ -503,7 +503,8 @@ impl Threads {
 
     #[inline]
     fn groups<'r>(&'r mut self, i: uint) -> &'r mut [Option<uint>] {
-        self.queue[i].groups.as_mut_slice()
+        let q = &mut self.queue[i];
+        q.groups.as_mut_slice()
     }
 }