Ticket #1483: mixed_cs_index.diff
File mixed_cs_index.diff, 2.2 KB (added by mls, 12 years ago) |
---|
-
src/string/charset/ascii.c
596 596 { 597 597 ASSERT_ARGS(mixed_cs_index) 598 598 String_iter src_iter, search_iter; 599 UINTVAL len, next_pos; 600 INTVAL found_at; 599 UINTVAL len, c1, c2, c2first, maxoffs; 601 600 602 601 ENCODING_ITER_INIT(interp, src, &src_iter); 603 602 src_iter.set_position(interp, &src_iter, offs); 604 603 ENCODING_ITER_INIT(interp, search, &search_iter); 605 len = search->strlen; 606 607 found_at = -1; 608 next_pos = offs; 609 610 for (; len && offs < src->strlen ;) { 611 const UINTVAL c1 = src_iter.get_and_advance(interp, &src_iter); 612 const UINTVAL c2 = search_iter.get_and_advance(interp, &search_iter); 613 614 if (c1 == c2) { 615 --len; 616 if (found_at == -1) 617 found_at = offs; 618 ++offs; 604 if (search->strlen == 0) 605 return -1; /* return 0 instead? */ 606 c2first = search_iter.get_and_advance(interp, &search_iter); 607 if (src->strlen < search->strlen) 608 return -1; 609 maxoffs = src->strlen - search->strlen + 1; 610 while (offs < maxoffs) { 611 c1 = src_iter.get_and_advance(interp, &src_iter); 612 if (c1 != c2first) { 613 offs++; 614 continue; 619 615 } 620 else { 621 len = search->strlen; 622 ++offs; 623 ++next_pos; 624 if (offs != next_pos) { 625 src_iter.set_position(interp, &src_iter, next_pos); 626 offs = next_pos; 627 } 628 629 found_at = -1; 630 search_iter.set_position(interp, &search_iter, 0); 616 len = search->strlen; 617 while (--len > 0) { 618 c1 = src_iter.get_and_advance(interp, &src_iter); 619 c2 = search_iter.get_and_advance(interp, &search_iter); 620 if (c1 != c2) 621 break; 631 622 } 623 if (!len) 624 return offs; 625 offs++; 626 src_iter.set_position(interp, &src_iter, offs); 627 search_iter.set_position(interp, &search_iter, 1); 632 628 } 633 if (len == 0)634 return found_at;635 629 return -1; 636 630 } 637 631