Skip to content

Commit 18c3e30

Browse files
killerswanbrson
authored andcommitted
---
yaml --- r: 8121 b: refs/heads/snap-stage3 c: 1aa2394 h: refs/heads/master i: 8119: 4f408d7 v: v3
1 parent 6eff52e commit 18c3e30

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
refs/heads/master: 2898dcc5d97da9427ac367542382b6239d9c0bbf
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 2b0396c34adc95efc0451536554a6f7c928c1e61
4+
refs/heads/snap-stage3: 1aa23947a630fbc5678eeabeca5a653a37871bdd
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/snap-stage3/src/libcore/str.rs

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ export
3838
chars,
3939
substr,
4040
slice,
41-
split_byte,
42-
splitn_byte,
4341
split,
4442
split_str,
4543
split_char,
44+
splitn_char,
45+
split_byte,
46+
splitn_byte,
4647
lines,
4748
lines_any,
4849
words,
@@ -579,6 +580,34 @@ fn split_char(ss: str, cc: char) -> [str] {
579580
split(ss, {|kk| kk == cc})
580581
}
581582

583+
/*
584+
Function: splitn_char
585+
586+
Splits a string into a vector of the substrings separated by a given character
587+
up to `count` times
588+
*/
589+
fn splitn_char(ss: str, sep: char, count: uint) -> [str] unsafe {
590+
591+
let vv = [];
592+
let start = 0u, current = 0u, len = byte_len(ss);
593+
let splits_done = 0u;
594+
595+
while splits_done < count && current < len {
596+
// grab a char...
597+
let {ch, next} = char_range_at(ss, current);
598+
599+
if sep == ch {
600+
vec::push(vv, str::unsafe::slice_bytes(ss, start, current));
601+
start = next;
602+
splits_done += 1u;
603+
}
604+
current = next;
605+
}
606+
607+
vec::push(vv, str::unsafe::slice_bytes(ss, start, len));
608+
ret vv;
609+
}
610+
582611
/*
583612
Function: lines
584613
@@ -808,12 +837,10 @@ fn split_char_iter(ss: str, cc: char, ff: fn(&&str)) {
808837
Function: splitn_char_iter
809838
810839
Apply a function to each substring after splitting
811-
by character, up to nn times
812-
813-
FIXME: make this use chars when splitn/splitn_char is fixed
840+
by character, up to `count` times
814841
*/
815-
fn splitn_char_iter(ss: str, sep: u8, count: uint, ff: fn(&&str)) unsafe {
816-
vec::iter(splitn_byte(ss, sep, count), ff)
842+
fn splitn_char_iter(ss: str, sep: char, count: uint, ff: fn(&&str)) unsafe {
843+
vec::iter(splitn_char(ss, sep, count), ff)
817844
}
818845

819846
/*
@@ -1541,6 +1568,19 @@ mod tests {
15411568
assert ["ok"] == split_char("ok", 'z');
15421569
}
15431570

1571+
#[test]
1572+
fn test_splitn_char () {
1573+
let data = "ประเทศไทย中华Việt Nam";
1574+
assert ["ประเทศไทย中", "Việt Nam"]
1575+
== splitn_char(data, '华', 1u);
1576+
1577+
assert ["", "", "XXX", "YYYzWWWz"]
1578+
== splitn_char("zzXXXzYYYzWWWz", 'z', 3u);
1579+
assert ["",""] == splitn_char("z", 'z', 5u);
1580+
assert [""] == splitn_char("", 'z', 5u);
1581+
assert ["ok"] == splitn_char("ok", 'z', 5u);
1582+
}
1583+
15441584
#[test]
15451585
fn test_lines () {
15461586
let lf = "\nMary had a little lamb\nLittle lamb\n";
@@ -1955,7 +1995,7 @@ mod tests {
19551995

19561996
let ii = 0;
19571997

1958-
splitn_char_iter(data, ' ' as u8, 2u) {|xx|
1998+
splitn_char_iter(data, ' ', 2u) {|xx|
19591999
alt ii {
19602000
0 { assert "\nMary" == xx; }
19612001
1 { assert "had" == xx; }

0 commit comments

Comments
 (0)