Index: src/string/charset/ascii.c =================================================================== --- src/string/charset/ascii.c (revision 44499) +++ src/string/charset/ascii.c (working copy) @@ -596,42 +596,36 @@ { ASSERT_ARGS(mixed_cs_index) String_iter src_iter, search_iter; - UINTVAL len, next_pos; - INTVAL found_at; + UINTVAL len, c1, c2, c2first, maxoffs; 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; - - 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; + if (search->strlen == 0) + return -1; /* return 0 instead? */ + c2first = search_iter.get_and_advance(interp, &search_iter); + if (src->strlen < search->strlen) + return -1; + maxoffs = src->strlen - search->strlen + 1; + while (offs < maxoffs) { + c1 = src_iter.get_and_advance(interp, &src_iter); + if (c1 != c2first) { + offs++; + continue; } - else { - len = search->strlen; - ++offs; - ++next_pos; - if (offs != next_pos) { - src_iter.set_position(interp, &src_iter, next_pos); - offs = next_pos; - } - - found_at = -1; - search_iter.set_position(interp, &search_iter, 0); + len = search->strlen; + while (--len > 0) { + c1 = src_iter.get_and_advance(interp, &src_iter); + c2 = search_iter.get_and_advance(interp, &search_iter); + if (c1 != c2) + break; } + if (!len) + return offs; + offs++; + src_iter.set_position(interp, &src_iter, offs); + search_iter.set_position(interp, &search_iter, 1); } - if (len == 0) - return found_at; return -1; }