From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1866 invoked from network); 3 Jul 2001 17:32:40 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 3 Jul 2001 17:32:40 -0000 Received: (qmail 1165 invoked by alias); 3 Jul 2001 17:31:41 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 15242 Received: (qmail 1142 invoked from network); 3 Jul 2001 17:31:40 -0000 Date: Tue, 3 Jul 2001 13:32:30 -0400 From: Clint Adams To: Bart Schaefer Cc: zsh-workers@sunsite.dk Subject: Re: PATCH: zsh/pcre module docs Message-ID: <20010703133230.A5697@dman.com> References: <20010703125123.A5242@dman.com> <1010703170319.ZM14785@candle.brasslantern.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <1010703170319.ZM14785@candle.brasslantern.com>; from schaefer@candle.brasslantern.com on Tue, Jul 03, 2001 at 05:03:19PM +0000 > Wouldn't it have been better to put these in the $match array (or into > some other named array) the way that backrefs in glob patterns do? Yes. > pcre_match ... > set - "$match[@]" # or whatever it is named > > For comlete generality, pcre_match could take the name of the array to set > as an argument; then the above could be accomplished with > > pcre_match -a argv ... Both are implemented, though now you can pass a second argument to pcre_match that will be ignored. Index: Doc/Zsh/mod_pcre.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/mod_pcre.yo,v retrieving revision 1.2 diff -u -r1.2 mod_pcre.yo --- Doc/Zsh/mod_pcre.yo 2001/07/03 16:52:35 1.2 +++ Doc/Zsh/mod_pcre.yo 2001/07/03 17:30:05 @@ -15,12 +15,13 @@ 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() Index: Src/Modules/pcre.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Modules/pcre.c,v retrieving revision 1.2 diff -u -r1.2 pcre.c --- Src/Modules/pcre.c 2001/07/03 16:42:36 1.2 +++ Src/Modules/pcre.c 2001/07/03 17:30:05 @@ -90,8 +90,16 @@ 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)) { zwarnnam(nam, "error in fullinfo", NULL, 0); @@ -107,9 +115,12 @@ 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 @@ #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) }; /**/