Ticket #1483: mixed_cs_index.diff

File mixed_cs_index.diff, 2.2 KB (added by mls, 5 years ago)
  • src/string/charset/ascii.c

     
    596596{ 
    597597    ASSERT_ARGS(mixed_cs_index) 
    598598    String_iter src_iter, search_iter; 
    599     UINTVAL len, next_pos; 
    600     INTVAL found_at; 
     599    UINTVAL len, c1, c2, c2first, maxoffs; 
    601600 
    602601    ENCODING_ITER_INIT(interp, src, &src_iter); 
    603602    src_iter.set_position(interp, &src_iter, offs); 
    604603    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; 
    619615        } 
    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; 
    631622        } 
     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); 
    632628    } 
    633     if (len == 0) 
    634         return found_at; 
    635629    return -1; 
    636630} 
    637631