]> granicus.if.org Git - apache/commitdiff
Upgrade PCRE to version 3.2
authorRyan Bloom <rbb@apache.org>
Sun, 20 Aug 2000 03:21:56 +0000 (03:21 +0000)
committerRyan Bloom <rbb@apache.org>
Sun, 20 Aug 2000 03:21:56 +0000 (03:21 +0000)
PR:
Obtained from:
Submitted by:
Reviewed by:

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86118 13f79535-47bb-0310-9956-ffa450edef68

19 files changed:
include/pcreposix.h
srclib/pcre/ChangeLog
srclib/pcre/LICENCE
srclib/pcre/Makefile.in
srclib/pcre/config.in
srclib/pcre/configure.in
srclib/pcre/doc/pcre.3
srclib/pcre/doc/pcre.html
srclib/pcre/doc/pcre.txt
srclib/pcre/doc/pcretest.txt
srclib/pcre/internal.h
srclib/pcre/pcre.c
srclib/pcre/pcre.in
srclib/pcre/pcretest.c
srclib/pcre/testdata/testinput3
srclib/pcre/testdata/testoutput1
srclib/pcre/testdata/testoutput2
srclib/pcre/testdata/testoutput3
srclib/pcre/testdata/testoutput4

index 47838a8bc56b8a9a1e4f963780df5eb55903ee55..7660acbd553b0e35d45cfe5b8a02e13aa5f99fe2 100644 (file)
@@ -3,7 +3,6 @@
 *************************************************/
 
 /* Copyright (c) 1997-2000 University of Cambridge */
-/* Do not edit this file, this is provided by PCRE */
 
 #ifndef _PCREPOSIX_H
 #define _PCREPOSIX_H
index c594ab50d8871b26955f7c17dc00516d06955ac5..5bedd53bc637652737fc85ac2a75a1ace32a996a 100644 (file)
@@ -2,6 +2,45 @@ ChangeLog for PCRE
 ------------------
 
 
+Version 3.2 12-May-00
+---------------------
+
+This is purely a bug fixing release.
+
+1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
+of ZA. This was just one example of several cases that could provoke this bug,
+which was introduced by change 9 of version 2.00. The code for breaking
+infinite loops after an iteration that matches an empty string was't working
+correctly.
+
+2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
+when matched against abbab (for example). After matching an empty string, it
+wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
+caused it to match further down the string than it should.
+
+3. The code contained an inclusion of sys/types.h. It isn't clear why this
+was there because it doesn't seem to be needed, and it causes trouble on some
+systems, as it is not a Standard C header. It has been removed.
+
+4. Made 4 silly changes to the source to avoid stupid compiler warnings that
+were reported on the Macintosh. The changes were from
+
+  while ((c = *(++ptr)) != 0 && c != '\n');
+to
+  while ((c = *(++ptr)) != 0 && c != '\n') ;
+
+Totally extraordinary, but if that's what it takes...
+
+5. PCRE is being used in one environment where neither memmove() nor bcopy() is
+available. Added HAVE_BCOPY and an autoconf test for it; if neither
+HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
+assumes the way PCRE uses memmove() (always moving upwards).
+
+6. PCRE is being used in one environment where strchr() is not available. There
+was only one use in pcre.c, and writing it out to avoid strchr() probably gives
+faster code anyway.
+
+
 Version 3.1 09-Feb-00
 ---------------------
 
index f305033c16c770a74b5b4ae13f889680c5e63154..8422bd9ae6604f8abd16947d41f64ea4d5d3d1a8 100644 (file)
@@ -20,7 +20,19 @@ restrictions:
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
+   explicit claim or by omission. In practice, this means you must put
+   a sentence like this
+
+     Regular expression support is provided by the PCRE library package,
+     which is open source software, copyright by the University of
+     Cambridge.
+
+   somewhere reasonably visible in your documentation and in any relevant
+   files. A reference to the ftp site for the source should also be given
+
+     ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
+
+   in the documentation.
 
 3. Altered versions must be plainly marked as such, and must not be
    misrepresented as being the original software.
index 309fb3c6e92437a77dbe85b6d2047e22c8b3f6c1..d15fa3b8eb5255c991a220f134f32fa5afc48cbe 100644 (file)
-LTLIBRARY_NAME = libpcre.la
-LTLIBRARY_SOURCES = maketables.c get.c study.c pcre.c pcreposix.c
 
-CLEANFILES = dftables config.h chartables.c
+# Makefile.in for PCRE (Perl-Compatible Regular Expression) library.
 
-include $(top_srcdir)/build/ltlib.mk
+#---------------------------------------------------------------------------#
+# To build mingw32 DLL uncomment the next two lines. This addition for      #
+# mingw32 was contributed by <Paul.Sokolovsky@technologist.com>. I (Philip  #
+# Hazel) don't know anything about it! There are some additional targets at #
+# the bottom of this Makefile.                                              #
+#---------------------------------------------------------------------------#
+#
+# include dll.mk
+# DLL_LDFLAGS=-s
 
-config.h:
-       touch $@
 
-$(LTLIBRARY_OBJECTS) dftables.lo: config.h
+#---------------------------------------------------------------------------#
+# The next few lines are modified by "configure" to insert data that it is  #
+# given in its arguments, or which it finds out for itself.                 #
+#---------------------------------------------------------------------------#
 
-dftables: dftables.lo
-       $(LINK) $(EXTRA_LDFLAGS) dftables.lo $(EXTRA_LIBS)
+# BINDIR is the directory in which the pgrep command is installed.
+# INCDIR is the directory in which the public header file pcre.h is installed.
+# LIBDIR is the directory in which the libraries are installed.
+# MANDIR is the directory in which the man pages are installed.
+# The pcretest program, as it is a test program, does not get installed
+# anywhere.
 
-chartables.c: dftables
-       ./dftables > $@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
 
