about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2024-01-26 07:33:38 +0100
committerOliver Kiddle <opk@zsh.org>2024-01-26 07:33:38 +0100
commit698af7bc1387462c8e87767d7eaeb7e30c6f0b2b (patch)
tree1c21f23ef05fc90b5747e41c5d7d0915f9096071
parent742049a4cbd9c4f1683081cb812aef994415f112 (diff)
downloadzsh-698af7bc1387462c8e87767d7eaeb7e30c6f0b2b.tar.gz
zsh-698af7bc1387462c8e87767d7eaeb7e30c6f0b2b.tar.xz
zsh-698af7bc1387462c8e87767d7eaeb7e30c6f0b2b.zip
52405, 52502: add empty elements to $match for optional captures that don't match
-rw-r--r--ChangeLog3
-rw-r--r--Src/Modules/pcre.c5
-rw-r--r--Test/V07pcre.ztst5
3 files changed, 12 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 280eac2de..e73320081 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2024-01-26  Oliver Kiddle  <opk@zsh.org>
 
+	* 52405, 52502: Src/Modules/pcre.c, Test/V07pcre.ztst:
+	add empty elements to $match for optional captures that don't match
+
 	* github #110: opensauce04: Completion/Redhat/Command/_dnf:
 	Fix incorrect completion for `dnf --showduplicates`
 
diff --git a/Src/Modules/pcre.c b/Src/Modules/pcre.c
index e48ae3ae5..a49d1a307 100644
--- a/Src/Modules/pcre.c
+++ b/Src/Modules/pcre.c
@@ -391,6 +391,8 @@ bin_pcre_match(char *nam, char **args, Options ops, UNUSED(int func))
 	pcre_mdata = pcre2_match_data_create_from_pattern(pcre_pattern, NULL);
 	ret = pcre2_match(pcre_pattern, (PCRE2_SPTR) plaintext, subject_len,
 		offset_start, 0, pcre_mdata, mcontext);
+	if (ret > 0)
+	    ret = pcre2_get_ovector_count(pcre_mdata);
     }
 
     if (ret==0) return_value = 0;
@@ -479,7 +481,8 @@ cond_pcre_match(char **a, int id)
 		    break;
 		}
                 else if (r>0) {
-		    zpcre_get_substrings(pcre_pat, lhstr_plain, pcre_mdata, r, svar, avar,
+		    uint32_t ovec_count = pcre2_get_ovector_count(pcre_mdata);
+		    zpcre_get_substrings(pcre_pat, lhstr_plain, pcre_mdata, ovec_count, svar, avar,
 			    ".pcre.match", 0, isset(BASHREMATCH), !isset(BASHREMATCH));
 		    return_value = 1;
 		    break;
diff --git a/Test/V07pcre.ztst b/Test/V07pcre.ztst
index 585698d05..b8cd31c96 100644
--- a/Test/V07pcre.ztst
+++ b/Test/V07pcre.ztst
@@ -108,6 +108,11 @@
 >0 xo→t →t
 >0 Xo→t →t
 
+  [[ foo =~ (pre)?f(o*)(opt(i)onal)?(y)* ]]
+  typeset -p match
+0:Empty string for optional captures that don't match
+>typeset -g -a match=( '' oo '' '' '' )
+
   string="The following zip codes: 78884 90210 99513"
   pcre_compile -m "\d{5}"
   pcre_match -b -- $string && print "$MATCH; ZPCRE_OP: $ZPCRE_OP"