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/pcre.c | |
parent | 424b417063b50173bbd9dcf8a8252b281dcbcd50 (diff) | |
download | zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.gz zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.xz zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.zip |
Jun T.: 37515: multibyte handling as per 35448.
Diffstat (limited to 'Src/Modules/pcre.c')
-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); |