-pcre.lo: chartables.c
+BINDIR = @bindir@
+LIBDIR = @libdir@
+INCDIR = @includedir@
+MANDIR = @mandir@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+RANLIB = @RANLIB@
+
+# LIBTOOL defaults to "", which cuts out the building of shared libraries.
+# If "configure" is called with --enable-shared-libraries, then LIBTOOL is
+# set to "./libtool", which causes shared libraries to be built, and LIBSUFFIX
+# is set to "la" instead of "a", which causes the shared libraries to be
+# installed.
+
+LIBTOOL = @LIBTOOL@
+LIBSUFFIX = @LIBSUFFIX@
+
+# These are the version numbers for the shared libraries
+
+PCRELIBVERSION = @PCRE_LIB_VERSION@
+PCREPOSIXLIBVERSION = @PCRE_POSIXLIB_VERSION@
+
+
+#---------------------------------------------------------------------------#
+# A copy of install-sh is in this distribution and is used by default.      #
+#---------------------------------------------------------------------------#
+
+INSTALL = ./install-sh -c
+INSTALL_DATA = ${INSTALL} -m 644
+
+
+#---------------------------------------------------------------------------#
+# For almost all systems, the command to create a library is "ar cq", but   #
+# there is at least one where it is different, to make this configurable.   #
+# However, I haven't got round to learning how to make "configure" find     #
+# this out for itself. It is necessary to use a command such as             #
+# "make AR='ar -rc'" if you need to vary this.                              #
+#---------------------------------------------------------------------------#
+
+AR = ar cq
+
+
+##############################################################################
+
+
+OBJ = maketables.o get.o study.o pcre.o
+LOBJ = maketables.lo get.lo study.lo pcre.lo
+
+all:            libtool libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest pgrep
+
+libtool:        config.guess config.sub ltconfig ltmain.sh
+               @if test "$(LIBTOOL)" = "./libtool"; then \
+                 echo '--- Building libtool ---'; \
+                 ./ltconfig ./ltmain.sh; \
+                 echo '--- Built libtool ---'; fi
+
+pgrep:          libpcre.$(LIBSUFFIX) pgrep.o
+                 @echo ' '
+                 @echo '--- Building pgrep utility'
+                 @echo ' '
+               $(LIBTOOL) $(CC) $(CFLAGS) -o pgrep pgrep.o libpcre.$(LIBSUFFIX)
+
+pcretest:       libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest.o
+                 @echo ' '
+                 @echo '--- Building pcretest testing program'
+                 @echo ' '
+               $(LIBTOOL) $(PURIFY) $(CC) $(CFLAGS) -o pcretest pcretest.o \
+                 libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX)
+
+libpcre.a:      $(OBJ)
+               @echo ' '
+               @echo '--- Building static library: libpcre'
+               @echo ' '
+               -rm -f libpcre.a
+               $(AR) libpcre.a $(OBJ)
+               $(RANLIB) libpcre.a
+
+libpcre.la:     $(OBJ)
+               @echo ' '
+               @echo '--- Building shared library: libpcre'
+               @echo ' '
+               -rm -f libpcre.la
+               ./libtool $(CC) -version-info '$(PCRELIBVERSION)' -o libpcre.la -rpath $(LIBDIR) $(LOBJ)
+
+libpcreposix.a: pcreposix.o
+               @echo ' '
+               @echo '--- Building static library: libpcreposix'
+               @echo ' '
+               -rm -f libpcreposix.a
+               $(AR) libpcreposix.a pcreposix.o
+               $(RANLIB) libpcreposix.a
+
+libpcreposix.la: pcreposix.o
+               @echo ' '
+               @echo '--- Building shared library: libpcreposix'
+               @echo ' '
+               -rm -f libpcreposix.la
+               ./libtool $(CC) -version-info '$(PCREPOSIXLIBVERSION)' -o libpcreposix.la -rpath $(LIBDIR) pcreposix.lo
+
+pcre.o:         chartables.c pcre.c pcre.h internal.h config.h Makefile
+               $(LIBTOOL) $(CC) -c $(CFLAGS) pcre.c
+
+pcreposix.o:    pcreposix.c pcreposix.h internal.h pcre.h config.h Makefile
+               $(LIBTOOL) $(CC) -c $(CFLAGS) pcreposix.c
+
+maketables.o:   maketables.c pcre.h internal.h config.h Makefile
+               $(LIBTOOL) $(CC) -c $(CFLAGS) maketables.c
+
+get.o:          get.c pcre.h internal.h config.h Makefile
+               $(LIBTOOL) $(CC) -c $(CFLAGS) get.c
+
+study.o:        study.c pcre.h internal.h config.h Makefile
+               $(LIBTOOL) $(CC) -c $(CFLAGS) study.c
+
+pcretest.o:     pcretest.c pcre.h config.h Makefile
+               $(CC) -c $(CFLAGS) pcretest.c
+
+pgrep.o:        pgrep.c pcre.h Makefile config.h
+               $(CC) -c $(CFLAGS) pgrep.c
+
+# An auxiliary program makes the default character table source
+
+chartables.c:   dftables
+               ./dftables >chartables.c
+
+dftables:       dftables.c maketables.c pcre.h internal.h config.h Makefile
+               $(CC) -o dftables $(CFLAGS) dftables.c
+
+install:        all
+               $(LIBTOOL) $(INSTALL_DATA) libpcre.$(LIBSUFFIX) $(LIBDIR)/libpcre.$(LIBSUFFIX)
+               $(LIBTOOL) $(INSTALL_DATA) libpcreposix.$(LIBSUFFIX) $(LIBDIR)/libpcreposix.$(LIBSUFFIX)
+               $(INSTALL_DATA) pcre.h $(INCDIR)/pcre.h
+               $(INSTALL_DATA) pcreposix.h $(INCDIR)/pcreposix.h
+               $(INSTALL_DATA) doc/pcre.3 $(MANDIR)/man3/pcre.3
+               $(INSTALL_DATA) doc/pcreposix.3 $(MANDIR)/man3/pcreposix.3
+               $(INSTALL_DATA) doc/pgrep.1 $(MANDIR)/man1/pgrep.1
+               @if test "$(LIBTOOL)" = "./libtool"; then \
+                 echo ' '; \
+                 echo '--- Rebuilding pgrep to use installed shared library ---'; \
+                 echo $(CC) $(CFLAGS) -o pgrep pgrep.o -L$(LIBDIR) -lpcre; \
+                 $(CC) $(CFLAGS) -o pgrep pgrep.o -L$(LIBDIR) -lpcre; \
+                 echo '--- Rebuilding pcretest to use installed shared library ---'; \
+                 echo $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(LIBDIR) -lpcre -lpcreposix; \
+                 $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(LIBDIR) -lpcre -lpcreposix; \
+               fi
+               $(INSTALL)      pgrep $(BINDIR)/pgrep
+               $(INSTALL)      pcre-config $(BINDIR)/pcre-config
+
+# We deliberately omit dftables and chartables.c from 'make clean'; once made
+# chartables.c shouldn't change, and if people have edited the tables by hand,
+# you don't want to throw them away.
+
+clean:;         -rm -rf *.o *.lo *.a *.la .libs pcretest pgrep testtry
+
+# But "make distclean" should get back to a virgin distribution
+
+distclean:      clean
+               -rm -f chartables.c libtool pcre-config pcre.h \
+               Makefile config.h config.status config.log config.cache
+
+check:          runtest
+
+runtest:        all
+               ./RunTest
+
+######## MINGW32 ############### MINGW32 ############### MINGW32 #############
+
+# This addition for mingw32 was contributed by  Paul Sokolovsky
+# <Paul.Sokolovsky@technologist.com>. I (PH) don't know anything about it!
+
+dll:            _dll libpcre.dll.a pgrep_d pcretest_d
+
+_dll:
+               $(MAKE) CFLAGS=-DSTATIC pcre.dll
+
+pcre.dll:       $(OBJ) pcreposix.o pcre.def
+libpcre.dll.a:  pcre.def
+
+pgrep_d:        libpcre.dll.a pgrep.o
+               $(CC) $(CFLAGS) -L. -o pgrep pgrep.o -lpcre.dll
+
+pcretest_d:     libpcre.dll.a pcretest.o
+               $(PURIFY) $(CC) $(CFLAGS) -L. -o pcretest pcretest.o -lpcre.dll
+
+# End
index 7631d468cd38fb1f4cb593ca426bb4a44cb0c254..02f425936d0d3789e5a7be34e768e43e329cbe51 100644 (file)
@@ -5,7 +5,10 @@ with, allowing it to run on SunOS4 and other "close to standard" systems.
 
 On a non-Unix system you should just copy this file into config.h and change
 the definitions of HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because
-of the way autoconf works, these cannot be made the defaults. */
+of the way autoconf works, these cannot be made the defaults. If your system
+has bcopy() and not memmove(), change the definition of HAVE_BCOPY instead of
+HAVE_MEMMOVE. If your system has neither bcopy() nor memmove(), leave them both
+as 0; an emulation function will be used. */
 
 /* Define to empty if the keyword does not work. */
 
@@ -17,12 +20,14 @@ of the way autoconf works, these cannot be made the defaults. */
 
 /* The following two definitions are mainly for the benefit of SunOS4, which
 doesn't have the strerror() or memmove() functions that should be present in
-all Standard C libraries. The macros should normally be defined with the value
-1 for other systems, but unfortunately we can't make this the default because
-"configure" files generated by autoconf will only change 0 to 1; they won't
-change 1 to 0 if the functions are not found. */
+all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should
+normally be defined with the value 1 for other systems, but unfortunately we
+can't make this the default because "configure" files generated by autoconf
+will only change 0 to 1; they won't change 1 to 0 if the functions are not
+found. If HAVE_MEMMOVE is set to 1, the value of HAVE_BCOPY is not relevant. */
 
 #define HAVE_STRERROR 0
 #define HAVE_MEMMOVE  0
+#define HAVE_BCOPY    0
 
 /* End */
index 9d053aa187d3c3e3dd7daa574562d893e9a8b3f5..0b153103130c6add7a676554af9ac27ecf00c6ee 100644 (file)
@@ -17,22 +17,20 @@ dnl digits for minor numbers less than 10. There are unlikely to be
 dnl that many releases anyway.
 
 PCRE_MAJOR=3
-PCRE_MINOR=1
-PCRE_DATE=09-Feb-2000
+PCRE_MINOR=2
+PCRE_DATE=12-May-2000
 PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
 
 dnl Provide versioning information for libtool shared libraries that
 dnl are built by default on Unix systems.
 
