[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