diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Doc/Zsh/mod_pcre.yo | 7 | ||||
-rw-r--r-- | Src/Modules/pcre.c | 21 |
3 files changed, 25 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index 973f68931..889e4075e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2001-07-03 Clint Adams <clint@zsh.org> + * 15242: Doc/Zsh/mod_pcre.yo, + Src/Modules/pcre.c: set $match + instead of pparams. pcre_match -a + sets specified array instead of $match. + * 15234: Doc/Zsh/mod_pcre.yo: describe behavior introduced by 15228. diff --git a/Doc/Zsh/mod_pcre.yo b/Doc/Zsh/mod_pcre.yo index 2d9989083..8eadee38b 100644 --- a/Doc/Zsh/mod_pcre.yo +++ b/Doc/Zsh/mod_pcre.yo @@ -15,12 +15,13 @@ Studies the previously-compiled PCRE which may result in faster matching. ) findex(pcre_match) -item(tt(pcre_match) var(string))( +item(tt(pcre_match) [ tt(-a) var(arr) ] var(string))( Returns successfully if tt(string) matches the previously-compiled PCRE. If the expression captures substrings within parentheses, -tt(pcre_match) will set the positional parameters to -those substrings, starting with $1 for the first. +tt(pcre_match) will set the array var($match) to those +substrings, unless the tt(-a) option is given, in which +case it will set the array var(arr). ) enditem() diff --git a/Src/Modules/pcre.c b/Src/Modules/pcre.c index 899056c6f..334522130 100644 --- a/Src/Modules/pcre.c +++ b/Src/Modules/pcre.c @@ -90,7 +90,15 @@ static int bin_pcre_match(char *nam, char **args, char *ops, int func) { int ret, capcount, *ovec, ovecsize; - char **captures; + char **captures, **matches, *receptacle = NULL; + + if(ops['a']) { + receptacle = *args++; + if(!*args) { + zwarnnam(nam, "not enough arguments", NULL, 0); + return 1; + } + } if (pcre_fullinfo(pcre_pattern, pcre_hints, PCRE_INFO_CAPTURECOUNT, &capcount)) { @@ -107,9 +115,12 @@ bin_pcre_match(char *nam, char **args, char *ops, int func) else if (ret==PCRE_ERROR_NOMATCH) return 1; /* no match */ else if (ret>0) { if(!pcre_get_substring_list(*args, ovec, ret, (const char ***)&captures)) { - - freearray(pparams); - pparams = zarrdup(&captures[1]); /* first one would be entire string */ + + matches = zarrdup(&captures[1]); /* first one would be entire string */ + if (receptacle == NULL) + setaparam("match", matches); + else + setaparam(receptacle, matches); pcre_free_substring_list((const char **)captures); return 0; @@ -128,7 +139,7 @@ static struct builtin bintab[] = { #ifdef HAVE_PCRE_STUDY BUILTIN("pcre_study", 0, bin_pcre_study, 0, 0, 0, NULL, NULL), #endif - BUILTIN("pcre_match", 0, bin_pcre_match, 1, 1, 0, NULL, NULL) + BUILTIN("pcre_match", 0, bin_pcre_match, 1, 2, 0, "a", NULL) }; /**/ |