about summary refs log tree commit diff
path: root/Src/Modules
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2016-01-08 20:42:00 -0800
committerBarton E. Schaefer <schaefer@zsh.org>2016-01-08 20:42:00 -0800
commit5eae5b58b1b99946e14ac8ddc54dc14189a56a6c (patch)
tree40bf9b5f043c3351f160bcc1805e05a85144b860 /Src/Modules
parent424b417063b50173bbd9dcf8a8252b281dcbcd50 (diff)
downloadzsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.gz
zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.tar.xz
zsh-5eae5b58b1b99946e14ac8ddc54dc14189a56a6c.zip
Jun T.: 37515: multibyte handling as per 35448.
Diffstat (limited to 'Src/Modules')
-rw-r--r--Src/Modules/pcre.c33
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);