[svn:parrot] r46573 - trunk/src/string/charset
cotto at svn.parrot.org
cotto at svn.parrot.org
Thu May 13 06:39:55 UTC 2010
Author: cotto
Date: Thu May 13 06:39:55 2010
New Revision: 46573
URL: https://trac.parrot.org/parrot/changeset/46573
Log:
revert r46564, which caused some issues for ops_pct
Modified:
trunk/src/string/charset/ascii.c
Modified: trunk/src/string/charset/ascii.c
==============================================================================
--- trunk/src/string/charset/ascii.c Thu May 13 05:41:26 2010 (r46572)
+++ trunk/src/string/charset/ascii.c Thu May 13 06:39:55 2010 (r46573)
@@ -531,32 +531,43 @@
UINTVAL offs)
{
ASSERT_ARGS(mixed_cs_index)
-
String_iter src_iter, search_iter;
- const UINTVAL maxpos = src->strlen - search->strlen + 1;
- const UINTVAL cfirst = Parrot_str_indexed(interp, search, 0);
+ UINTVAL len, next_pos;
+ INTVAL found_at;
ENCODING_ITER_INIT(interp, src, &src_iter);
src_iter.set_position(interp, &src_iter, offs);
ENCODING_ITER_INIT(interp, search, &search_iter);
+ len = search->strlen;
+
+ found_at = -1;
+ next_pos = offs;
- while (src_iter.charpos < maxpos) {
- if (cfirst == src_iter.get_and_advance(interp, &src_iter)) {
- const INTVAL next_pos = src_iter.charpos;
- const INTVAL next_byte = src_iter.bytepos;
- UINTVAL len;
- search_iter.set_position(interp, &search_iter, 1);
- for (len = search->strlen - 1; len; --len) {
- if ((src_iter.get_and_advance(interp, &src_iter)) !=
- (search_iter.get_and_advance(interp, &search_iter)))
- break;
+ for (; len && offs < src->strlen ;) {
+ const UINTVAL c1 = src_iter.get_and_advance(interp, &src_iter);
+ const UINTVAL c2 = search_iter.get_and_advance(interp, &search_iter);
+
+ if (c1 == c2) {
+ --len;
+ if (found_at == -1)
+ found_at = offs;
+ ++offs;
+ }
+ else {
+ len = search->strlen;
+ ++offs;
+ ++next_pos;
+ if (offs != next_pos) {
+ src_iter.set_position(interp, &src_iter, next_pos);
+ offs = next_pos;
}
- if (len == 0)
- return next_pos - 1;
- src_iter.charpos = next_pos;
- src_iter.bytepos = next_byte;
+
+ found_at = -1;
+ search_iter.set_position(interp, &search_iter, 0);
}
}
+ if (len == 0)
+ return found_at;
return -1;
}
More information about the parrot-commits
mailing list