-PCRE_LIB_VERSION=0:0:0
+PCRE_LIB_VERSION=0:1:0
 PCRE_POSIXLIB_VERSION=0:0:0
 
 dnl Checks for programs.
 
 AC_PROG_CC
-dnl OS/390 doesn't have ranlib and its make utility thinks RANLIB=:
-dnl is a rule, so set RANLIB to true if there is no ranlib.
-AC_CHECK_PROG(RANLIB, ranlib, ranlib, true)
+AC_PROG_RANLIB
 
 dnl Checks for header files.
 
@@ -46,28 +44,20 @@ AC_TYPE_SIZE_T
 
 dnl Checks for library functions.
 
-AC_CHECK_FUNCS(memmove strerror)
+AC_CHECK_FUNCS(bcopy memmove strerror)
 
 dnl Handle --enable-shared-libraries
 
-LIBTOOL=
-LIBSUFFIX=a
+LIBTOOL=./libtool
+LIBSUFFIX=la
 AC_ARG_ENABLE(shared,
-[  --enable-shared        build PCRE as a shared library],
-if test "$enableval" = "yes"; then
-  LIBTOOL=libtool
-  LIBSUFFIX=la
+[  --disable-shared        build PCRE as a static library],
+if test "$enableval" = "no"; then
+  LIBTOOL=
+  LIBSUFFIX=a
 fi
 )
 
-PLATFORM=`uname -s`
-
-case "$PLATFORM" in
-*OS/2*)
-  CFLAGS="$CFLAGS -Zexe"
-  ;;
-esac
-
 dnl "Export" these variables
 
 AC_SUBST(HAVE_MEMMOVE)
index bd435e9ecde3242cebc4d572cac5d34fb64bf7cd..4334be24407f5448b09ead0b9676e4bc5d5d2140 100644 (file)
@@ -323,7 +323,7 @@ no back references.
 
 Return information about the first character of any matched string, for a
 non-anchored pattern. If there is a fixed first character, e.g. from a pattern
-such as (cat|cow|coyote), then it is returned in the integer pointed to by
+such as (cat|cow|coyote), it is returned in the integer pointed to by
 \fIwhere\fR. Otherwise, if either
 
 (a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
@@ -332,9 +332,9 @@ starts with "^", or
 (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
 (if it were set, the pattern would be anchored),
 
-then -1 is returned, indicating that the pattern matches only at the
-start of a subject string or after any "\\n" within the string. Otherwise -2 is
-returned. For anchored patterns, -2 is returned.
+-1 is returned, indicating that the pattern matches only at the start of a
+subject string or after any "\\n" within the string. Otherwise -2 is returned.
+For anchored patterns, -2 is returned.
 
   PCRE_INFO_FIRSTTABLE
 
@@ -550,8 +550,8 @@ is a pointer to the vector of integer offsets that was passed to
 were captured by the match, including the substring that matched the entire
 regular expression. This is the value returned by \fBpcre_exec\fR if it
 is greater than zero. If \fBpcre_exec()\fR returned zero, indicating that it
-ran out of space in \fIovector\fR, then the value passed as
-\fIstringcount\fR should be the size of the vector divided by three.
+ran out of space in \fIovector\fR, the value passed as \fIstringcount\fR should
+be the size of the vector divided by three.
 
 The functions \fBpcre_copy_substring()\fR and \fBpcre_get_substring()\fR
 extract a single substring, whose number is given as \fIstringnumber\fR. A
@@ -650,7 +650,7 @@ patterns using the non-Perl item (?R).
 with the settings of captured strings when part of a pattern is repeated. For
 example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value
 "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if
-the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) get set.
+the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set.
 
 In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the
 future Perl changes to a consistent state that is different, PCRE may change to
@@ -920,10 +920,10 @@ end of the subject in both modes, and if all branches of a pattern start with
 .SH FULL STOP (PERIOD, DOT)
 Outside a character class, a dot in the pattern matches any one character in
 the subject, including a non-printing character, but not (by default) newline.
-If the PCRE_DOTALL option is set, then dots match newlines as well. The
-handling of dot is entirely independent of the handling of circumflex and
-dollar, the only relationship being that they both involve newline characters.
-Dot has no special meaning in a character class.
+If the PCRE_DOTALL option is set, dots match newlines as well. The handling of
+dot is entirely independent of the handling of circumflex and dollar, the only
+relationship being that they both involve newline characters. Dot has no
+special meaning in a character class.
 
 
 .SH SQUARE BRACKETS
@@ -1213,7 +1213,7 @@ to the string
 fails, because it matches the entire string due to the greediness of the .*
 item.
 
-However, if a quantifier is followed by a question mark, then it ceases to be
+However, if a quantifier is followed by a question mark, it ceases to be
 greedy, and instead matches the minimum number of times possible, so the
 pattern
 
@@ -1229,8 +1229,8 @@ own right. Because it has two uses, it can sometimes appear doubled, as in
 which matches one digit by preference, but can match two if that is the only
 way the rest of the pattern matches.
 
-If the PCRE_UNGREEDY option is set (an option which is not available in Perl)
-then the quantifiers are not greedy by default, but individual ones can be made
+If the PCRE_UNGREEDY option is set (an option which is not available in Perl),
+the quantifiers are not greedy by default, but individual ones can be made
 greedy by following them with a question mark. In other words, it inverts the
 default behaviour.
 
@@ -1239,8 +1239,8 @@ is greater than 1 or with a limited maximum, more store is required for the
 compiled pattern, in proportion to the size of the minimum or maximum.
 
 If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent
-to Perl's /s) is set, thus allowing the . to match newlines, then the pattern
-is implicitly anchored, because whatever follows will be tried against every
+to Perl's /s) is set, thus allowing the . to match newlines, the pattern is
+implicitly anchored, because whatever follows will be tried against every
 character position in the subject string, so there is no point in retrying the
 overall match at any position after the first. PCRE treats such a pattern as
 though it were preceded by \\A. In cases where it is known that the subject
@@ -1284,7 +1284,7 @@ itself. So the pattern
 
 matches "sense and sensibility" and "response and responsibility", but not
 "sense and responsibility". If caseful matching is in force at the time of the
-back reference, then the case of letters is relevant. For example,
+back reference, the case of letters is relevant. For example,
 
   ((?i)rah)\\s+\\1
 
@@ -1292,7 +1292,7 @@ matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original
 capturing subpattern is matched caselessly.
 
 There may be more than one back reference to the same subpattern. If a
-subpattern has not actually been used in a particular match, then any back
+subpattern has not actually been used in a particular match, any back
 references to it always fail. For example, the pattern
 
   (a|(bc))\\2
@@ -1300,9 +1300,9 @@ references to it always fail. For example, the pattern
 always fails if it starts to match "a" rather than "bc". Because there may be
 up to 99 back references, all digits following the backslash are taken
 as part of a potential back reference number. If the pattern continues with a
-digit character, then some delimiter must be used to terminate the back
-reference. If the PCRE_EXTENDED option is set, this can be whitespace.
-Otherwise an empty comment can be used.
+digit character, some delimiter must be used to terminate the back reference.
+If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty
+comment can be used.
 
 A back reference that occurs inside the parentheses to which it refers fails
 when the subpattern is first used, so, for example, (a\\1) never matches.
@@ -1390,7 +1390,7 @@ Several assertions (of any sort) may occur in succession. For example,
 matches "foo" preceded by three digits that are not "999". Notice that each of
 the assertions is applied independently at the same point in the subject
 string. First there is a check that the previous three characters are all
-digits, then there is a check that the same three characters are not "999".
+digits, and then there is a check that the same three characters are not "999".
 This pattern does \fInot\fR match "foo" preceded by six characters, the first
 of which are digits and the last three of which are not "999". For example, it
 doesn't match "123abcfoo". A pattern to do that is
@@ -1475,15 +1475,15 @@ what follows matches the rest of the pattern. If the pattern is specified as
 
   ^.*abcd$
 
-then the initial .* matches the entire string at first, but when this fails
-(because there is no following "a"), it backtracks to match all but the last
-character, then all but the last two characters, and so on. Once again the
-search for "a" covers the entire string, from right to left, so we are no
-better off. However, if the pattern is written as
+the initial .* matches the entire string at first, but when this fails (because
+there is no following "a"), it backtracks to match all but the last character,
+then all but the last two characters, and so on. Once again the search for "a"
+covers the entire string, from right to left, so we are no better off. However,
+if the pattern is written as
 
   ^(?>.*)(?<=abcd)
 
-then there can be no backtracking for the .* item; it can match only the entire
+there can be no backtracking for the .* item; it can match only the entire
 string. The subsequent lookbehind assertion does a single test on the last four
 characters. If it fails, the match fails immediately. For long strings, this
 approach makes a significant difference to the processing time.
@@ -1528,11 +1528,10 @@ no-pattern (if present) is used. If there are more than two alternatives in the
 subpattern, a compile-time error occurs.
 
 There are two kinds of condition. If the text between the parentheses consists
-of a sequence of digits, then the condition is satisfied if the capturing
-subpattern of that number has previously matched. Consider the following
-pattern, which contains non-significant white space to make it more readable
-(assume the PCRE_EXTENDED option) and to divide it into three parts for ease
-of discussion:
+of a sequence of digits, the condition is satisfied if the capturing subpattern
+of that number has previously matched. Consider the following pattern, which
+contains non-significant white space to make it more readable (assume the
+PCRE_EXTENDED option) and to divide it into three parts for ease of discussion:
 
   ( \\( )?    [^()]+    (?(1) \\) )
 
@@ -1622,7 +1621,7 @@ on at the top level. If additional parentheses are added, giving
   \\( ( ( (?>[^()]+) | (?R) )* ) \\)
      ^                        ^
      ^                        ^
-then the string they capture is "ab(cd)ef", the contents of the top level
+the string they capture is "ab(cd)ef", the contents of the top level
 parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE
 has to obtain extra memory to store data during a recursion, which it does by
 using \fBpcre_malloc\fR, freeing it via \fBpcre_free\fR afterwards. If no
index 2ce289007ded478c9587cb997842b11f0bca009e..7eba9c35dd0e597b70387a99c1f304baa3a59d3c 100644 (file)
@@ -430,7 +430,7 @@ no back references.
 <P>
 Return information about the first character of any matched string, for a
 non-anchored pattern. If there is a fixed first character, e.g. from a pattern
-such as (cat|cow|coyote), then it is returned in the integer pointed to by
+such as (cat|cow|coyote), it is returned in the integer pointed to by
 <I>where</I>. Otherwise, if either
 </P>
 <P>
@@ -442,9 +442,9 @@ starts with "^", or
 (if it were set, the pattern would be anchored),
 </P>
 <P>
-then -1 is returned, indicating that the pattern matches only at the
-start of a subject string or after any "\n" within the string. Otherwise -2 is
-returned. For anchored patterns, -2 is returned.
+-1 is returned, indicating that the pattern matches only at the start of a
+subject string or after any "\n" within the string. Otherwise -2 is returned.
+For anchored patterns, -2 is returned.
 </P>
 <P>
 <PRE>
@@ -734,8 +734,8 @@ is a pointer to the vector of integer offsets that was passed to
 were captured by the match, including the substring that matched the entire
 regular expression. This is the value returned by <B>pcre_exec</B> if it
 is greater than zero. If <B>pcre_exec()</B> returned zero, indicating that it
-ran out of space in <I>ovector</I>, then the value passed as
-<I>stringcount</I> should be the size of the vector divided by three.
+ran out of space in <I>ovector</I>, the value passed as <I>stringcount</I> should
+be the size of the vector divided by three.
 </P>
 <P>
 The functions <B>pcre_copy_substring()</B> and <B>pcre_get_substring()</B>
@@ -857,7 +857,7 @@ patterns using the non-Perl item (?R).
 with the settings of captured strings when part of a pattern is repeated. For
 example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value
 "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if
-the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) get set.
+the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set.
 </P>
 <P>
 In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the
