From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24260 invoked from network); 3 Jul 2001 16:22:02 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 3 Jul 2001 16:22:02 -0000 Received: (qmail 25583 invoked by alias); 3 Jul 2001 16:20:52 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 15228 Received: (qmail 25562 invoked from network); 3 Jul 2001 16:20:50 -0000 Date: Tue, 3 Jul 2001 12:21:35 -0400 From: Clint Adams To: Andrej Borsenkow Cc: zsh-workers@sunsite.dk Subject: Re: PATCH: zsh/pcre module Message-ID: <20010703122135.A4396@dman.com> References: <20010702153553.A22477@dman.com> <001e01c1038d$784822b0$21c9ca95@mow.siemens.ru> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <001e01c1038d$784822b0$21c9ca95@mow.siemens.ru>; from Andrej.Borsenkow@mow.siemens.ru on Tue, Jul 03, 2001 at 10:57:48AM +0400 > I urge everybody to use AC_SEARCH_LIB. AC_CHECK_LIB has nasty habit of > adding library even when it is not needed; moreover, it does it in front, > thus sometimes preventing you from using your own library. This switches AC_CHECK_LIB to AC_SEARCH_LIBS. It sets positional parameters with the contents of capture buffers. Index: zshconfig.ac =================================================================== RCS file: /cvsroot/zsh/zsh/zshconfig.ac,v retrieving revision 1.15 diff -u -r1.15 zshconfig.ac --- zshconfig.ac 2001/07/03 05:59:55 1.15 +++ zshconfig.ac 2001/07/03 16:04:11 @@ -644,7 +644,7 @@ AC_CHECK_LIB(socket, socket) dnl pcre-config should probably be employed here -AC_CHECK_LIB(pcre, pcre_compile) +AC_SEARCH_LIBS(pcre_compile, pcre) dnl --------------------- dnl CHECK TERMCAP LIBRARY Index: Src/Modules/pcre.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Modules/pcre.c,v retrieving revision 1.1 diff -u -r1.1 pcre.c --- Src/Modules/pcre.c 2001/07/02 19:39:35 1.1 +++ Src/Modules/pcre.c 2001/07/03 16:04:11 @@ -27,11 +27,12 @@ * */ -/**/ -#if defined(HAVE_PCRE_COMPILE) && defined(HAVE_PCRE_EXEC) #include "pcre.mdh" #include "pcre.pro" + +/**/ +#if defined(HAVE_PCRE_COMPILE) && defined(HAVE_PCRE_EXEC) #include static pcre *pcre_pattern; @@ -49,6 +50,8 @@ if(ops['m']) pcre_opts |= PCRE_MULTILINE; if(ops['x']) pcre_opts |= PCRE_EXTENDED; + pcre_hints = NULL; /* Is this necessary? */ + pcre_pattern = pcre_compile(*args, pcre_opts, &pcre_error, &pcre_errptr, NULL); if (pcre_pattern == NULL) @@ -86,11 +89,38 @@ static int bin_pcre_match(char *nam, char **args, char *ops, int func) { -#define PCRE_OVEC_SIZE 50 + int ret, capcount, *ovec, ovecsize; + char **captures; - int ovec[PCRE_OVEC_SIZE]; /* throwing this away now, but will be useful someday */ + if (pcre_fullinfo(pcre_pattern, pcre_hints, PCRE_INFO_CAPTURECOUNT, &capcount)) + { + zwarnnam(nam, "error in fullinfo", NULL, 0); + return 1; + } + + ovecsize = (capcount+1)*3; + ovec = zalloc(ovecsize*sizeof(int)); + + ret = pcre_exec(pcre_pattern, pcre_hints, *args, strlen(*args), 0, 0, ovec, ovecsize); + + if (ret==0) return 0; + 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 */ + + pcre_free_substring_list((const char **)captures); + return 0; + } + } + else { + zwarnnam(nam, "error in pcre_exec", NULL, 0); + return 1; + } - return !(pcre_exec(pcre_pattern, pcre_hints, *args, strlen(*args), 0, 0, ovec, PCRE_OVEC_SIZE) >= 0); + return 1; } static struct builtin bintab[] = {