diff options
| author | Barton E. Schaefer <schaefer@zsh.org> | 2016-01-08 20:42:00 -0800 |
|---|---|---|
| committer | Barton E. Schaefer <schaefer@zsh.org> | 2016-01-08 20:42:00 -0800 |
| commit | 5eae5b58b1b99946e14ac8ddc54dc14189a56a6c (patch) | |
| tree | 40bf9b5f043c3351f160bcc1805e05a85144b860 /Src/Modules | |
| parent | unposted: Src/builtin.c: refine READ_MSTREAM to avoid unsequenced evaluation (diff) | |
| download | zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.gz zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.bz2 zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.lz zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.xz zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.zst zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.zip | |
Jun T.: 37515: multibyte handling as per 35448.
Diffstat (limited to 'Src/Modules')
| -rw-r--r-- | Src/Modules/pcre.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/Src/Modules/pcre.c b/Src/Modules/pcre.c index 2393cd1e7..aa5c8ed5b 100644 --- a/Src/Modules/pcre.c +++ b/Src/Modules/pcre.c @@ -190,18 +190,25 @@ zpcre_get_substrings(char *arg, int *ovec, int ret, char *matchvar, if (want_begin_end) { char *ptr = arg; zlong offs = 0; + int clen, leftlen; /* Count the characters before the match */ - MB_METACHARINIT(); - while (ptr < arg + ovec[0]) { + MB_CHARINIT(); + leftlen = ovec[0]; + 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 < arg + ovec[1]) { + leftlen = ovec[1] - ovec[0]; + while (leftlen) { offs++; - ptr += MB_METACHARLEN(ptr); + clen = MB_CHARLEN(ptr, leftlen); + ptr += clen; + leftlen -= clen; } setiparam("MEND", offs + !isset(KSHARRAYS) - 1); if (nelem) { @@ -219,17 +226,23 @@ zpcre_get_substrings(char *arg, int *ovec, int ret, char *matchvar, ptr = arg; offs = 0; /* Find the start offset */ - MB_METACHARINIT(); - while (ptr < arg + ipair[0]) { + MB_CHARINIT(); + leftlen = ipair[0]; + 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 < arg + ipair[1]) { + leftlen = ipair[1] - ipair[0]; + 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); |