@@ -1186,10 +1186,10 @@ end of the subject in both modes, and if all branches of a pattern start with
 <P>
 Outside a character class, a dot in the pattern matches any one character in
 the subject, including a non-printing character, but not (by default) newline.
-If the PCRE_DOTALL option is set, then dots match newlines as well. The
-handling of dot is entirely independent of the handling of circumflex and
-dollar, the only relationship being that they both involve newline characters.
-Dot has no special meaning in a character class.
+If the PCRE_DOTALL option is set, dots match newlines as well. The handling of
+dot is entirely independent of the handling of circumflex and dollar, the only
+relationship being that they both involve newline characters. Dot has no
+special meaning in a character class.
 </P>
 <LI><A NAME="SEC17" HREF="#TOC1">SQUARE BRACKETS</A>
 <P>
@@ -1580,7 +1580,7 @@ fails, because it matches the entire string due to the greediness of the .*
 item.
 </P>
 <P>
-However, if a quantifier is followed by a question mark, then it ceases to be
+However, if a quantifier is followed by a question mark, it ceases to be
 greedy, and instead matches the minimum number of times possible, so the
 pattern
 </P>
@@ -1605,8 +1605,8 @@ which matches one digit by preference, but can match two if that is the only
 way the rest of the pattern matches.
 </P>
 <P>
-If the PCRE_UNGREEDY option is set (an option which is not available in Perl)
-then the quantifiers are not greedy by default, but individual ones can be made
+If the PCRE_UNGREEDY option is set (an option which is not available in Perl),
+the quantifiers are not greedy by default, but individual ones can be made
 greedy by following them with a question mark. In other words, it inverts the
 default behaviour.
 </P>
@@ -1617,8 +1617,8 @@ compiled pattern, in proportion to the size of the minimum or maximum.
 </P>
 <P>
 If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent
-to Perl's /s) is set, thus allowing the . to match newlines, then the pattern
-is implicitly anchored, because whatever follows will be tried against every
+to Perl's /s) is set, thus allowing the . to match newlines, the pattern is
+implicitly anchored, because whatever follows will be tried against every
 character position in the subject string, so there is no point in retrying the
 overall match at any position after the first. PCRE treats such a pattern as
 though it were preceded by \A. In cases where it is known that the subject
@@ -1677,7 +1677,7 @@ itself. So the pattern
 <P>
 matches "sense and sensibility" and "response and responsibility", but not
 "sense and responsibility". If caseful matching is in force at the time of the
-back reference, then the case of letters is relevant. For example,
+back reference, the case of letters is relevant. For example,
 </P>
 <P>
 <PRE>
@@ -1690,7 +1690,7 @@ capturing subpattern is matched caselessly.
 </P>
 <P>
 There may be more than one back reference to the same subpattern. If a
-subpattern has not actually been used in a particular match, then any back
+subpattern has not actually been used in a particular match, any back
 references to it always fail. For example, the pattern
 </P>
 <P>
@@ -1702,9 +1702,9 @@ references to it always fail. For example, the pattern
 always fails if it starts to match "a" rather than "bc". Because there may be
 up to 99 back references, all digits following the backslash are taken
 as part of a potential back reference number. If the pattern continues with a
-digit character, then some delimiter must be used to terminate the back
-reference. If the PCRE_EXTENDED option is set, this can be whitespace.
-Otherwise an empty comment can be used.
+digit character, some delimiter must be used to terminate the back reference.
+If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty
+comment can be used.
 </P>
 <P>
 A back reference that occurs inside the parentheses to which it refers fails
@@ -1836,7 +1836,7 @@ Several assertions (of any sort) may occur in succession. For example,
 matches "foo" preceded by three digits that are not "999". Notice that each of
 the assertions is applied independently at the same point in the subject
 string. First there is a check that the previous three characters are all
-digits, then there is a check that the same three characters are not "999".
+digits, and then there is a check that the same three characters are not "999".
 This pattern does <I>not</I> match "foo" preceded by six characters, the first
 of which are digits and the last three of which are not "999". For example, it
 doesn't match "123abcfoo". A pattern to do that is
@@ -1957,11 +1957,11 @@ what follows matches the rest of the pattern. If the pattern is specified as
 </PRE>
 </P>
 <P>
