Skip to content

Commit f104c09

Browse files
committed
---
yaml --- r: 14333 b: refs/heads/try c: 23703c0 h: refs/heads/master i: 14331: a22f373 v: v3
1 parent cf58d50 commit f104c09

File tree

2 files changed

+47
-8
lines changed

2 files changed

+47
-8
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: 042a5222d1f324a60b61bbc58f3938770d3e0cd0
5+
refs/heads/try: 23703c06613b6740113ac799747c394f37eb51e7
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/libcore/str.rs

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export
7575
rindex,
7676
find,
7777
find_bytes,
78+
find_from_bytes,
7879
contains,
7980
starts_with,
8081
ends_with,
@@ -901,23 +902,33 @@ fn rindex(ss: str, cc: char) -> option<uint> {
901902
//
902903
// Find the char position of the first instance of one string
903904
// within another, or return option::none
905+
fn find_bytes(haystack: str, needle: str) -> option<uint> {
906+
find_from_bytes(haystack, needle, 0u, len_bytes(haystack))
907+
}
908+
909+
//Function: find_from_bytes
910+
//
911+
// Find the char position of the first instance of one string
912+
// within another, or return option::none
904913
//
905914
// FIXME: Boyer-Moore should be significantly faster
906-
fn find_bytes(haystack: str, needle: str) -> option<uint> {
907-
let haystack_len = len_bytes(haystack);
908-
let needle_len = len_bytes(needle);
915+
fn find_from_bytes(haystack: str, needle: str, start: uint, end:uint)
916+
-> option<uint> {
917+
assert end <= len_bytes(haystack);
918+
919+
let needle_len = len_bytes(needle);
909920

910-
if needle_len == 0u { ret some(0u); }
911-
if needle_len > haystack_len { ret none; }
921+
if needle_len == 0u { ret some(start); }
922+
if needle_len > end { ret none; }
912923

913924
fn match_at(haystack: str, needle: str, ii: uint) -> bool {
914925
let jj = ii;
915926
for c: u8 in needle { if haystack[jj] != c { ret false; } jj += 1u; }
916927
ret true;
917928
}
918929

919-
let ii = 0u;
920-
while ii <= haystack_len - needle_len {
930+
let ii = start;
931+
while ii <= end - needle_len {
921932
if match_at(haystack, needle, ii) { ret some(ii); }
922933
ii += 1u;
923934
}
@@ -1757,6 +1768,34 @@ mod tests {
17571768
assert (find_bytes(data, "ไท华") == none);
17581769
}
17591770

1771+
#[test]
1772+
fn test_find_from_bytes() {
1773+
// byte positions
1774+
assert (find_from_bytes("", "", 0u, 0u) == some(0u));
1775+
1776+
let data = "abcabc";
1777+
assert find_from_bytes(data, "ab", 0u, 6u) == some(0u);
1778+
assert find_from_bytes(data, "ab", 2u, 6u) == some(3u);
1779+
assert find_from_bytes(data, "ab", 2u, 4u) == none;
1780+
1781+
let data = "ประเทศไทย中华Việt Nam";
1782+
data += data;
1783+
assert find_from_bytes(data, "", 0u, 43u) == some(0u);
1784+
assert find_from_bytes(data, "", 6u, 43u) == some(6u);
1785+
1786+
assert find_from_bytes(data, "ประ", 0u, 43u) == some( 0u);
1787+
assert find_from_bytes(data, "ทศไ", 0u, 43u) == some(12u);
1788+
assert find_from_bytes(data, "ย中", 0u, 43u) == some(24u);
1789+
assert find_from_bytes(data, "iệt", 0u, 43u) == some(34u);
1790+
assert find_from_bytes(data, "Nam", 0u, 43u) == some(40u);
1791+
1792+
assert find_from_bytes(data, "ประ", 43u, 86u) == some(43u);
1793+
assert find_from_bytes(data, "ทศไ", 43u, 86u) == some(55u);
1794+
assert find_from_bytes(data, "ย中", 43u, 86u) == some(67u);
1795+
assert find_from_bytes(data, "iệt", 43u, 86u) == some(77u);
1796+
assert find_from_bytes(data, "Nam", 43u, 86u) == some(83u);
1797+
}
1798+
17601799
#[test]
17611800
fn test_find() {
17621801
// char positions

0 commit comments

Comments
 (0)