From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18526 invoked from network); 2 Jul 2001 19:36:08 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 2 Jul 2001 19:36:08 -0000 Received: (qmail 8683 invoked by alias); 2 Jul 2001 19:35:09 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 15211 Received: (qmail 8660 invoked from network); 2 Jul 2001 19:35:07 -0000 Date: Mon, 2 Jul 2001 15:35:53 -0400 From: Clint Adams To: zsh-workers@sunsite.dk Subject: PATCH: zsh/pcre module Message-ID: <20010702153553.A22477@dman.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i This adds via builtins in the zsh/pcre module, linked with a PCRE library rudimentary support for perl5-compatible regular expressions. I imagine that further augmentation would be of use, including the capturing of substrings (and putting them in positional parameters?) The module should probably complain on systems without pcre_*. Index: zshconfig.ac =================================================================== RCS file: /cvsroot/zsh/zsh/zshconfig.ac,v retrieving revision 1.13 diff -u -r1.13 zshconfig.ac --- zshconfig.ac 2001/07/02 11:33:26 1.13 +++ zshconfig.ac 2001/07/02 19:27:06 @@ -475,7 +475,7 @@ limits.h fcntl.h libc.h sys/utsname.h sys/resource.h \ locale.h errno.h stdlib.h unistd.h sys/capability.h \ utmp.h utmpx.h sys/types.h pwd.h grp.h poll.h sys/mman.h \ - netinet/in_systm.h) + netinet/in_systm.h, pcre.h) if test $dynamic = yes; then AC_CHECK_HEADERS(dlfcn.h) AC_CHECK_HEADERS(dl.h) @@ -643,6 +643,9 @@ AC_CHECK_LIB(socket, socket) +dnl pcre-config should probably be employed here +AC_CHECK_LIB(pcre, pcre_compile) + dnl --------------------- dnl CHECK TERMCAP LIBRARY dnl --------------------- @@ -933,7 +936,8 @@ putenv getenv \ brk sbrk \ pathconf sysconf \ - tgetent tigetflag tigetnum tigetstr setupterm) + tgetent tigetflag tigetnum tigetstr setupterm \ + pcre_compile pcre_study pcre_exec) AC_FUNC_STRCOLL dnl Check if tgetent accepts NULL (and will allocate its own termcap buffer) Index: Doc/Zsh/mod_pcre.yo =================================================================== RCS file: mod_pcre.yo diff -N mod_pcre.yo --- /dev/null Thu May 24 22:33:05 2001 +++ mod_pcre.yo Mon Jul 2 12:27:06 2001 @@ -0,0 +1,22 @@ +COMMENT(!MOD!zsh/pcre +Interface to the PCRE library. +!MOD!) +cindex(regular expressions, perl-compatible) +The tt(zsh/pcre) module makes some commands available as builtins: + +startitem() +findex(pcre_compile) +item(tt(pcre_compile) [ tt(-aimx) ] var(PCRE))( +Compiles a perl-compatible regular expression. +) +findex(pcre_study) +item(tt(pcre_study))( +Studies the previously-compiled PCRE which may result in faster +matching. +) +findex(pcre_match) +item(tt(pcre_match) var(string))( +Returns successfully if tt(string) matches the previously-compiled +PCRE. +) +enditem() Index: Functions/Example/zpgrep =================================================================== RCS file: zpgrep diff -N zpgrep --- /dev/null Thu May 24 22:33:05 2001 +++ zpgrep Mon Jul 2 12:27:06 2001 @@ -0,0 +1,25 @@ +# Usage: zpgrep ... +# + +zpgrep() { +local file pattern + +pattern=$1 +shift + +if ((! ARGC)) then + set -- - +fi + +pcre_compile $pattern +pcre_study + +for file +do + if [[ "$file" == - ]] then + while read -u0 buf; do pcre_match $buf && print $buf; done + else + while read -u0 buf; do pcre_match $buf && print $buf; done < "$file" + fi +done +} Index: Src/Modules/pcre.c =================================================================== RCS file: pcre.c diff -N pcre.c --- /dev/null Thu May 24 22:33:05 2001 +++ pcre.c Mon Jul 2 12:27:07 2001 @@ -0,0 +1,134 @@ +/* + * pcre.c - interface to the PCRE library + * + * This file is part of zsh, the Z shell. + * + * Copyright (c) 2001 Clint Adams + * All rights reserved. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and to distribute modified versions of this software for any + * purpose, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * In no event shall Clint Adams or the Zsh Development Group be liable + * to any party for direct, indirect, special, incidental, or consequential + * damages arising out of the use of this software and its documentation, + * even if Andrew Main and the Zsh Development Group have been advised of + * the possibility of such damage. + * + * Clint Adams and the Zsh Development Group specifically disclaim any + * warranties, including, but not limited to, the implied warranties of + * merchantability and fitness for a particular purpose. The software + * provided hereunder is on an "as is" basis, and Andrew Main and the + * Zsh Development Group have no obligation to provide maintenance, + * support, updates, enhancements, or modifications. + * + */ + +/**/ +#if defined(HAVE_PCRE_COMPILE) && defined(HAVE_PCRE_EXEC) + +#include "pcre.mdh" +#include "pcre.pro" +#include + +static pcre *pcre_pattern; +static pcre_extra *pcre_hints; + +/**/ +static int +bin_pcre_compile(char *nam, char **args, char *ops, int func) +{ + int pcre_opts = 0, pcre_errptr; + const char *pcre_error; + + if(ops['a']) pcre_opts |= PCRE_ANCHORED; + if(ops['i']) pcre_opts |= PCRE_CASELESS; + if(ops['m']) pcre_opts |= PCRE_MULTILINE; + if(ops['x']) pcre_opts |= PCRE_EXTENDED; + + pcre_pattern = pcre_compile(*args, pcre_opts, &pcre_error, &pcre_errptr, NULL); + + if (pcre_pattern == NULL) + { + zwarnnam(nam, "error in regex: %s", pcre_error, 0); + return 1; + } + + return 0; +} + +/**/ +#ifdef HAVE_PCRE_STUDY + +/**/ +static int +bin_pcre_study(char *nam, char **args, char *ops, int func) +{ + const char *pcre_error; + + pcre_hints = pcre_study(pcre_pattern, 0, &pcre_error); + if (pcre_error != NULL) + { + zwarnnam(nam, "error while studying regex: %s", pcre_error, 0); + return 1; + } + + return 0; +} + +/**/ +#endif /* HAVE_PCRE_STUDY */ + +/**/ +static int +bin_pcre_match(char *nam, char **args, char *ops, int func) +{ +#define PCRE_OVEC_SIZE 50 + + int ovec[PCRE_OVEC_SIZE]; /* throwing this away now, but will be useful someday */ + + return !(pcre_exec(pcre_pattern, pcre_hints, *args, strlen(*args), 0, 0, ovec, PCRE_OVEC_SIZE) >= 0); +} + +static struct builtin bintab[] = { + BUILTIN("pcre_compile", 0, bin_pcre_compile, 1, 1, 0, "aimx", NULL), +#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) +}; + +/**/ +int +setup_(Module m) +{ + return 0; +} + +/**/ +int +boot_(Module m) +{ + return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); +} + +/**/ +int +cleanup_(Module m) +{ + deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); + return 0; +} + +/**/ +int +finish_(Module m) +{ + return 0; +} + +/**/ +#endif /* HAVE_PCRE_COMPILE && HAVE_PCRE_EXEC */ Index: Src/Modules/pcre.mdd =================================================================== RCS file: pcre.mdd diff -N pcre.mdd --- /dev/null Thu May 24 22:33:05 2001 +++ pcre.mdd Mon Jul 2 12:27:07 2001 @@ -0,0 +1,7 @@ +name=zsh/pcre +link=either +load=no + +autobins="pcre_compile pcre_study pcre_match" + +objects="pcre.o"