comparison src/search.c @ 4901:7504864a986c

Don't use Boyer-Moore if repeated octets & case-insensitive search. 2010-01-30 Aidan Kehoe <kehoea@parhasard.net> * search.c (search_buffer): Don't use Boyer-Moore for case-insensitive search if the search pattern contains repeated Ibytes and the corresponding character has case information (or, equivalently, if one of its case equivalents would contain repeated Ibytes).
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 30 Jan 2010 22:25:39 +0000
parents 91a023144e72
children e91e3e353805
comparison
equal deleted inserted replaced
4900:0eccfd4850d6 4901:7504864a986c
1423 boyer_moore(). */ 1423 boyer_moore(). */
1424 boyer_moore_ok = 0; 1424 boyer_moore_ok = 0;
1425 break; 1425 break;
1426 } 1426 }
1427 } 1427 }
1428
1429 if (ichar_len (c) > 2)
1430 {
1431 /* Case-equivalence plus repeated octets throws off
1432 the construction of the stride table; avoid this.
1433
1434 It should be possible to correct boyer_moore to
1435 behave correctly even in this case--it doesn't have
1436 problems with repeated octets when case conversion
1437 is not involved--but this is not a critical
1438 issue. */
1439 Ibyte encoded[MAX_ICHAR_LEN];
1440 Bytecount len = set_itext_ichar (encoded, c);
1441 int i, j;
1442 for (i = 0; i < len && boyer_moore_ok; ++i)
1443 {
1444 for (j = 0; i < len && boyer_moore_ok; ++j)
1445 {
1446 if (encoded[i] == encoded[j])
1447 {
1448 boyer_moore_ok = 0;
1449 }
1450 }
1451 }
1452
1453 if (0 == boyer_moore_ok)
1454 {
1455 break;
1456 }
1457 }
1458
1428 } while (c != starting_c); 1459 } while (c != starting_c);
1429 1460
1430 if (!checked) 1461 if (!checked)
1431 { 1462 {
1432 #ifdef DEBUG_XEMACS 1463 #ifdef DEBUG_XEMACS