auto merge of #7475 : Seldaek/rust/fixsplit, r=cmr
I almost got locked out of my machine because I misunderstood the purpose of the function and called it with a limit of uint::max_value, which turned this function into an almost endless loop.
This commit is contained in:
commit
c6b0d4f516
@ -434,10 +434,17 @@ pub fn each_split_within<'a>(ss: &'a str,
|
|||||||
let mut last_start = 0;
|
let mut last_start = 0;
|
||||||
let mut last_end = 0;
|
let mut last_end = 0;
|
||||||
let mut state = A;
|
let mut state = A;
|
||||||
|
let mut fake_i = ss.len();
|
||||||
|
let mut lim = lim;
|
||||||
|
|
||||||
let mut cont = true;
|
let mut cont = true;
|
||||||
let slice: &fn() = || { cont = it(ss.slice(slice_start, last_end)) };
|
let slice: &fn() = || { cont = it(ss.slice(slice_start, last_end)) };
|
||||||
|
|
||||||
|
// if the limit is larger than the string, lower it to save cycles
|
||||||
|
if (lim >= fake_i) {
|
||||||
|
lim = fake_i;
|
||||||
|
}
|
||||||
|
|
||||||
let machine: &fn((uint, char)) -> bool = |(i, c)| {
|
let machine: &fn((uint, char)) -> bool = |(i, c)| {
|
||||||
let whitespace = if char::is_whitespace(c) { Ws } else { Cr };
|
let whitespace = if char::is_whitespace(c) { Ws } else { Cr };
|
||||||
let limit = if (i - slice_start + 1) <= lim { UnderLim } else { OverLim };
|
let limit = if (i - slice_start + 1) <= lim { UnderLim } else { OverLim };
|
||||||
@ -466,7 +473,6 @@ pub fn each_split_within<'a>(ss: &'a str,
|
|||||||
ss.iter().enumerate().advance(|x| machine(x));
|
ss.iter().enumerate().advance(|x| machine(x));
|
||||||
|
|
||||||
// Let the automaton 'run out' by supplying trailing whitespace
|
// Let the automaton 'run out' by supplying trailing whitespace
|
||||||
let mut fake_i = ss.len();
|
|
||||||
while cont && match state { B | C => true, A => false } {
|
while cont && match state { B | C => true, A => false } {
|
||||||
machine((fake_i, ' '));
|
machine((fake_i, ' '));
|
||||||
fake_i += 1;
|
fake_i += 1;
|
||||||
@ -2299,6 +2305,7 @@ mod tests {
|
|||||||
use libc;
|
use libc;
|
||||||
use ptr;
|
use ptr;
|
||||||
use str::*;
|
use str::*;
|
||||||
|
use uint;
|
||||||
use vec;
|
use vec;
|
||||||
use vec::{ImmutableVector, CopyableVector};
|
use vec::{ImmutableVector, CopyableVector};
|
||||||
use cmp::{TotalOrd, Less, Equal, Greater};
|
use cmp::{TotalOrd, Less, Equal, Greater};
|
||||||
@ -2444,6 +2451,8 @@ mod tests {
|
|||||||
t("hello", 15, [~"hello"]);
|
t("hello", 15, [~"hello"]);
|
||||||
t("\nMary had a little lamb\nLittle lamb\n", 15,
|
t("\nMary had a little lamb\nLittle lamb\n", 15,
|
||||||
[~"Mary had a", ~"little lamb", ~"Little lamb"]);
|
[~"Mary had a", ~"little lamb", ~"Little lamb"]);
|
||||||
|
t("\nMary had a little lamb\nLittle lamb\n", uint::max_value,
|
||||||
|
[~"Mary had a little lamb\nLittle lamb"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user