-then the initial .* matches the entire string at first, but when this fails
-(because there is no following "a"), it backtracks to match all but the last
-character, then all but the last two characters, and so on. Once again the
-search for "a" covers the entire string, from right to left, so we are no
-better off. However, if the pattern is written as
+the initial .* matches the entire string at first, but when this fails (because
+there is no following "a"), it backtracks to match all but the last character,
+then all but the last two characters, and so on. Once again the search for "a"
+covers the entire string, from right to left, so we are no better off. However,
+if the pattern is written as
 </P>
 <P>
 <PRE>
@@ -1969,7 +1969,7 @@ better off. However, if the pattern is written as
 </PRE>
 </P>
 <P>
-then there can be no backtracking for the .* item; it can match only the entire
+there can be no backtracking for the .* item; it can match only the entire
 string. The subsequent lookbehind assertion does a single test on the last four
 characters. If it fails, the match fails immediately. For long strings, this
 approach makes a significant difference to the processing time.
@@ -2032,11 +2032,10 @@ subpattern, a compile-time error occurs.
 </P>
 <P>
 There are two kinds of condition. If the text between the parentheses consists
-of a sequence of digits, then the condition is satisfied if the capturing
-subpattern of that number has previously matched. Consider the following
-pattern, which contains non-significant white space to make it more readable
-(assume the PCRE_EXTENDED option) and to divide it into three parts for ease
-of discussion:
+of a sequence of digits, the condition is satisfied if the capturing subpattern
+of that number has previously matched. Consider the following pattern, which
+contains non-significant white space to make it more readable (assume the
+PCRE_EXTENDED option) and to divide it into three parts for ease of discussion:
 </P>
 <P>
 <PRE>
@@ -2157,7 +2156,7 @@ on at the top level. If additional parentheses are added, giving
      ^                        ^
      ^                        ^
 </PRE>
-then the string they capture is "ab(cd)ef", the contents of the top level
+the string they capture is "ab(cd)ef", the contents of the top level
 parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE
 has to obtain extra memory to store data during a recursion, which it does by
 using <B>pcre_malloc</B>, freeing it via <B>pcre_free</B> afterwards. If no
index f28ee99e8bb5606d6e01d2fb4b92b32ba402db6c..b8106e4457f815bc6e36b23af2fde922d60f2fa6 100644 (file)
@@ -353,8 +353,8 @@ INFORMATION ABOUT A PATTERN
      Return information about the first character of any  matched
      string,  for  a  non-anchored  pattern.  If there is a fixed
      first   character,   e.g.   from   a   pattern    such    as
-     (cat|cow|coyote), then it is returned in the integer pointed
-     to by where. Otherwise, if either
+     (cat|cow|coyote),  it  is returned in the integer pointed to
+     by where. Otherwise, if either
 
      (a) the pattern was compiled with the PCRE_MULTILINE option,
      and every branch starts with "^", or
@@ -363,10 +363,10 @@ INFORMATION ABOUT A PATTERN
      PCRE_DOTALL is not set (if it were set, the pattern would be
      anchored),
 
-     then -1 is returned, indicating  that  the  pattern  matches
-     only  at  the  start  of  a subject string or after any "\n"
-     within the string. Otherwise -2 is  returned.  For  anchored
-     patterns, -2 is returned.
+     -1 is returned, indicating that the pattern matches only  at
+     the  start  of a subject string or after any "\n" within the
+     string. Otherwise -2 is returned.  For anchored patterns, -2
+     is returned.
 
        PCRE_INFO_FIRSTTABLE
 
@@ -622,8 +622,8 @@ EXTRACTING CAPTURED SUBSTRINGS
      entire regular expression. This is  the  value  returned  by
      pcre_exec  if  it  is  greater  than  zero.  If  pcre_exec()
      returned zero, indicating that it ran out of space in  ovec-
-     tor, then the value passed as stringcount should be the size
-     of the vector divided by three.
+     tor,  the  value passed as stringcount should be the size of
+     the vector divided by three.
 
      The functions pcre_copy_substring() and pcre_get_substring()
      extract a single substring, whose number is given as string-
@@ -739,7 +739,7 @@ DIFFERENCES FROM PERL
      "aba"  against the pattern /^(a(b)?)+$/ sets $2 to the value
      "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves  $2
      unset.    However,    if   the   pattern   is   changed   to
-     /^(aa(b(b))?)+$/ then $2 (and $3) get set.
+     /^(aa(b(b))?)+$/ then $2 (and $3) are set.
 
      In Perl 5.004 $2 is set in both cases, and that is also true
      of PCRE. If in the future Perl changes to a consistent state
@@ -1056,11 +1056,11 @@ FULL STOP (PERIOD, DOT)
      Outside a character class, a dot in the pattern matches  any
      one character in the subject, including a non-printing char-
      acter, but not (by default)  newline.   If  the  PCRE_DOTALL
-     option  is  set,  then dots match newlines as well. The han-
-     dling of dot is entirely independent of the handling of cir-
-     cumflex  and  dollar,  the only relationship being that they
-     both involve newline characters.  Dot has no special meaning
-     in a character class.
+     option  is set, dots match newlines as well. The handling of
+     dot is entirely independent of the  handling  of  circumflex
+     and  dollar,  the  only  relationship  being  that they both
+     involve newline characters. Dot has no special meaning in  a
+     character class.
 
 
 
@@ -1406,9 +1406,9 @@ REPETITION
      fails, because it matches  the  entire  string  due  to  the
      greediness of the .*  item.
 
-     However, if a quantifier is followed  by  a  question  mark,
-     then it ceases to be greedy, and instead matches the minimum
-     number of times possible, so the pattern
+     However, if a quantifier is followed by a question mark,  it
+     ceases  to be greedy, and instead matches the minimum number
+     of times possible, so the pattern
 
        /\*.*?\*/
 
@@ -1425,7 +1425,7 @@ REPETITION
      that is the only way the rest of the pattern matches.
 
      If the PCRE_UNGREEDY option is set (an option which  is  not
-     available  in  Perl)  then the quantifiers are not greedy by
+     available  in  Perl),  the  quantifiers  are  not  greedy by
      default, but individual ones can be made greedy by following
      them  with  a  question mark. In other words, it inverts the
      default behaviour.
