diff options
author | Peter Stephenson <pws@zsh.org> | 2015-06-12 09:30:39 +0100 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2015-06-12 09:30:39 +0100 |
commit | f1923bdfa6300a0d32e3329eb2488447f76b8970 (patch) | |
tree | eed76e87f3e28384f5597030978d802265715a14 /Src/Modules/regex.c | |
parent | 370e7f73f68af06aaf1595bc8b16ec7e8c910409 (diff) | |
download | zsh-f1923bdfa6300a0d32e3329eb2488447f76b8970.tar.gz zsh-f1923bdfa6300a0d32e3329eb2488447f76b8970.tar.xz zsh-f1923bdfa6300a0d32e3329eb2488447f76b8970.zip |
Add non-metafied character length handling.
Use this in regex module and add test using $'\ua0'. Rename mb_metacharinit() to mb_charinit() as it does not involve metafied characters.
Diffstat (limited to 'Src/Modules/regex.c')
-rw-r--r-- | Src/Modules/regex.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/Src/Modules/regex.c b/Src/Modules/regex.c index ce57de986..94f523f32 100644 --- a/Src/Modules/regex.c +++ b/Src/Modules/regex.c @@ -115,6 +115,7 @@ zcond_regex_match(char **a, int id) } else { zlong offs; char *ptr; + int clen, leftlen; m = matches; s = metafy(lhstr + m->rm_so, m->rm_eo - m->rm_so, META_DUP); @@ -123,19 +124,25 @@ zcond_regex_match(char **a, int id) * Count the characters before the match. */ ptr = lhstr; + leftlen = m->rm_so; offs = 0; - MB_METACHARINIT(); - while (ptr < lhstr + m->rm_so) { + MB_CHARINIT(); + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } setiparam("MBEGIN", offs + !isset(KSHARRAYS)); /* * Add on the characters in the match. */ - while (ptr < lhstr + m->rm_eo) { + leftlen = m->rm_eo - m->rm_so; + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } setiparam("MEND", offs + !isset(KSHARRAYS) - 1); if (nelem) { @@ -149,19 +156,25 @@ zcond_regex_match(char **a, int id) { char buf[DIGBUFSIZE]; ptr = lhstr; + leftlen = m->rm_so; offs = 0; /* Find the start offset */ - MB_METACHARINIT(); - while (ptr < lhstr + m->rm_so) { + MB_CHARINIT(); + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } convbase(buf, offs + !isset(KSHARRAYS), 10); *bptr = ztrdup(buf); /* Continue to the end offset */ - while (ptr < lhstr + m->rm_eo) { + leftlen = m->rm_eo - m->rm_so; + while (leftlen ) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } convbase(buf, offs + !isset(KSHARRAYS) - 1, 10); *eptr = ztrdup(buf); |