@@ -38,11 +38,12 @@ export
38
38
chars,
39
39
substr,
40
40
slice,
41
- split_byte,
42
- splitn_byte,
43
41
split,
44
42
split_str,
45
43
split_char,
44
+ splitn_char,
45
+ split_byte,
46
+ splitn_byte,
46
47
lines,
47
48
lines_any,
48
49
words,
@@ -579,6 +580,34 @@ fn split_char(ss: str, cc: char) -> [str] {
579
580
split ( ss, { |kk| kk == cc} )
580
581
}
581
582
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 = 0 u, current = 0 u, len = byte_len ( ss) ;
593
+ let splits_done = 0 u;
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 += 1 u;
603
+ }
604
+ current = next;
605
+ }
606
+
607
+ vec:: push ( vv, str:: unsafe:: slice_bytes ( ss, start, len) ) ;
608
+ ret vv;
609
+ }
610
+
582
611
/*
583
612
Function: lines
584
613
@@ -808,12 +837,10 @@ fn split_char_iter(ss: str, cc: char, ff: fn(&&str)) {
808
837
Function: splitn_char_iter
809
838
810
839
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
814
841
*/
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)
817
844
}
818
845
819
846
/*
@@ -1541,6 +1568,19 @@ mod tests {
1541
1568
assert [ "ok" ] == split_char ( "ok" , 'z' ) ;
1542
1569
}
1543
1570
1571
+ #[ test]
1572
+ fn test_splitn_char ( ) {
1573
+ let data = "ประเทศไทย中华Việt Nam" ;
1574
+ assert [ "ประเทศไทย中" , "Việt Nam" ]
1575
+ == splitn_char ( data, '华' , 1 u) ;
1576
+
1577
+ assert [ "" , "" , "XXX" , "YYYzWWWz" ]
1578
+ == splitn_char ( "zzXXXzYYYzWWWz" , 'z' , 3 u) ;
1579
+ assert [ "" , ""] == splitn_char ( "z" , 'z' , 5 u) ;
1580
+ assert [ "" ] == splitn_char ( "" , 'z' , 5 u) ;
1581
+ assert [ "ok" ] == splitn_char ( "ok" , 'z' , 5 u) ;
1582
+ }
1583
+
1544
1584
#[ test]
1545
1585
fn test_lines ( ) {
1546
1586
let lf = "\n Mary had a little lamb\n Little lamb\n " ;
@@ -1955,7 +1995,7 @@ mod tests {
1955
1995
1956
1996
let ii = 0 ;
1957
1997
1958
- splitn_char_iter ( data, ' ' as u8 , 2 u) { |xx|
1998
+ splitn_char_iter ( data, ' ' , 2 u) { |xx|
1959
1999
alt ii {
1960
2000
0 { assert "\n Mary" == xx; }
1961
2001
1 { assert "had" == xx; }
0 commit comments