@@ -1437,7 +1437,7 @@ REPETITION
 
      If a pattern starts with .* or  .{0,}  and  the  PCRE_DOTALL
      option (equivalent to Perl's /s) is set, thus allowing the .
-     to match newlines, then the pattern is implicitly  anchored,
+     to match  newlines,  the  pattern  is  implicitly  anchored,
      because whatever follows will be tried against every charac-
      ter position in the subject string, so there is no point  in
      retrying  the overall match at any position after the first.
@@ -1490,8 +1490,8 @@ BACK REFERENCES
 
      matches "sense and sensibility" and "response and  responsi-
      bility",  but  not  "sense  and  responsibility". If caseful
-     matching is in force at the time of the back reference, then
-     the case of letters is relevant. For example,
+     matching is in force at the time of the back reference,  the
+     case of letters is relevant. For example,
 
        ((?i)rah)\s+\1
 
@@ -1501,8 +1501,8 @@ BACK REFERENCES
 
      There may be more than one back reference to the  same  sub-
      pattern.  If  a  subpattern  has not actually been used in a
-     particular match, then any  back  references  to  it  always
-     fail. For example, the pattern
+     particular match, any back references to it always fail. For
+     example, the pattern
 
        (a|(bc))\2
 
@@ -1510,9 +1510,9 @@ BACK REFERENCES
      Because  there  may  be up to 99 back references, all digits
      following the backslash are taken as  part  of  a  potential
      back reference number. If the pattern continues with a digit
-     character, then some delimiter must be used to terminate the
-     back reference. If the PCRE_EXTENDED option is set, this can
-     be whitespace.  Otherwise an empty comment can be used.
+     character, some delimiter must be used to terminate the back
+     reference.   If the PCRE_EXTENDED option is set, this can be
+     whitespace. Otherwise an empty comment can be used.
 
      A back reference that occurs inside the parentheses to which
      it  refers  fails when the subpattern is first used, so, for
@@ -1612,7 +1612,7 @@ ASSERTIONS
      matches "foo" preceded by three digits that are  not  "999".
      Notice  that each of the assertions is applied independently
      at the same point in the subject string. First  there  is  a
-     check  that  the  previous  three characters are all digits,
+     check that the previous three characters are all digits, and
      then there is a check that the same three characters are not
      "999".   This  pattern  does not match "foo" preceded by six
      characters, the first of which are digits and the last three
@@ -1713,21 +1713,20 @@ ONCE-ONLY SUBPATTERNS
 
        ^.*abcd$
 
-     then the initial .* matches the entire string at first,  but
-     when  this  fails  (because  there  is no following "a"), it
-     backtracks to match all but the last character, then all but
-     the  last  two  characters, and so on. Once again the search
-     for "a" covers the entire string, from right to left, so  we
-     are no better off. However, if the pattern is written as
+     the initial .* matches the entire string at first, but  when
+     this  fails  (because  there  is no following "a"), it back-
+     tracks to match all but the last character, then all but the
+     last  two  characters,  and so on. Once again the search for
+     "a" covers the entire string, from right to left, so we  are
+     no better off. However, if the pattern is written as
 
        ^(?>.*)(?<=abcd)
 
-     then there can be no backtracking for the .*  item;  it  can
-     match  only  the  entire  string.  The subsequent lookbehind
-     assertion does a single test on the last four characters. If
-     it  fails,  the  match  fails immediately. For long strings,
-     this approach makes a significant difference to the process-
-     ing time.
+     there can be no backtracking for the .* item; it  can  match
+     only  the entire string. The subsequent lookbehind assertion
+     does a single test on the last four characters. If it fails,
+     the match fails immediately. For long strings, this approach
+     makes a significant difference to the processing time.
 
      When a pattern contains an unlimited repeat inside a subpat-
      tern  that  can  itself  be  repeated an unlimited number of
@@ -1777,12 +1776,12 @@ CONDITIONAL SUBPATTERNS
      error occurs.
 
      There are two kinds of condition. If the  text  between  the
-     parentheses  consists  of  a  sequence  of  digits, then the
-     condition is satisfied if the capturing subpattern  of  that
-     number  has  previously matched. Consider the following pat-
-     tern, which contains non-significant white space to make  it
-     more  readable  (assume  the  PCRE_EXTENDED  option)  and to
-     divide it into three parts for ease of discussion:
+     parentheses  consists of a sequence of digits, the condition
+     is satisfied if the capturing subpattern of that number  has
+     previously  matched.  Consider  the following pattern, which
+     contains non-significant white space to make it  more  read-
+     able (assume the PCRE_EXTENDED option) and to divide it into
+     three parts for ease of discussion:
 
        ( \( )?    [^()]+    (?(1) \) )
 
@@ -1888,8 +1887,8 @@ RECURSIVE PATTERNS
 
        \( ( ( (?>[^()]+) | (?R) )* ) \)
           ^                        ^
-          ^                        ^ then the string they capture
-     is "ab(cd)ef", the contents of the top level parentheses. If
+          ^                        ^ the string they  capture  is
+     "ab(cd)ef",  the  contents  of the top level parentheses. If
      there are more than 15 capturing parentheses in  a  pattern,
      PCRE  has  to  obtain  extra  memory  to store data during a
      recursion, which it does by using  pcre_malloc,  freeing  it
index 831fdac98764210e1103a00a81119897dc5b00ca..0e6783af0c554e32afc2b4edb074947880b2c867 100644 (file)
@@ -63,10 +63,11 @@ to the matching process if the pattern begins with a lookbehind assertion
 (including \b or \B).
 
 If any call to pcre_exec() in a /g or /G sequence matches an empty string, the
-next call is done with the PCRE_NOTEMPTY flag set so that it cannot match an
-empty string again at the same point. If however, this second match fails, the
-start offset is advanced by one, and the match is retried. This imitates the
-way Perl handles such cases when using the /g modifier or the split() function.
+next call is done with the PCRE_NOTEMPTY and PCRE_ANCHORED flags set in order
+to search for another, non-empty, match at the same point. If this second match
+fails, the start offset is advanced by one, and the normal match is retried.
+This imitates the way Perl handles such cases when using the /g modifier or the
+split() function.
 
 There are a number of other modifiers for controlling the way pcretest
 operates.
index 91ff3018f1f2cfcf3fec743757a6b7cc87c447ce..b4b750f6c653b50b3aa828fccae8f42fc9b0d1c3 100644 (file)
@@ -40,11 +40,27 @@ modules, but which are not relevant to the outside. */
 #include "config.h"
 
 /* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
-define a macro for memmove() if HAVE_MEMMOVE is false. */
+define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
+is set. Otherwise, include an emulating function for those systems that have
+neither (there some non-Unix environments where this is the case). This assumes
+that all calls to memmove are moving strings upwards in store, which is the
+case in PCRE. */
 
 #if ! HAVE_MEMMOVE
 #undef  memmove        /* some systems may have a macro */
+#if HAVE_BCOPY
 #define memmove(a, b, c) bcopy(b, a, c)
+#else
+void *
+pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n)
+{
+int i;
+dest += n;
+src += n;
+for (i = 0; i < n; ++i) *(--dest) =  *(--src);
+}
+#define memmove(a, b, c) pcre_memmove(a, b, c)
+#endif
 #endif
 
 /* Standard C headers plus the external interface definition */
index e45dee8d96554c48aaa5e317b2863a4ab047343c..e3fdde911425a2743b960b4ef22240d6df3526c7 100644 (file)
@@ -145,6 +145,21 @@ static BOOL
   compile_regex(int, int, int *, uschar **, const uschar **, const char **,
     BOOL, int, int *, int *, compile_data *);
 
+/* Structure for building a chain of data that actually lives on the
+stack, for holding the values of the subject pointer at the start of each
+subpattern, so as to detect when an empty string has been matched by a
+subpattern - to break infinite loops. */
+
+typedef struct eptrblock {
+  struct eptrblock *prev;
+  const uschar *saved_eptr;
+} eptrblock;
+
+/* Flag bits for the match() function */
+
+#define match_condassert   0x01    /* Called to check a condition assertion */
+#define match_isgroup      0x02    /* Set if start of bracketed group */
+
 
 
 /*************************************************
@@ -855,7 +870,9 @@ for (;; ptr++)
     if ((cd->ctypes[c] & ctype_space) != 0) continue;
     if (c == '#')
       {
-      while ((c = *(++ptr)) != 0 && c != '\n');
+      /* The space before the ; is to avoid a warning on a silly compiler
+      on the Macintosh. */
+      while ((c = *(++ptr)) != 0 && c != '\n') ;
       continue;
       }
     }
@@ -1795,7 +1812,9 @@ for (;; ptr++)
         if ((cd->ctypes[c] & ctype_space) != 0) continue;
         if (c == '#')
           {
-          while ((c = *(++ptr)) != 0 && c != '\n');
+          /* The space before the ; is to avoid a warning on a silly compiler
+          on the Macintosh. */
+          while ((c = *(++ptr)) != 0 && c != '\n') ;
           if (c == 0) break;
           continue;
           }
@@ -2313,7 +2332,9 @@ while ((c = *(++ptr)) != 0)
     if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
     if (c == '#')
       {
-      while ((c = *(++ptr)) != 0 && c != '\n');
+      /* The space before the ; is to avoid a warning on a silly compiler
+      on the Macintosh. */
+      while ((c = *(++ptr)) != 0 && c != '\n') ;
       continue;
       }
     }
