- }
- else {
- while (s < send) {
- STRLEN len;
- const UV comp = utf8n_to_uvchr(s, send - s, &len,
- UTF8_ALLOW_DEFAULT);
- I32 ch;
- if (comp > 0xff) {
- if (!complement) {
- Move(s, d, len, U8);
- d += len;
- }
- else {
- /* use the implicit 0x100..0x7fffffff search range */
- matches++;
- if (!del) {
- if (comp - 0x100 < rlen)
- d = uvchr_to_utf8(d, tbl[comp+1]);
- else
- d = uvchr_to_utf8(d, tbl[0x100+rlen]);
- }
- }
- }
- else if ((ch = tbl[comp]) >= 0) {
- d = uvchr_to_utf8(d, ch);
- matches++;
- }
- else if (ch == -1) { /* -1 is unmapped character */
- Move(s, d, len, U8);
- d += len;
- }
- else if (ch == -2) /* -2 is delete character */
- matches++;
- s += len;
- }
- }