@@ -2523,8 +2544,8 @@ while ((c = *(++ptr)) != 0)
         else   /* An assertion must follow */
           {
           ptr++;   /* Can treat like ':' as far as spacing is concerned */
-
-          if (ptr[2] != '?' || strchr("=!<", ptr[3]) == NULL)
+          if (ptr[2] != '?' ||
+             (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') )
             {
             ptr += 2;    /* To get right offset in message */
             *errorptr = ERR28;
@@ -2737,7 +2758,9 @@ while ((c = *(++ptr)) != 0)
         if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
         if (c == '#')
           {
-          while ((c = *(++ptr)) != 0 && c != '\n');
+          /* The space before the ; is to avoid a warning on a silly compiler
+          on the Macintosh. */
+          while ((c = *(++ptr)) != 0 && c != '\n') ;
           continue;
           }
         }
@@ -3195,18 +3218,36 @@ Arguments:
    offset_top  current top pointer
    md          pointer to "static" info for the match
    ims         current /i, /m, and /s options
-   condassert  TRUE if called to check a condition assertion
-   eptrb       eptr at start of last bracket
+   eptrb       pointer to chain of blocks containing eptr at start of
+                 brackets - for testing for empty matches
+   flags       can contain
+                 match_condassert - this is an assertion condition
+                 match_isgroup - this is the start of a bracketed group
 
 Returns:       TRUE if matched
 */
 
 static BOOL
 match(register const uschar *eptr, register const uschar *ecode,
-  int offset_top, match_data *md, unsigned long int ims, BOOL condassert,
-  const uschar *eptrb)
+  int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb,
+  int flags)
 {
 unsigned long int original_ims = ims;   /* Save for resetting on ')' */
+eptrblock newptrb;
+
+/* At the start of a bracketed group, add the current subject pointer to the
+stack of such pointers, to be re-instated at the end of the group when we hit
+the closing ket. When match() is called in other circumstances, we don't add to
+the stack. */
+
+if ((flags & match_isgroup) != 0)
+  {
+  newptrb.prev = eptrb;
+  newptrb.saved_eptr = eptr;
+  eptrb = &newptrb;
+  }
+
+/* Now start processing the operations. */
 
 for (;;)
   {
@@ -3252,7 +3293,8 @@ for (;;)
 
       do
         {
-        if (match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr)) return TRUE;
+        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
+          return TRUE;
         ecode += (ecode[1] << 8) + ecode[2];
         }
       while (*ecode == OP_ALT);
@@ -3278,7 +3320,8 @@ for (;;)
     DPRINTF(("start bracket 0\n"));
     do
       {
-      if (match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr)) return TRUE;
+      if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
+        return TRUE;
       ecode += (ecode[1] << 8) + ecode[2];
       }
     while (*ecode == OP_ALT);
@@ -3297,7 +3340,7 @@ for (;;)
       return match(eptr,
         ecode + ((offset < offset_top && md->offset_vector[offset] >= 0)?
           5 : 3 + (ecode[1] << 8) + ecode[2]),
-        offset_top, md, ims, FALSE, eptr);
+        offset_top, md, ims, eptrb, match_isgroup);
       }
 
     /* The condition is an assertion. Call match() to evaluate it - setting
@@ -3305,13 +3348,14 @@ for (;;)
 
     else
       {
-      if (match(eptr, ecode+3, offset_top, md, ims, TRUE, NULL))
+      if (match(eptr, ecode+3, offset_top, md, ims, NULL,
+          match_condassert | match_isgroup))
         {
         ecode += 3 + (ecode[4] << 8) + ecode[5];
         while (*ecode == OP_ALT) ecode += (ecode[1] << 8) + ecode[2];
         }
       else ecode += (ecode[1] << 8) + ecode[2];
-      return match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr);
+      return match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup);
       }
     /* Control never reaches here */
 
@@ -3348,7 +3392,7 @@ for (;;)
     case OP_ASSERTBACK:
     do
       {
-      if (match(eptr, ecode+3, offset_top, md, ims, FALSE, NULL)) break;
+      if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) break;
       ecode += (ecode[1] << 8) + ecode[2];
       }
     while (*ecode == OP_ALT);
@@ -3356,7 +3400,7 @@ for (;;)
 
     /* If checking an assertion for a condition, return TRUE. */
 
-    if (condassert) return TRUE;
+    if ((flags & match_condassert) != 0) return TRUE;
 
     /* Continue from after the assertion, updating the offsets high water
     mark, since extracts may have been taken during the assertion. */
@@ -3372,12 +3416,14 @@ for (;;)
     case OP_ASSERTBACK_NOT:
     do
       {
-      if (match(eptr, ecode+3, offset_top, md, ims, FALSE, NULL)) return FALSE;
+      if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup))
+        return FALSE;
       ecode += (ecode[1] << 8) + ecode[2];
       }
     while (*ecode == OP_ALT);
 
-    if (condassert) return TRUE;
+    if ((flags & match_condassert) != 0) return TRUE;
+
     ecode += 3;
     continue;
 
@@ -3423,7 +3469,8 @@ for (;;)
 
       for (i = 1; i <= c; i++)
         save[i] = md->offset_vector[md->offset_end - i];
-      rc = match(eptr, md->start_pattern, offset_top, md, ims, FALSE, eptrb);
+      rc = match(eptr, md->start_pattern, offset_top, md, ims, eptrb,
+        match_isgroup);
       for (i = 1; i <= c; i++)
         md->offset_vector[md->offset_end - i] = save[i];
       if (save != stacksave) (pcre_free)(save);
@@ -3449,10 +3496,12 @@ for (;;)
     case OP_ONCE:
       {
       const uschar *prev = ecode;
+      const uschar *saved_eptr = eptr;
 
       do
         {
-        if (match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr)) break;
+        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
+          break;
         ecode += (ecode[1] << 8) + ecode[2];
         }
       while (*ecode == OP_ALT);
@@ -3475,7 +3524,7 @@ for (;;)
       5.005. If there is an options reset, it will get obeyed in the normal
       course of events. */
 
-      if (*ecode == OP_KET || eptr == eptrb)
+      if (*ecode == OP_KET || eptr == saved_eptr)
         {
         ecode += 3;
         break;
@@ -3494,13 +3543,14 @@ for (;;)
 
       if (*ecode == OP_KETRMIN)
         {
-        if (match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr) ||
-            match(eptr, prev, offset_top, md, ims, FALSE, eptr)) return TRUE;
+        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) ||
+            match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup))
+              return TRUE;
         }
       else  /* OP_KETRMAX */
         {
-        if (match(eptr, prev, offset_top, md, ims, FALSE, eptr) ||
-            match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr)) return TRUE;
+        if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) ||
+            match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE;
         }
       }
     return FALSE;
@@ -3521,7 +3571,8 @@ for (;;)
     case OP_BRAZERO:
       {
       const uschar *next = ecode+1;
-      if (match(eptr, next, offset_top, md, ims, FALSE, eptr)) return TRUE;
+      if (match(eptr, next, offset_top, md, ims, eptrb, match_isgroup))
+        return TRUE;
       do next += (next[1] << 8) + next[2]; while (*next == OP_ALT);
       ecode = next + 3;
       }
@@ -3531,7 +3582,8 @@ for (;;)
       {
       const uschar *next = ecode+1;
       do next += (next[1] << 8) + next[2]; while (*next == OP_ALT);
-      if (match(eptr, next+3, offset_top, md, ims, FALSE, eptr)) return TRUE;
+      if (match(eptr, next+3, offset_top, md, ims, eptrb, match_isgroup))
+        return TRUE;
       ecode++;
       }
     break;
@@ -3546,6 +3598,9 @@ for (;;)
     case OP_KETRMAX:
       {
       const uschar *prev = ecode - (ecode[1] << 8) - ecode[2];
+      const uschar *saved_eptr = eptrb->saved_eptr;
+
+      eptrb = eptrb->prev;    /* Back up the stack of bracket start pointers */
 
       if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT ||
           *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT ||
@@ -3565,7 +3620,10 @@ for (;;)
         int number = *prev - OP_BRA;
         int offset = number << 1;
 
-        DPRINTF(("end bracket %d\n", number));
+#ifdef DEBUG
+        printf("end bracket %d", number);
+        printf("\n");
+#endif
 
         if (number > 0)
           {
@@ -3591,7 +3649,7 @@ for (;;)
       5.005. If there is an options reset, it will get obeyed in the normal
       course of events. */
 
-      if (*ecode == OP_KET || eptr == eptrb)
+      if (*ecode == OP_KET || eptr == saved_eptr)
         {
         ecode += 3;
         break;
@@ -3602,13 +3660,14 @@ for (;;)
 
       if (*ecode == OP_KETRMIN)
         {
-        if (match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr) ||
-            match(eptr, prev, offset_top, md, ims, FALSE, eptr)) return TRUE;
+        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) ||
+            match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup))
+              return TRUE;
         }
       else  /* OP_KETRMAX */
         {
-        if (match(eptr, prev, offset_top, md, ims, FALSE, eptr) ||
-            match(eptr, ecode+3, offset_top, md, ims, FALSE, eptr)) return TRUE;
+        if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) ||
+            match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE;
         }
       }
     return FALSE;
@@ -3819,7 +3878,7 @@ for (;;)
         {
         for (i = min;; i++)
           {
-          if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
           if (i >= max || !match_ref(offset, eptr, length, md, ims))
             return FALSE;
@@ -3840,7 +3899,7 @@ for (;;)
           }
         while (eptr >= pp)
           {
-          if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
           eptr -= length;
           }
@@ -3911,7 +3970,7 @@ for (;;)
         {
         for (i = min;; i++)
           {
-          if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
           if (i >= max || eptr >= md->end_subject) return FALSE;
           c = *eptr++;
@@ -3935,7 +3994,7 @@ for (;;)
           }
 
         while (eptr >= pp)
-          if (match(eptr--, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
         return FALSE;
         }
@@ -4032,7 +4091,7 @@ for (;;)
         {
         for (i = min;; i++)
           {
-          if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
           if (i >= max || eptr >= md->end_subject ||
               c != md->lcc[*eptr++])
@@ -4049,7 +4108,7 @@ for (;;)
           eptr++;
           }
         while (eptr >= pp)
-          if (match(eptr--, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
         return FALSE;
         }
@@ -4066,7 +4125,7 @@ for (;;)
         {
         for (i = min;; i++)
           {
-          if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
           if (i >= max || eptr >= md->end_subject || c != *eptr++) return FALSE;
           }
@@ -4081,7 +4140,7 @@ for (;;)
           eptr++;
           }
         while (eptr >= pp)
-         if (match(eptr--, ecode, offset_top, md, ims, FALSE, eptrb))
+         if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
            return TRUE;
         return FALSE;
         }
@@ -4163,7 +4222,7 @@ for (;;)
         {
         for (i = min;; i++)
           {
-          if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
           if (i >= max || eptr >= md->end_subject ||
               c == md->lcc[*eptr++])
@@ -4180,7 +4239,7 @@ for (;;)
           eptr++;
           }
         while (eptr >= pp)
-          if (match(eptr--, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
         return FALSE;
         }
@@ -4197,7 +4256,7 @@ for (;;)
         {
         for (i = min;; i++)
           {
-          if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb))
+          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
             return TRUE;
           if (i >= max || eptr >= md->end_subject || c == *eptr++) return FALSE;
           }
@@ -4212,7 +4271,7 @@ for (;;)
           eptr++;
           }
         while (eptr >= pp)
-         if (match(eptr--, ecode, offset_top, md, ims, FALSE, eptrb))
+         if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
            return TRUE;
         return FALSE;
         }
@@ -4312,7 +4371,7 @@ for (;;)
       {
       for (i = min;; i++)
         {
-        if (match(eptr, ecode, offset_top, md, ims, FALSE, eptrb)) return TRUE;
+        if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE;
         if (i >= max || eptr >= md->end_subject) return FALSE;
 
         c = *eptr++;
@@ -4431,7 +4490,7 @@ for (;;)
         }
 
       while (eptr >= pp)
-        if (match(eptr--, ecode, offset_top, md, ims, FALSE, eptrb))
+        if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
           return TRUE;
       return FALSE;
       }
@@ -4717,7 +4776,7 @@ do
   if certain parts of the pattern were not used. */
 
   match_block.start_match = start_match;
-  if (!match(start_match, re->code, 2, &match_block, ims, FALSE, start_match))
+  if (!match(start_match, re->code, 2, &match_block, ims, NULL, match_isgroup))
     continue;
 
   /* Copy the offset information from temporary store if necessary */
index 74b0cfc579b9d1bd16d3bddacd00b34f5813c942..8a531671a9d0def95089d585e2998d2f1c1cb6f3 100644 (file)
@@ -7,6 +7,9 @@
 #ifndef _PCRE_H
 #define _PCRE_H
 
+/* The file pcre.h is build by "configure". Do not edit it; instead
+make changes to pcre.in. */
+
 #define PCRE_MAJOR @PCRE_MAJOR@
 #define PCRE_MINOR @PCRE_MINOR@
 #define PCRE_DATE  @PCRE_DATE@
@@ -26,7 +29,6 @@
 /* Have to include stdlib.h in order to ensure that size_t is defined;
 it is needed here for malloc. */
 
-#include <sys/types.h>
 #include <stdlib.h>
 
 /* Allow for C++ users */
index 85569fbeb77407b9b75a2674d6ccfdfbd69ae3ce..bbe9bdd109eb78ac9c340d6226b5ddf3d570022b 100644 (file)
@@ -995,10 +995,10 @@ while (!done)
         }
 
       /* Failed to match. If this is a /g or /G loop and we previously set
-      PCRE_NOTEMPTY after a null match, this is not necessarily the end.
+      g_notempty after a null match, this is not necessarily the end.
       We want to advance the start offset, and continue. Fudge the offset
       values to achieve this. We won't be at the end of the string - that
-      was checked before setting PCRE_NOTEMPTY. */
+      was checked before setting g_notempty. */
 
       else
         {
@@ -1025,14 +1025,15 @@ while (!done)
       /* If we have matched an empty string, first check to see if we are at
       the end of the subject. If so, the /g loop is over. Otherwise, mimic
       what Perl's /g options does. This turns out to be rather cunning. First
-      we set PCRE_NOTEMPTY and try the match again at the same point. If this
-      fails (picked up above) we advance to the next character. */
+      we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the
+      same point. If this fails (picked up above) we advance to the next
+      character. */
 
       g_notempty = 0;
       if (offsets[0] == offsets[1])
         {
         if (offsets[0] == len) break;
-        g_notempty = PCRE_NOTEMPTY;
+        g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED;
         }
 
       /* For /g, update the start offset, leaving the rest alone */
index 0c884d3b7c1b95dfa072916c8a598804cc4a7428..67d39f3ac5408177aa4f329f2569973e1a5480e9 100644 (file)
     <a href=\"abcd xyz pqr\" cats
     <a href       =       \'abcd xyz pqr\' cats
 
+/((Z)+|A)*/
+    ZABCDEFG
+
+/(Z()|A)*/
+    ZABCDEFG
+
+/(Z(())|A)*/
+    ZABCDEFG
+
+/((?>Z)+|A)*/
+    ZABCDEFG
+
+/((?>)+|A)*/
+    ZABCDEFG
+
+/a*/g
+    abbab
+
 / End of test input /       
index affb475aa5cfe7f13c9f276d3b96bb3c2cb5fc4f..3ead0561d1295446cd95ba430ddd989be22b374c 100644 (file)
@@ -1,4 +1,4 @@
-PCRE version 3.1 09-Feb-2000
+PCRE version 3.2 12-May-2000
 
 /the quick brown fox/
     the quick brown fox
index d0fc036f0f2090837fa4ea00fbd53b8c14220f1e..ba8cf0ed28844f7b3a8b9bc81b104481e12ebfea 100644 (file)
@@ -1,4 +1,4 @@
-PCRE version 3.1 09-Feb-2000
+PCRE version 3.2 12-May-2000
 
 /(a)b|/
 Capturing subpattern count = 1
index 8eb215eb5949fce679e9314a39dd659a9cef135b..0269f870347b60e708e86737761c6d46bd4f272e 100644 (file)
@@ -1,4 +1,4 @@
-PCRE version 3.1 09-Feb-2000
+PCRE version 3.2 12-May-2000
 
 /(?<!bar)foo/
     foo
@@ -2925,5 +2925,43 @@ No match
  1: '
  2: abcd xyz pqr
 
+/((Z)+|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: A
+ 2: Z
+
+/(Z()|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: A
+ 2: 
+
+/(Z(())|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: A
+ 2: 
+ 3: 
+
+/((?>Z)+|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: A
+
+/((?>)+|A)*/
+    ZABCDEFG
+ 0: 
+ 1: 
+
+/a*/g
+    abbab
+ 0: a
+ 0: 
+ 0: 
+ 0: a
+ 0: 
+ 0: 
+
 / End of test input /       
 
index d951b488610da509534f03279a8d6e8272c78ee2..d285224515f21c9d2cdc0aeff0da5cc61fc503f4 100644 (file)
@@ -1,4 +1,4 @@
-PCRE version 3.1 09-Feb-2000
+PCRE version 3.2 12-May-2000
 
 /^[\w]+/
     *** Failers