]> granicus.if.org Git - php/commitdiff
- Updated bundled PCRE library to version 2.08
authorAndrey Hristov <andrey@php.net>
Tue, 14 Sep 1999 19:24:37 +0000 (19:24 +0000)
committerAndrey Hristov <andrey@php.net>
Tue, 14 Sep 1999 19:24:37 +0000 (19:24 +0000)
- Made it possible to specify external location of the PCRE library
- Reworked PCRE extension to use updated PCRE library API

Hopefully now everything behaves just like Perl..

35 files changed:
ChangeLog
ext/pcre/config.h.stub
ext/pcre/config.m4
ext/pcre/config0.m4
ext/pcre/pcrelib/ChangeLog
ext/pcre/pcrelib/README
ext/pcre/pcrelib/chartables.c
ext/pcre/pcrelib/dftables.c
ext/pcre/pcrelib/dll.mk [new file with mode: 0644]
ext/pcre/pcrelib/internal.h
ext/pcre/pcrelib/maketables.c
ext/pcre/pcrelib/pcre.3
ext/pcre/pcrelib/pcre.3.html [new file with mode: 0644]
ext/pcre/pcrelib/pcre.3.txt [new file with mode: 0644]
ext/pcre/pcrelib/pcre.c
ext/pcre/pcrelib/pcre.def [new file with mode: 0644]
ext/pcre/pcrelib/pcre.h
ext/pcre/pcrelib/pcreposix.3
ext/pcre/pcrelib/pcreposix.3.html [new file with mode: 0644]
ext/pcre/pcrelib/pcreposix.3.txt [new file with mode: 0644]
ext/pcre/pcrelib/pcreposix.c
ext/pcre/pcrelib/pcretest.c
ext/pcre/pcrelib/pgrep.1
ext/pcre/pcrelib/pgrep.1.html [new file with mode: 0644]
ext/pcre/pcrelib/pgrep.1.txt [new file with mode: 0644]
ext/pcre/pcrelib/pgrep.c
ext/pcre/pcrelib/testinput1
ext/pcre/pcrelib/testinput2
ext/pcre/pcrelib/testinput3
ext/pcre/pcrelib/testoutput1
ext/pcre/pcrelib/testoutput2
ext/pcre/pcrelib/testoutput3
ext/pcre/pcrelib/testoutput4
ext/pcre/php_pcre.c
ext/pcre/php_pcre.h

index 63c452d24861943f003f70b7135efa6701cf2d4d..b237b2e3e2dfcc684034bc7a590381ab0ed8bd05 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,10 @@ PHP 4.0 CHANGE LOG                                                    ChangeLog
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 ?? ?? 1999, Version 4.0 Beta 3
+- Reworked preg_* functions according to the new PCRE API, which also made
+  them behave much more like Perl ones (Andrey)
+- Made it possible to specify external location of PCRE library (Andrey)
+- Updated bundled PCRE library to version 2.08 (Andrey)
 - count()/is_array/is_object... speedups. (Thies)
 - OCI8 supports appending and positioning when saving LOBs (Thies)
 - Added metaphone support (Thies)
index baeac73b7530b445e68b58d61caed620849b9a79..149f740cc1cd74aa3af1f488c0f1b50e415cf206 100644 (file)
@@ -1,3 +1,4 @@
 /* define if you want to use the PCRE extension */
 #define        HAVE_PCRE 0
 
+#define HAVE_BUNDLED_PCRE 0
index eef4563d313f36212383652faa108c640d529fbd..6137e5926955d496e09b65e4e9777b44001dbad7 100644 (file)
@@ -6,20 +6,51 @@ dnl if DIR is supplied, we'll use that for linking
 
 AC_MSG_CHECKING(whether to include PCRE support)
 AC_ARG_WITH(pcre-regex,
-[  --without-pcre-regex    Don't include Perl Compatible Regular Expressions support],[
-  if test "$withval" = "yes"; then
-    EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS"
-    PCRE_SUBDIR="pcrelib"
-    AC_DEFINE(HAVE_PCRE, 1)
-    AC_MSG_RESULT(yes)
-    PHP_EXTENSION(pcre)
-  else
-    AC_MSG_RESULT(no)
-  fi
+[  --without-pcre-regex    Don't include Perl Compatible Regular Expressions support
+                          Use --with-pcre-regex=DIR to specify DIR where PCRE include
+                          and library files are located],[
+       case "$withval" in 
+               no)
+                       AC_MSG_RESULT(no)
+                       ;;
+               yes)
+                       EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS"
+                       PCRE_SUBDIR="pcrelib"
+                       AC_DEFINE(HAVE_BUNDLED_PCRE, 1)
+                       AC_MSG_RESULT(yes)
+                       PHP_EXTENSION(pcre)
+                       ;;
+               *)
+                       if test -f $withval/pcre.h ; then
+                               changequote({,})
+                               pcre_major=`grep PCRE_MAJOR $withval/pcre.h | sed -e 's/[^0-9]//g'`
+                               pcre_minor=`grep PCRE_MINOR $withval/pcre.h | sed -e 's/[^0-9]//g'`
+                               changequote([,])
+                               pcre_version=$pcre_major$pcre_minor
+                               if test "$pcre_version" -ge 208; then
+                                       AC_ADD_INCLUDE($withval)
+                               else
+                                       AC_MSG_ERROR(PCRE extension requires PCRE library version >= 2.08)
+                               fi
+                       else
+                               AC_MSG_ERROR(Could not find pcre.h in $withval)
+                       fi
+
+                       if test -f $withval/libpcre.a ; then
+                               AC_ADD_LIBRARY_WITH_PATH(pcre, $withval)
+                       else
+                               AC_MSG_ERROR(Could not find libpcre.a in $withval)
+                       fi
+
+                       AC_DEFINE(HAVE_PCRE, 1)
+                       AC_MSG_RESULT(yes)
+                       PHP_EXTENSION(pcre)
+                       ;;
+       esac
 ],[
   EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS"
   PCRE_SUBDIR="pcrelib"
-  AC_DEFINE(HAVE_PCRE, 1)
+  AC_DEFINE(HAVE_BUNDLED_PCRE, 1)
   AC_MSG_RESULT(yes)
   PHP_EXTENSION(pcre)
 ]) 
index eef4563d313f36212383652faa108c640d529fbd..6137e5926955d496e09b65e4e9777b44001dbad7 100644 (file)
@@ -6,20 +6,51 @@ dnl if DIR is supplied, we'll use that for linking
 
 AC_MSG_CHECKING(whether to include PCRE support)
 AC_ARG_WITH(pcre-regex,
-[  --without-pcre-regex    Don't include Perl Compatible Regular Expressions support],[
-  if test "$withval" = "yes"; then
-    EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS"
-    PCRE_SUBDIR="pcrelib"
-    AC_DEFINE(HAVE_PCRE, 1)
-    AC_MSG_RESULT(yes)
-    PHP_EXTENSION(pcre)
-  else
-    AC_MSG_RESULT(no)
-  fi
+[  --without-pcre-regex    Don't include Perl Compatible Regular Expressions support
+                          Use --with-pcre-regex=DIR to specify DIR where PCRE include
+                          and library files are located],[
+       case "$withval" in 
+               no)
+                       AC_MSG_RESULT(no)
+                       ;;
+               yes)
+                       EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS"
+                       PCRE_SUBDIR="pcrelib"
+                       AC_DEFINE(HAVE_BUNDLED_PCRE, 1)
+                       AC_MSG_RESULT(yes)
+                       PHP_EXTENSION(pcre)
+                       ;;
+               *)
+                       if test -f $withval/pcre.h ; then
+                               changequote({,})
+                               pcre_major=`grep PCRE_MAJOR $withval/pcre.h | sed -e 's/[^0-9]//g'`
+                               pcre_minor=`grep PCRE_MINOR $withval/pcre.h | sed -e 's/[^0-9]//g'`
+                               changequote([,])
+                               pcre_version=$pcre_major$pcre_minor
+                               if test "$pcre_version" -ge 208; then
+                                       AC_ADD_INCLUDE($withval)
+                               else
+                                       AC_MSG_ERROR(PCRE extension requires PCRE library version >= 2.08)
+                               fi
+                       else
+                               AC_MSG_ERROR(Could not find pcre.h in $withval)
+                       fi
+
+                       if test -f $withval/libpcre.a ; then
+                               AC_ADD_LIBRARY_WITH_PATH(pcre, $withval)
+                       else
+                               AC_MSG_ERROR(Could not find libpcre.a in $withval)
+                       fi
+
+                       AC_DEFINE(HAVE_PCRE, 1)
+                       AC_MSG_RESULT(yes)
+                       PHP_EXTENSION(pcre)
+                       ;;
+       esac
 ],[
   EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS"
   PCRE_SUBDIR="pcrelib"
-  AC_DEFINE(HAVE_PCRE, 1)
+  AC_DEFINE(HAVE_BUNDLED_PCRE, 1)
   AC_MSG_RESULT(yes)
   PHP_EXTENSION(pcre)
 ]) 
index 2259f873ef3b61e888c6dc67eda0842a43adb4af..cad637d959f8973c96514ab272c07d5f64aea7fb 100644 (file)
@@ -2,6 +2,86 @@ ChangeLog for PCRE
 ------------------
 
 
+Version 2.08 31-Aug-99
+----------------------
+
+1. When startoffset was not zero and the pattern began with ".*", PCRE was not
+trying to match at the startoffset position, but instead was moving forward to
+the next newline as if a previous match had failed.
+
+2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,
+and could get into a loop if a null string was matched other than at the start
+of the subject.
+
+3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can
+be distinguished at compile time, and for completeness also added PCRE_DATE.
+
+5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL
+in GnuWin32 environments.
+
+
+Version 2.07 29-Jul-99
+----------------------
+
+1. The documentation is now supplied in plain text form and HTML as well as in
+the form of man page sources.
+
+2. C++ compilers don't like assigning (void *) values to other pointer types.
+In particular this affects malloc(). Although there is no problem in Standard
+C, I've put in casts to keep C++ compilers happy.
+
+3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call
+should be (const char *).
+
+4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may
+be useful for non-Unix systems who don't want to bother with the POSIX stuff.
+However, I haven't made this a standard facility. The documentation doesn't
+mention it, and the Makefile doesn't support it.
+
+5. The Makefile now contains an "install" target, with editable destinations at
+the top of the file. The pcretest program is not installed.
+
+6. pgrep -V now gives the PCRE version number and date.
+
+7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was
+causing the entire string to be ignored, instead of just the last character.
+
+8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a
+non-matching string, it can take a very, very long time, even for strings of
+quite modest length, because of the nested recursion. PCRE now does better in
+some of these cases. It does this by remembering the last required literal
+character in the pattern, and pre-searching the subject to ensure it is present
+before running the real match. In other words, it applies a heuristic to detect
+some types of certain failure quickly, and in the above example, if presented
+with a string that has no trailing " it gives "no match" very quickly.
+
+9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;
+other alternatives are tried instead.
+
+
+Version 2.06 09-Jun-99
+----------------------
+
+1. Change pcretest's output for amount of store used to show just the code
+space, because the remainder (the data block) varies in size between 32-bit and
+64-bit systems.
+
+2. Added an extra argument to pcre_exec() to supply an offset in the subject to
+start matching at. This allows lookbehinds to work when searching for multiple
+occurrences in a string.
+
+3. Added additional options to pcretest for testing multiple occurrences:
+
+   /+   outputs the rest of the string that follows a match
+   /g   loops for multiple occurrences, using the new startoffset argument
+   /G   loops for multiple occurrences by passing an incremented pointer
+
+4. PCRE wasn't doing the "first character" optimization for patterns starting
+with \b or \B, though it was doing it for other lookbehind assertions. That is,
+it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with
+the letter 'x'. On long subject strings, this gives a significant speed-up.
+
+
 Version 2.05 21-Apr-99
 ----------------------
 
index 2db0070f16c3e35461eab6636d8773e2dd6686da..c9696bab483721b01d68787f6a97407b10a180db 100644 (file)
@@ -16,18 +16,37 @@ README file for PCRE (Perl-compatible regular expressions)
 * possible to pass over a pointer to character tables built in the current    *
 * locale by pcre_maketables(). To use the default tables, this new arguement  *
 * should be passed as NULL.                                                   *
+*                                                                             *
+*           IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05                   *
+*                                                                             *
+* Yet another (and again I hope this really is the last) change has been made *
+* to the API for the pcre_exec() function. An additional argument has been    *
+* added to make it possible to start the match other than at the start of the *
+* subject string. This is important if there are lookbehinds. The new man     *
+* page has the details, but you just want to convert existing programs, all   *
+* you need to do is to stick in a new fifth argument to pcre_exec(), with a   *
+* value of zero. For example, change                                          *
+*                                                                             *
+*   pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)       *
+* to                                                                          *
+*   pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)    *
 *******************************************************************************
 
+
 The distribution should contain the following files:
 
   ChangeLog         log of changes to the code
   LICENCE           conditions for the use of PCRE
-  Makefile          for building PCRE
+  Makefile          for building PCRE in Unix systems
   README            this file
-  RunTest           a shell script for running tests
+  RunTest           a Unix shell script for running tests
   Tech.Notes        notes on the encoding
-  pcre.3            man page for the functions
-  pcreposix.3       man page for the POSIX wrapper API
+  pcre.3            man page source for the functions
+  pcre.3.txt        plain text version
+  pcre.3.html       HTML version
+  pcreposix.3       man page source for the POSIX wrapper API
+  pcreposix.3.txt   plain text version
+  pcreposix.3.HTML  HTML version
   dftables.c        auxiliary program for building chartables.c
   get.c             )
   maketables.c      )
@@ -38,35 +57,58 @@ The distribution should contain the following files:
   pcreposix.h       header for the external POSIX wrapper API
   internal.h        header for internal use
   pcretest.c        test program
-  pgrep.1           man page for pgrep
+  pgrep.1           man page source for pgrep
+  pgrep.1.txt       plain text version
+  pgrep.1.HTML      HTML version
   pgrep.c           source of a grep utility that uses PCRE
   perltest          Perl test program
   testinput1        test data, compatible with Perl 5.004 and 5.005
   testinput2        test data for error messages and non-Perl things
   testinput3        test data, compatible with Perl 5.005
   testinput4        test data for locale-specific tests
-  testoutput1       test results corresponding to testinput
+  testoutput1       test results corresponding to testinput1
   testoutput2       test results corresponding to testinput2
   testoutput3       test results corresponding to testinput3
   testoutput4       test results corresponding to testinput4
-
-To build PCRE, edit Makefile for your system (it is a fairly simple make file,
-and there are some comments at the top) and then run it. It builds two
-libraries called libpcre.a and libpcreposix.a, a test program called pcretest,
-and the pgrep command.
-
-To test PCRE, run the RunTest script in the pcre directory. This runs pcretest
-on each of the testinput files in turn, and compares the output with the
+  dll.mk            for Win32 DLL
+  pcre.def          ditto
+
+To build PCRE on a Unix system, first edit Makefile for your system. It is a
+fairly simple make file, and there are some comments near the top, after the
+text "On a Unix system". Then run "make". It builds two libraries called
+libpcre.a and libpcreposix.a, a test program called pcretest, and the pgrep
+command. You can use "make install" to copy these, and the public header file
+pcre.h, to appropriate live directories on your system. These installation
+directories are defined at the top of the Makefile, and you should edit them if
+necessary.
+
+For a non-Unix system, read the comments at the top of Makefile, which give
+some hints on what needs to be done. PCRE has been compiled on Windows systems
+and on Macintoshes, but I don't know the details as I don't use those systems.
+It should be straightforward to build PCRE on any system that has a Standard C
+compiler.
+
+Some help in building a Win32 DLL of PCRE in GnuWin32 environments was
+contributed by Paul.Sokolovsky@technologist.com. These environments are
+Mingw32 (http://www.xraylith.wisc.edu/~khan/software/gnu-win32/) and
+CygWin  (http://sourceware.cygnus.com/cygwin/). Paul comments:
+
+  For CygWin, set CFLAGS=-mno-cygwin, and do 'make dll'. You'll get
+  pcre.dll (containing pcreposix also), libpcre.dll.a, and dynamically
+  linked pgrep and pcretest. If you have /bin/sh, run RunTest (three
+  main test go ok, locale not supported).
+
+To test PCRE, run the RunTest script in the pcre directory. This can also be
+run by "make runtest". It runs the pcretest test program (which is documented
+below) on each of the testinput files in turn, and compares the output with the
 contents of the corresponding testoutput file. A file called testtry is used to
-hold the output from pcretest (which is documented below).
-
-To run pcretest on just one of the test files, give its number as an argument
-to RunTest, for example:
+hold the output from pcretest. To run pcretest on just one of the test files,
+give its number as an argument to RunTest, for example:
 
   RunTest 3
 
 The first and third test files can also be fed directly into the perltest
-program to check that Perl gives the same results. The third file requires the
+script to check that Perl gives the same results. The third file requires the
 additional features of release 5.005, which is why it is kept separate from the
 main test input, which needs only Perl 5.004. In the long run, when 5.005 is
 widespread, these two test files may get amalgamated.
@@ -88,15 +130,6 @@ output to say why. If running this test produces instances of the error
 in the comparison output, it means that locale is not available on your system,
 despite being listed by "locale". This does not mean that PCRE is broken.
 
-To install PCRE, copy libpcre.a to any suitable library directory (e.g.
-/usr/local/lib), pcre.h to any suitable include directory (e.g.
-/usr/local/include), and pcre.3 to any suitable man directory (e.g.
-/usr/local/man/man3).
-
-To install the pgrep command, copy it to any suitable binary directory, (e.g.
-/usr/local/bin) and pgrep.1 to any suitable man directory (e.g.
-/usr/local/man/man1).
-
 PCRE has its own native API, but a set of "wrapper" functions that are based on
 the POSIX API are also supplied in the library libpcreposix.a. Note that this
 just provides a POSIX calling interface to PCRE: the regular expressions
@@ -112,19 +145,20 @@ Character tables
 
 PCRE uses four tables for manipulating and identifying characters. The final
 argument of the pcre_compile() function is a pointer to a block of memory
-containing the concatenated tables. A call to pcre_maketables() is used to
-generate a set of tables in the current locale. However, if the final argument
-is passed as NULL, a set of default tables that is built into the binary is
-used.
+containing the concatenated tables. A call to pcre_maketables() can be used to
+generate a set of tables in the current locale. If the final argument for
+pcre_compile() is passed as NULL, a set of default tables that is built into
+the binary is used.
 
 The source file called chartables.c contains the default set of tables. This is
 not supplied in the distribution, but is built by the program dftables
 (compiled from dftables.c), which uses the ANSI C character handling functions
 such as isalnum(), isalpha(), isupper(), islower(), etc. to build the table
-sources. This means that the default C locale set your system will control the
-contents of the tables. You can change the default tables by editing
-chartables.c and then re-building PCRE. If you do this, you should probably
-also edit Makefile to ensure that the file doesn't ever get re-generated.
+sources. This means that the default C locale which is set for your system will
+control the contents of these default tables. You can change the default tables
+by editing chartables.c and then re-building PCRE. If you do this, you should
+probably also edit Makefile to ensure that the file doesn't ever get
+re-generated.
 
 The first two 256-byte tables provide lower casing and case flipping functions,
 respectively. The next table consists of three 32-byte bit maps which identify
@@ -178,9 +212,9 @@ example,
 
   /abc/\
 
-then a backslash is added to the end of the pattern. This provides a way of
-testing the error condition that arises if a pattern finishes with a backslash,
-because
+then a backslash is added to the end of the pattern. This is done to provide a
+way of testing the error condition that arises if a pattern finishes with a
+backslash, because
 
   /abc\/
 
@@ -188,42 +222,68 @@ is interpreted as the first line of a pattern that starts with "abc/", causing
 pcretest to read the next line as a continuation of the regular expression.
 
 The pattern may be followed by i, m, s, or x to set the PCRE_CASELESS,
-PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively. These
-options have the same effect as they do in Perl.
+PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively. For
+example:
+
+  /caseless/i
 
-There are also some upper case options that do not match Perl options: /A, /E,
-and /X set PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and PCRE_EXTRA respectively.
+These modifier letters have the same effect as they do in Perl. There are
+others which set PCRE options that do not correspond to anything in Perl: /A,
+/E, and /X set PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and PCRE_EXTRA respectively.
 
-The /L option must be followed directly by the name of a locale, for example,
+Searching for all possible matches within each subject string can be requested
+by the /g or /G modifier. After finding a match, PCRE is called again to search
+the remainder of the subject string. The difference between /g and /G is that
+the former uses the startoffset argument to pcre_exec() to start searching at
+a new point within the entire string (which is in effect what Perl does),
+whereas the latter passes over a shortened substring. This makes a difference
+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. 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.
+
+The /+ modifier requests that as well as outputting the substring that matched
+the entire pattern, pcretest should in addition output the remainder of the
+subject string. This is useful for tests where the subject contains multiple
+copies of the same substring.
+
+The /L modifier must be followed directly by the name of a locale, for example,
 
   /pattern/Lfr
 
-For this reason, it must be the last option letter. The given locale is set,
+For this reason, it must be the last modifier letter. The given locale is set,
 pcre_maketables() is called to build a set of character tables for the locale,
 and this is then passed to pcre_compile() when compiling the regular
-expression. Without an /L option, NULL is passed as the tables pointer; that
+expression. Without an /L modifier, NULL is passed as the tables pointer; that
 is, /L applies only to the expression on which it appears.
 
-The /I option requests that pcretest output information about the compiled
+The /I modifier requests that pcretest output information about the compiled
 expression (whether it is anchored, has a fixed first character, and so on). It
 does this by calling pcre_info() after compiling an expression, and outputting
 the information it gets back. If the pattern is studied, the results of that
 are also output.
 
-The /D option is a PCRE debugging feature, which also assumes /I. It causes the
-internal form of compiled regular expressions to be output after compilation.
+The /D modifier is a PCRE debugging feature, which also assumes /I. It causes
+the internal form of compiled regular expressions to be output after
+compilation.
 
-The /S option causes pcre_study() to be called after the expression has been
+The /S modifier causes pcre_study() to be called after the expression has been
 compiled, and the results used when the expression is matched.
 
-The /M option causes information about the size of memory block used to hold
-the compile pattern to be output.
+The /M modifier causes the size of memory block used to hold the compiled
+pattern to be output.
 
-Finally, the /P option causes pcretest to call PCRE via the POSIX wrapper API
-rather than its native API. When this is done, all other options except /i and
-/m are ignored. REG_ICASE is set if /i is present, and REG_NEWLINE is set if /m
-is present. The wrapper functions force PCRE_DOLLAR_ENDONLY always, and
-PCRE_DOTALL unless REG_NEWLINE is set.
+Finally, the /P modifier causes pcretest to call PCRE via the POSIX wrapper API
+rather than its native API. When this is done, all other modifiers except /i,
+/m, and /+ are ignored. REG_ICASE is set if /i is present, and REG_NEWLINE is
+set if /m is present. The wrapper functions force PCRE_DOLLAR_ENDONLY always,
+and PCRE_DOTALL unless REG_NEWLINE is set.
 
 Before each data line is passed to pcre_exec(), leading and trailing whitespace
 is removed, and it is then scanned for \ escapes. The following are recognized:
@@ -246,6 +306,7 @@ is removed, and it is then scanned for \ escapes. The following are recognized:
   \Gdd   call pcre_get_substring() for substring dd after a successful match
            (any decimal number less than 32)
   \L     call pcre_get_substringlist() after a successful match
+  \N     pass the PCRE_NOTEMPTY option to pcre_exec()
   \Odd   set the size of the output vector passed to pcre_exec() to dd
            (any number of decimal digits)
   \Z     pass the PCRE_NOTEOL option to pcre_exec()
@@ -263,16 +324,38 @@ pcre_exec() returns, starting with number 0 for the string that matched the
 whole pattern. Here is an example of an interactive pcretest run.
 
   $ pcretest
-  Testing Perl-Compatible Regular Expressions
-  PCRE version 0.90 08-Sep-1997
+  PCRE version 2.06 08-Jun-1999
 
     re> /^abc(\d+)/
   data> abc123
-    0: abc123
-    1: 123
+   0: abc123
+   1: 123
   data> xyz
   No match
 
+If the strings contain any non-printing characters, they are output as \0x
+escapes. If the pattern has the /+ modifier, then the output for substring 0 is
+followed by the the rest of the subject string, identified by "0+" like this:
+
+    re> /cat/+
+  data> cataract
+   0: cat
+   0+ aract
+
+If the pattern has the /g or /G modifier, the results of successive matching
+attempts are output in sequence, like this:
+
+    re> /\Bi(\w\w)/g
+  data> Mississippi
+   0: iss
+   1: ss
+   0: iss
+   1: ss
+   0: ipp
+   1: pp
+
+"No match" is output only if the first match attempt fails.
+
 If any of \C, \G, or \L are present in a data line that is successfully
 matched, the substrings extracted by the convenience functions are output with
 C, G, or L after the string number instead of a colon. This is in addition to
@@ -313,21 +396,21 @@ The perltest program
 
 The perltest program tests Perl's regular expressions; it has the same
 specification as pcretest, and so can be given identical input, except that
-input patterns can be followed only by Perl's lower case options. The contents
-of testinput1 and testinput3 meet this condition.
-
-The data lines are processed as Perl strings, so if they contain $ or @
-characters, these have to be escaped. For this reason, all such characters in
-the testinput file are escaped so that it can be used for perltest as well as
-for pcretest, and the special upper case options such as /A that pcretest
-recognizes are not used in this file. The output should be identical, apart
-from the initial identifying banner.
-
-The testinput2 and testinput4 files are not suitable for feeding to Perltest,
-since they do make use of the special upper case options and escapes that
+input patterns can be followed only by Perl's lower case modifiers. The
+contents of testinput1 and testinput3 meet this condition.
+
+The data lines are processed as Perl double-quoted strings, so if they contain
+" \ $ or @ characters, these have to be escaped. For this reason, all such
+characters in testinput1 and testinput3 are escaped so that they can be used
+for perltest as well as for pcretest, and the special upper case modifiers such
+as /A that pcretest recognizes are not used in these files. The output should
+be identical, apart from the initial identifying banner.
+
+The testinput2 and testinput4 files are not suitable for feeding to perltest,
+since they do make use of the special upper case modifiers and escapes that
 pcretest uses to test some features of PCRE. The first of these files also
 contains malformed regular expressions, in order to check that PCRE diagnoses
 them correctly.
 
 Philip Hazel <ph10@cam.ac.uk>
-April 1999
+July 1999
index 7bd4e7775bb1d3156e5053abfbdd2fa0e9d778e1..5ef8089a939305b9b13d0dbcd5b15a7ec7aa54c0 100644 (file)
@@ -2,7 +2,7 @@
 *      Perl-Compatible Regular Expressions       *
 *************************************************/
 
-/* This file is automatically written by the makechartables auxiliary 
+/* This file is automatically written by the dftables auxiliary 
 program. If you edit it by hand, you might like to edit the Makefile to 
 prevent its ever being regenerated.
 
index 729049f23bb672b3dbd5c91f7938c27bd4307795..7b336e6f1ee2000d9cf7798355aa125e8034c713 100644 (file)
@@ -59,7 +59,7 @@ printf(
   "/*************************************************\n"
   "*      Perl-Compatible Regular Expressions       *\n"
   "*************************************************/\n\n"
-  "/* This file is automatically written by the makechartables auxiliary \n"
+  "/* This file is automatically written by the dftables auxiliary \n"
   "program. If you edit it by hand, you might like to edit the Makefile to \n"
   "prevent its ever being regenerated.\n\n"
   "This file is #included in the compilation of pcre.c to build the default\n"
diff --git a/ext/pcre/pcrelib/dll.mk b/ext/pcre/pcrelib/dll.mk
new file mode 100644 (file)
index 0000000..d8b728e
--- /dev/null
@@ -0,0 +1,60 @@
+# dll.mk - auxilary Makefile to easy build dll's for mingw32 target
+# ver. 0.6 of 1999-03-25
+#
+# Homepage of this makefile - http://www.is.lg.ua/~paul/devel/
+# Homepage of original mingw32 project -
+#                    http://www.fu.is.saga-u.ac.jp/~colin/gcc.html
+#
+# How to use:
+# This makefile can:
+# 1. Create automatical .def file from list of objects
+# 2. Create .dll from objects and .def file, either automatical, or your
+#    hand-written (maybe) file, which must have same basename as dll
+# WARNING! There MUST be object, which name match dll's name. Make sux.
+# 3. Create import library from .def (as for .dll, only its name required,
+#    not dll itself)
+#    By convention implibs for dll have .dll.a suffix, e.g. libstuff.dll.a
+#    Why not just libstuff.a? 'Cos that's name for static lib, ok?
+# Process divided into 3 phases because:
+# 1. Pre-existent .def possible
+# 2. Generating implib is enough time-consuming
+#
+# Variables:
+#   DLL_LDLIBS  - libs for linking dll
+#   DLL_LDFLAGS - flags for linking dll
+#
+# By using $(DLL_SUFFIX) instead of 'dll', e.g. stuff.$(DLL_SUFFIX)
+# you may help porting makefiles to other platforms
+#
+# Put this file in your make's include path (e.g. main include dir, for
+# more information see include section in make doc). Put in the beginning
+# of your own Makefile line "include dll.mk". Specify dependences, e.g.:
+#
+# Do all stuff in one step
+# libstuff.dll.a: $(OBJECTS) stuff.def
+# stuff.def: $(OBJECTS)
+#
+# Steps separated, pre-provided .def, link with user32
+#
+# DLL_LDLIBS=-luser32
+# stuff.dll: $(OBJECTS)
+# libstuff.dll.a: $(OBJECTS)
+
+
+DLLWRAP=dllwrap
+DLLTOOL=dlltool
+
+DLL_SUFFIX=dll
+
+.SUFFIXES: .o .$(DLL_SUFFIX)
+
+_%.def: %.o
+      $(DLLTOOL) --export-all --output-def $@ $^
+
+%.$(DLL_SUFFIX): %.o
+      $(DLLWRAP) --dllname $(notdir $@) --driver-name $(CC) --def $*.def -o $@ $(filter %.o,$^) $(DLL_LDFLAGS) $(DLL_LDLIBS)
+
+lib%.$(DLL_SUFFIX).a:%.def
+      $(DLLTOOL) --dllname $(notdir $*.dll) --def $< --output-lib $@
+
+# End
index 414ebe069622e7fc86c2b581699988f9ea8315bd..13df1d60f183c7322dcd31dbc8760e732f6dcb0b 100644 (file)
@@ -3,9 +3,6 @@
 *************************************************/
 
 
-#define PCRE_VERSION       "2.05 21-Apr-1999"
-
-
 /* This is a library of functions to support regular expressions whose syntax
 and semantics are as close as possible to those of the Perl 5 language. See
 the file Tech.Notes for some information on the internals.
@@ -67,13 +64,17 @@ Standard C system should have one. */
 
 #define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
 
-/* Private options flags start at the most significant end of the two bytes.
-The public options defined in pcre.h start at the least significant end. Make
-sure they don't overlap! */
+/* Private options flags start at the most significant end of the four bytes,
+but skip the top bit so we can use ints for convenience without getting tangled
+with negative values. The public options defined in pcre.h start at the least
+significant end. Make sure they don't overlap, though now that we have expanded
+to four bytes there is plenty of space. */
 
-#define PCRE_FIRSTSET           0x8000  /* first_char is set */
-#define PCRE_STARTLINE          0x4000  /* start after \n for multiline */
-#define PCRE_INGROUP            0x2000  /* compiling inside a group */
+#define PCRE_FIRSTSET      0x40000000  /* first_char is set */
+#define PCRE_REQCHSET      0x20000000  /* req_char is set */
+#define PCRE_STARTLINE     0x10000000  /* start after \n for multiline */
+#define PCRE_INGROUP       0x08000000  /* compiling inside a group */
+#define PCRE_ICHANGED      0x04000000  /* i option changes within regex */
 
 /* Options for the "extra" block produced by pcre_study(). */
 
@@ -86,7 +87,8 @@ time, run time or study time, respectively. */
   (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
    PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY)
 
-#define PUBLIC_EXEC_OPTIONS (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL)
+#define PUBLIC_EXEC_OPTIONS \
+  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY)
 
 #define PUBLIC_STUDY_OPTIONS 0   /* None defined */
 
@@ -264,18 +266,19 @@ runs on as long as necessary after the end. */
 typedef struct real_pcre {
   unsigned long int magic_number;
   const unsigned char *tables;
-  unsigned short int options;
-  unsigned char top_bracket;
-  unsigned char top_backref;
-  unsigned char first_char;
-  unsigned char code[1];
+  unsigned long int options;
+  uschar top_bracket;
+  uschar top_backref;
+  uschar first_char;
+  uschar req_char;
+  uschar code[1];
 } real_pcre;
 
 /* The real format of the extra block returned by pcre_study(). */
 
 typedef struct real_pcre_extra {
-  unsigned char options;
-  unsigned char start_bits[32];
+  uschar options;
+  uschar start_bits[32];
 } real_pcre_extra;
 
 
@@ -284,7 +287,7 @@ doing the compiling, so that they are thread-safe. */
 
 typedef struct compile_data {
   const uschar *lcc;            /* Points to lower casing table */
-  const uschar *fcc;            /* Points to case-flippint table */
+  const uschar *fcc;            /* Points to case-flipping table */
   const uschar *cbits;          /* Points to character type table */
   const uschar *ctypes;         /* Points to table of type maps */
 } compile_data;
@@ -303,11 +306,12 @@ typedef struct match_data {
   BOOL   notbol;                /* NOTBOL flag */
   BOOL   noteol;                /* NOTEOL flag */
   BOOL   endonly;               /* Dollar not before final \n */
+  BOOL   notempty;              /* Empty string match not wanted */
   const uschar *start_subject;  /* Start of the subject string */
   const uschar *end_subject;    /* End of the subject string */
+  const uschar *start_match;    /* Start of this match attempt */
   const uschar *end_match_ptr;  /* Subject position at end match */
   int     end_offset_top;       /* Highwater mark at end of match */
-  uschar   regprev;            /* Character previous to subject string (Andrey Zmievski) */
 } match_data;
 
 /* Bit definitions for entries in the pcre_ctypes table. */
index 1b764556a264b45fc77ae53ca8b762411e0fcb9f..eb5fcd107e2176ea70a7012765dc5fb37a3c2381 100644 (file)
@@ -65,9 +65,9 @@ unsigned char *yield, *p;
 int i;
 
 #ifndef DFTABLES
-yield = (pcre_malloc)(tables_length);
+yield = (unsigned char*)(pcre_malloc)(tables_length);
 #else
-yield = malloc(tables_length);
+yield = (unsigned char*)malloc(tables_length);
 #endif
 
 if (yield == NULL) return NULL;
index ec356e13d3ea61712d7f8ddeb1ccbd121bbc4e77..3f4ad4f65926de78754e896a508e9d25ae18d74f 100644 (file)
@@ -20,9 +20,9 @@ pcre - Perl-compatible regular expressions.
 .br
 .B int pcre_exec(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR,"
 .ti +5n
-.B "const char *\fIsubject\fR," int \fIlength\fR, int \fIoptions\fR,
+.B "const char *\fIsubject\fR," int \fIlength\fR, int \fIstartoffset\fR,
 .ti +5n
-.B int *\fIovector\fR, int \fIovecsize\fR);
+.B int \fIoptions\fR, int *\fIovector\fR, int \fIovecsize\fR);
 .PP
 .br
 .B int pcre_copy_substring(const char *\fIsubject\fR, int *\fIovector\fR,
@@ -66,9 +66,14 @@ The PCRE library is a set of functions that implement regular expression
 pattern matching using the same syntax and semantics as Perl 5, with just a few
 differences (see below). The current implementation corresponds to Perl 5.005.
 
-PCRE has its own native API, which is described in this man page. There is also
-a set of wrapper functions that correspond to the POSIX API. See
-\fBpcreposix (3)\fR.
+PCRE has its own native API, which is described in this document. There is also
+a set of wrapper functions that correspond to the POSIX API. These are
+described in the \fBpcreposix\fR documentation.
+
+The native API function prototypes are defined in the header file \fBpcre.h\fR,
+and on Unix systems the library itself is called \fBlibpcre.a\fR, so can be
+accessed by adding \fB-lpcre\fR to the command for linking an application which
+calls it.
 
 The functions \fBpcre_compile()\fR, \fBpcre_study()\fR, and \fBpcre_exec()\fR
 are used for compiling and matching regular expressions, while
@@ -237,7 +242,7 @@ and is sufficient for many applications.
 
 An alternative set of tables can, however, be supplied. Such tables are built
 by calling the \fBpcre_maketables()\fR function, which has no arguments, in the
-relevant locale. The result can then be passed to \fBpcre_compile()\ as often
+relevant locale. The result can then be passed to \fBpcre_compile()\fR as often
 as necessary. For example, to build and use tables that are appropriate for the
 French locale (where accented characters with codes greater than 128 are
 treated as letters), the following code could be used:
@@ -249,7 +254,7 @@ treated as letters), the following code could be used:
 The tables are built in memory that is obtained via \fBpcre_malloc\fR. The
 pointer that is passed to \fBpcre_compile\fR is saved with the compiled
 pattern, and the same tables are used via this pointer by \fBpcre_study()\fR
-and \fBpcre_match()\fR. Thus for any single pattern, compilation, studying and
+and \fBpcre_exec()\fR. Thus for any single pattern, compilation, studying and
 matching all happen in the same locale, but different patterns can be compiled
 in different locales. It is the caller's responsibility to ensure that the
 memory containing the tables remains available for as long as it is needed.
@@ -276,11 +281,11 @@ string. 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
 \fIfirstcharptr\fR. Otherwise, if either
 
-  (a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
-      starts with "^", or
+(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
+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),
+(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
@@ -293,15 +298,12 @@ pre-compiled pattern, which is passed in the \fIcode\fR argument. If the
 pattern has been studied, the result of the study should be passed in the
 \fIextra\fR argument. Otherwise this must be NULL.
 
-The subject string is passed as a pointer in \fIsubject\fR and a length in
-\fIlength\fR. Unlike the pattern string, it may contain binary zero characters.
-
 The PCRE_ANCHORED option can be passed in the \fIoptions\fR argument, whose
 unused bits must be zero. However, if a pattern was compiled with
 PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it
 cannot be made unachored at matching time.
 
-There are also two further options that can be set only at matching time:
+There are also three further options that can be set only at matching time:
 
   PCRE_NOTBOL
 
@@ -316,6 +318,50 @@ should not match it nor (except in multiline mode) a newline immediately before
 it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never
 to match.
 
+  PCRE_NOTEMPTY
+
+An empty string is not considered to be a valid match if this option is set. If
+there are alternatives in the pattern, they are tried. If all the alternatives
+match the empty string, the entire match fails. For example, if the pattern
+
+  a?b?
+
+is applied to a string not beginning with "a" or "b", it matches the empty
+string at the start of the subject. With PCRE_NOTEMPTY set, this match is not
+valid, so PCRE searches further into the string for occurrences of "a" or "b".
+Perl has no direct equivalent of this option, but it makes a special case of
+a pattern match of the empty string within its \fBsplit()\fR function, or when
+using the /g modifier. Using PCRE_NOTEMPTY it is possible to emulate this
+behaviour.
+
+The subject string is passed as a pointer in \fIsubject\fR, a length in
+\fIlength\fR, and a starting offset in \fIstartoffset\fR. Unlike the pattern
+string, it may contain binary zero characters. When the starting offset is
+zero, the search for a match starts at the beginning of the subject, and this
+is by far the most common case.
+
+A non-zero starting offset is useful when searching for another match in the
+same subject by calling \fBpcre_exec()\fR again after a previous success.
+Setting \fIstartoffset\fR differs from just passing over a shortened string and
+setting PCRE_NOTBOL in the case of a pattern that begins with any kind of
+lookbehind. For example, consider the pattern
+
+  \\Biss\\B
+
+which finds occurrences of "iss" in the middle of words. (\\B matches only if
+the current position in the subject is not a word boundary.) When applied to
+the string "Mississipi" the first call to \fBpcre_exec()\fR finds the first
+occurrence. If \fBpcre_exec()\fR is called again with just the remainder of the
+subject, namely "issipi", it does not match, because \\B is always false at the
+start of the subject, which is deemed to be a word boundary. However, if
+\fBpcre_exec()\fR is passed the entire string again, but with \fIstartoffset\fR
+set to 4, it finds the second occurrence of "iss" because it is able to look
+behind the starting point to discover that it is preceded by a letter.
+
+If a non-zero starting offset is passed when the pattern is anchored, one
+attempt to match at the given offset is tried. This can only succeed if the
+pattern does not require the match to be at the start of the subject.
+
 In general, a pattern matches a certain portion of the subject, and in
 addition, further substrings from the subject may be picked out by parts of the
 pattern. Following the usage in Jeffrey Friedl's book, this is called
@@ -547,6 +593,12 @@ meaning is faulted.
 inverted, that is, by default they are not greedy, but if followed by a
 question mark they are.
 
+(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start
+of the subject.
+
+(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for
+\fBpcre_exec()\fR have no Perl equivalents.
+
 
 .SH REGULAR EXPRESSION DETAILS
 The syntax and semantics of the regular expressions supported by PCRE are
@@ -730,16 +782,19 @@ first or last character matches \\w, respectively.
 The \\A, \\Z, and \\z assertions differ from the traditional circumflex and
 dollar (described below) in that they only ever match at the very start and end
 of the subject string, whatever options are set. They are not affected by the
-PCRE_NOTBOL or PCRE_NOTEOL options. The difference between \\Z and \\z is that
-\\Z matches before a newline that is the last character of the string as well
-as at the end of the string, whereas \\z matches only at the end.
+PCRE_NOTBOL or PCRE_NOTEOL options. If the \fIstartoffset\fR argument of
+\fBpcre_exec()\fR is non-zero, \\A can never match. The difference between \\Z
+and \\z is that \\Z matches before a newline that is the last character of the
+string as well as at the end of the string, whereas \\z matches only at the
+end.
 
 
 .SH CIRCUMFLEX AND DOLLAR
 Outside a character class, in the default matching mode, the circumflex
 character is an assertion which is true only if the current matching point is
-at the start of the subject string. Inside a character class, circumflex has an
-entirely different meaning (see below).
+at the start of the subject string. If the \fIstartoffset\fR argument of
+\fBpcre_exec()\fR is non-zero, circumflex can never match. Inside a character
+class, circumflex has an entirely different meaning (see below).
 
 Circumflex need not be the first character of the pattern if a number of
 alternatives are involved, but it should be the first thing in each alternative
@@ -766,8 +821,10 @@ after and immediately before an internal "\\n" character, respectively, in
 addition to matching at the start and end of the subject string. For example,
 the pattern /^abc$/ matches the subject string "def\\nabc" in multiline mode,
 but not otherwise. Consequently, patterns that are anchored in single line mode
-because all branches start with "^" are not anchored in multiline mode. The
-PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
+because all branches start with "^" are not anchored in multiline mode, and a
+match for circumflex is possible when the \fIstartoffset\fR argument of
+\fBpcre_exec()\fR is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if
+PCRE_MULTILINE is set.
 
 Note that the sequences \\A, \\Z, and \\z can be used to match the start and
 end of the subject in both modes, and if all branches of a pattern start with
@@ -1210,20 +1267,38 @@ Several assertions (of any sort) may occur in succession. For example,
 
   (?<=\\d{3})(?<!999)foo
 
-matches "foo" preceded by three digits that are not "999". Furthermore,
-assertions can be nested in any combination. 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".
+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
+
+  (?<=\\d{3}...)(?<!999)foo
+
+This time the first assertion looks at the preceding six characters, checking
+that the first three are digits, and then the second assertion checks that the
+preceding three characters are not "999".
+
+Assertions can be nested in any combination. For example,
 
   (?<=(?<!foo)bar)baz
 
 matches an occurrence of "baz" that is preceded by "bar" which in turn is not
-preceded by "foo".
+preceded by "foo", while
+
+  (?<=\\d{3}(?!999)...)foo
+
+is another pattern which matches "foo" preceded by three digits and any three
+characters that are not "999".
 
 Assertion subpatterns are not capturing subpatterns, and may not be repeated,
-because it makes no sense to assert the same thing several times. If an
-assertion contains capturing subpatterns within it, these are always counted
-for the purposes of numbering the capturing subpatterns in the whole pattern.
-Substring capturing is carried out for positive assertions, but it does not
-make sense for negative assertions.
+because it makes no sense to assert the same thing several times. If any kind
+of assertion contains capturing subpatterns within it, these are counted for
+the purposes of numbering the capturing subpatterns in the whole pattern.
+However, substring capturing is carried out only for positive assertions,
+because it does not make sense for negative assertions.
 
 Assertions count towards the maximum of 200 parenthesized subpatterns.
 
@@ -1368,7 +1443,7 @@ because the . metacharacter does not then match a newline, and if the subject
 string contains newlines, the pattern may match from the character immediately
 following one of them instead of from the very start. For example, the pattern
 
-   (.*) second
+  (.*) second
 
 matches the subject "first\\nand second" (where \\n stands for a newline
 character) with the first captured substring being "and". In order to do this,
@@ -1379,6 +1454,35 @@ newlines, the best performance is obtained by setting PCRE_DOTALL, or starting
 the pattern with ^.* to indicate explicit anchoring. That saves PCRE from
 having to scan along the subject looking for a newline to restart at.
 
+Beware of patterns that contain nested indefinite repeats. These can take a
+long time to run when applied to a string that does not match. Consider the
+pattern fragment
+
+  (a+)*
+
+This can match "aaaa" in 33 different ways, and this number increases very
+rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4
+times, and for each of those cases other than 0, the + repeats can match
+different numbers of times.) When the remainder of the pattern is such that the
+entire match is going to fail, PCRE has in principle to try every possible
+variation, and this can take an extremely long time.
+
+An optimization catches some of the more simple cases such as
+
+  (a+)*b
+
+where a literal character follows. Before embarking on the standard matching
+procedure, PCRE checks that there is a "b" later in the subject string, and if
+there is not, it fails the match immediately. However, when there is no
+following literal this optimization cannot be used. You can see the difference
+by comparing the behaviour of
+
+  (a+)*\\d
+
+with the pattern above. The former gives a failure almost instantly when
+applied to a whole line of "a" characters, whereas the latter takes an
+appreciable time with strings longer than about 20 characters.
+
 .SH AUTHOR
 Philip Hazel <ph10@cam.ac.uk>
 .br
@@ -1390,4 +1494,6 @@ Cambridge CB2 3QG, England.
 .br
 Phone: +44 1223 334714
 
+Last updated: 29 July 1999
+.br
 Copyright (c) 1997-1999 University of Cambridge.
diff --git a/ext/pcre/pcrelib/pcre.3.html b/ext/pcre/pcrelib/pcre.3.html
new file mode 100644 (file)
index 0000000..3417579
--- /dev/null
@@ -0,0 +1,1973 @@
+<HTML>
+<HEAD>
+<TITLE>pcre specification</TITLE>
+</HEAD>
+<body bgcolor="#FFFFFF" text="#00005A">
+<H1>pcre specification</H1>
+This HTML document has been generated automatically from the original man page.
+If there is any nonsense in it, please consult the man page in case the
+conversion went wrong.
+<UL>
+<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>
+<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>
+<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>
+<LI><A NAME="TOC4" HREF="#SEC4">MULTI-THREADING</A>
+<LI><A NAME="TOC5" HREF="#SEC5">COMPILING A PATTERN</A>
+<LI><A NAME="TOC6" HREF="#SEC6">STUDYING A PATTERN</A>
+<LI><A NAME="TOC7" HREF="#SEC7">LOCALE SUPPORT</A>
+<LI><A NAME="TOC8" HREF="#SEC8">INFORMATION ABOUT A PATTERN</A>
+<LI><A NAME="TOC9" HREF="#SEC9">MATCHING A PATTERN</A>
+<LI><A NAME="TOC10" HREF="#SEC10">EXTRACTING CAPTURED SUBSTRINGS</A>
+<LI><A NAME="TOC11" HREF="#SEC11">LIMITATIONS</A>
+<LI><A NAME="TOC12" HREF="#SEC12">DIFFERENCES FROM PERL</A>
+<LI><A NAME="TOC13" HREF="#SEC13">REGULAR EXPRESSION DETAILS</A>
+<LI><A NAME="TOC14" HREF="#SEC14">BACKSLASH</A>
+<LI><A NAME="TOC15" HREF="#SEC15">CIRCUMFLEX AND DOLLAR</A>
+<LI><A NAME="TOC16" HREF="#SEC16">FULL STOP (PERIOD, DOT)</A>
+<LI><A NAME="TOC17" HREF="#SEC17">SQUARE BRACKETS</A>
+<LI><A NAME="TOC18" HREF="#SEC18">VERTICAL BAR</A>
+<LI><A NAME="TOC19" HREF="#SEC19">INTERNAL OPTION SETTING</A>
+<LI><A NAME="TOC20" HREF="#SEC20">SUBPATTERNS</A>
+<LI><A NAME="TOC21" HREF="#SEC21">REPETITION</A>
+<LI><A NAME="TOC22" HREF="#SEC22">BACK REFERENCES</A>
+<LI><A NAME="TOC23" HREF="#SEC23">ASSERTIONS</A>
+<LI><A NAME="TOC24" HREF="#SEC24">ONCE-ONLY SUBPATTERNS</A>
+<LI><A NAME="TOC25" HREF="#SEC25">CONDITIONAL SUBPATTERNS</A>
+<LI><A NAME="TOC26" HREF="#SEC26">COMMENTS</A>
+<LI><A NAME="TOC27" HREF="#SEC27">PERFORMANCE</A>
+<LI><A NAME="TOC28" HREF="#SEC28">AUTHOR</A>
+</UL>
+<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>
+<P>
+pcre - Perl-compatible regular expressions.
+</P>
+<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>
+<P>
+<B>#include &#60;pcre.h&#62;</B>
+</P>
+<P>
+<B>pcre *pcre_compile(const char *<I>pattern</I>, int <I>options</I>,</B>
+<B>const char **<I>errptr</I>, int *<I>erroffset</I>,</B>
+<B>const unsigned char *<I>tableptr</I>);</B>
+</P>
+<P>
+<B>pcre_extra *pcre_study(const pcre *<I>code</I>, int <I>options</I>,</B>
+<B>const char **<I>errptr</I>);</B>
+</P>
+<P>
+<B>int pcre_exec(const pcre *<I>code</I>, const pcre_extra *<I>extra</I>,</B>
+<B>const char *<I>subject</I>, int <I>length</I>, int <I>startoffset</I>,</B>
+<B>int <I>options</I>, int *<I>ovector</I>, int <I>ovecsize</I>);</B>
+</P>
+<P>
+<B>int pcre_copy_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B>
+<B>int <I>stringcount</I>, int <I>stringnumber</I>, char *<I>buffer</I>,</B>
+<B>int <I>buffersize</I>);</B>
+</P>
+<P>
+<B>int pcre_get_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B>
+<B>int <I>stringcount</I>, int <I>stringnumber</I>,</B>
+<B>const char **<I>stringptr</I>);</B>
+</P>
+<P>
+<B>int pcre_get_substring_list(const char *<I>subject</I>,</B>
+<B>int *<I>ovector</I>, int <I>stringcount</I>, const char ***<I>listptr</I>);</B>
+</P>
+<P>
+<B>const unsigned char *pcre_maketables(void);</B>
+</P>
+<P>
+<B>int pcre_info(const pcre *<I>code</I>, int *<I>optptr</I>, int</B>
+<B>*<I>firstcharptr</I>);</B>
+</P>
+<P>
+<B>char *pcre_version(void);</B>
+</P>
+<P>
+<B>void *(*pcre_malloc)(size_t);</B>
+</P>
+<P>
+<B>void (*pcre_free)(void *);</B>
+</P>
+<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>
+<P>
+The PCRE library is a set of functions that implement regular expression
+pattern matching using the same syntax and semantics as Perl 5, with just a few
+differences (see below). The current implementation corresponds to Perl 5.005.
+</P>
+<P>
+PCRE has its own native API, which is described in this document. There is also
+a set of wrapper functions that correspond to the POSIX API. These are
+described in the <B>pcreposix</B> documentation.
+</P>
+<P>
+The native API function prototypes are defined in the header file <B>pcre.h</B>,
+and on Unix systems the library itself is called <B>libpcre.a</B>, so can be
+accessed by adding <B>-lpcre</B> to the command for linking an application which
+calls it.
+</P>
+<P>
+The functions <B>pcre_compile()</B>, <B>pcre_study()</B>, and <B>pcre_exec()</B>
+are used for compiling and matching regular expressions, while
+<B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and
+<B>pcre_get_substring_list()</B> are convenience functions for extracting
+captured substrings from a matched subject string. The function
+<B>pcre_maketables()</B> is used (optionally) to build a set of character tables
+in the current locale for passing to <B>pcre_compile()</B>.
+</P>
+<P>
+The function <B>pcre_info()</B> is used to find out information about a compiled
+pattern, while the function <B>pcre_version()</B> returns a pointer to a string
+containing the version of PCRE and its date of release.
+</P>
+<P>
+The global variables <B>pcre_malloc</B> and <B>pcre_free</B> initially contain
+the entry points of the standard <B>malloc()</B> and <B>free()</B> functions
+respectively. PCRE calls the memory management functions via these variables,
+so a calling program can replace them if it wishes to intercept the calls. This
+should be done before calling any PCRE functions.
+</P>
+<LI><A NAME="SEC4" HREF="#TOC1">MULTI-THREADING</A>
+<P>
+The PCRE functions can be used in multi-threading applications, with the
+proviso that the memory management functions pointed to by <B>pcre_malloc</B>
+and <B>pcre_free</B> are shared by all threads.
+</P>
+<P>
+The compiled form of a regular expression is not altered during matching, so
+the same compiled pattern can safely be used by several threads at once.
+</P>
+<LI><A NAME="SEC5" HREF="#TOC1">COMPILING A PATTERN</A>
+<P>
+The function <B>pcre_compile()</B> is called to compile a pattern into an
+internal form. The pattern is a C string terminated by a binary zero, and
+is passed in the argument <I>pattern</I>. A pointer to a single block of memory
+that is obtained via <B>pcre_malloc</B> is returned. This contains the
+compiled code and related data. The <B>pcre</B> type is defined for this for
+convenience, but in fact <B>pcre</B> is just a typedef for <B>void</B>, since the
+contents of the block are not externally defined. It is up to the caller to
+free the memory when it is no longer required.
+</P>
+<P>
+The size of a compiled pattern is roughly proportional to the length of the
+pattern string, except that each character class (other than those containing
+just a single character, negated or not) requires 33 bytes, and repeat
+quantifiers with a minimum greater than one or a bounded maximum cause the
+relevant portions of the compiled pattern to be replicated.
+</P>
+<P>
+The <I>options</I> argument contains independent bits that affect the
+compilation. It should be zero if no options are required. Some of the options,
+in particular, those that are compatible with Perl, can also be set and unset
+from within the pattern (see the detailed description of regular expressions
+below). For these options, the contents of the <I>options</I> argument specifies
+their initial settings at the start of compilation and execution. The
+PCRE_ANCHORED option can be set at the time of matching as well as at compile
+time.
+</P>
+<P>
+If <I>errptr</I> is NULL, <B>pcre_compile()</B> returns NULL immediately.
+Otherwise, if compilation of a pattern fails, <B>pcre_compile()</B> returns
+NULL, and sets the variable pointed to by <I>errptr</I> to point to a textual
+error message. The offset from the start of the pattern to the character where
+the error was discovered is placed in the variable pointed to by
+<I>erroffset</I>, which must not be NULL. If it is, an immediate error is given.
+</P>
+<P>
+If the final argument, <I>tableptr</I>, is NULL, PCRE uses a default set of
+character tables which are built when it is compiled, using the default C
+locale. Otherwise, <I>tableptr</I> must be the result of a call to
+<B>pcre_maketables()</B>. See the section on locale support below.
+</P>
+<P>
+The following option bits are defined in the header file:
+</P>
+<P>
+<PRE>
+  PCRE_ANCHORED
+</PRE>
+</P>
+<P>
+If this bit is set, the pattern is forced to be "anchored", that is, it is
+constrained to match only at the start of the string which is being searched
+(the "subject string"). This effect can also be achieved by appropriate
+constructs in the pattern itself, which is the only way to do it in Perl.
+</P>
+<P>
+<PRE>
+  PCRE_CASELESS
+</PRE>
+</P>
+<P>
+If this bit is set, letters in the pattern match both upper and lower case
+letters. It is equivalent to Perl's /i option.
+</P>
+<P>
+<PRE>
+  PCRE_DOLLAR_ENDONLY
+</PRE>
+</P>
+<P>
+If this bit is set, a dollar metacharacter in the pattern matches only at the
+end of the subject string. Without this option, a dollar also matches
+immediately before the final character if it is a newline (but not before any
+other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is
+set. There is no equivalent to this option in Perl.
+</P>
+<P>
+<PRE>
+  PCRE_DOTALL
+</PRE>
+</P>
+<P>
+If this bit is set, a dot metacharater in the pattern matches all characters,
+including newlines. Without it, newlines are excluded. This option is
+equivalent to Perl's /s option. A negative class such as [^a] always matches a
+newline character, independent of the setting of this option.
+</P>
+<P>
+<PRE>
+  PCRE_EXTENDED
+</PRE>
+</P>
+<P>
+If this bit is set, whitespace data characters in the pattern are totally
+ignored except when escaped or inside a character class, and characters between
+an unescaped # outside a character class and the next newline character,
+inclusive, are also ignored. This is equivalent to Perl's /x option, and makes
+it possible to include comments inside complicated patterns. Note, however,
+that this applies only to data characters. Whitespace characters may never
+appear within special character sequences in a pattern, for example within the
+sequence (?( which introduces a conditional subpattern.
+</P>
+<P>
+<PRE>
+  PCRE_EXTRA
+</PRE>
+</P>
+<P>
+This option turns on additional functionality of PCRE that is incompatible with
+Perl. Any backslash in a pattern that is followed by a letter that has no
+special meaning causes an error, thus reserving these combinations for future
+expansion. By default, as in Perl, a backslash followed by a letter with no
+special meaning is treated as a literal. There are at present no other features
+controlled by this option.
+</P>
+<P>
+<PRE>
+  PCRE_MULTILINE
+</PRE>
+</P>
+<P>
+By default, PCRE treats the subject string as consisting of a single "line" of
+characters (even if it actually contains several newlines). The "start of line"
+metacharacter (^) matches only at the start of the string, while the "end of
+line" metacharacter ($) matches only at the end of the string, or before a
+terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as
+Perl.
+</P>
+<P>
+When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs
+match immediately following or immediately before any newline in the subject
+string, respectively, as well as at the very start and end. This is equivalent
+to Perl's /m option. If there are no "\n" characters in a subject string, or
+no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no
+effect.
+</P>
+<P>
+<PRE>
+  PCRE_UNGREEDY
+</PRE>
+</P>
+<P>
+This option inverts the "greediness" of the quantifiers so that they are not
+greedy by default, but become greedy if followed by "?". It is not compatible
+with Perl. It can also be set by a (?U) option setting within the pattern.
+</P>
+<LI><A NAME="SEC6" HREF="#TOC1">STUDYING A PATTERN</A>
+<P>
+When a pattern is going to be used several times, it is worth spending more
+time analyzing it in order to speed up the time taken for matching. The
+function <B>pcre_study()</B> takes a pointer to a compiled pattern as its first
+argument, and returns a pointer to a <B>pcre_extra</B> block (another <B>void</B>
+typedef) containing additional information about the pattern; this can be
+passed to <B>pcre_exec()</B>. If no additional information is available, NULL
+is returned.
+</P>
+<P>
+The second argument contains option bits. At present, no options are defined
+for <B>pcre_study()</B>, and this argument should always be zero.
+</P>
+<P>
+The third argument for <B>pcre_study()</B> is a pointer to an error message. If
+studying succeeds (even if no data is returned), the variable it points to is
+set to NULL. Otherwise it points to a textual error message.
+</P>
+<P>
+At present, studying a pattern is useful only for non-anchored patterns that do
+not have a single fixed starting character. A bitmap of possible starting
+characters is created.
+</P>
+<LI><A NAME="SEC7" HREF="#TOC1">LOCALE SUPPORT</A>
+<P>
+PCRE handles caseless matching, and determines whether characters are letters,
+digits, or whatever, by reference to a set of tables. The library contains a
+default set of tables which is created in the default C locale when PCRE is
+compiled. This is used when the final argument of <B>pcre_compile()</B> is NULL,
+and is sufficient for many applications.
+</P>
+<P>
+An alternative set of tables can, however, be supplied. Such tables are built
+by calling the <B>pcre_maketables()</B> function, which has no arguments, in the
+relevant locale. The result can then be passed to <B>pcre_compile()</B> as often
+as necessary. For example, to build and use tables that are appropriate for the
+French locale (where accented characters with codes greater than 128 are
+treated as letters), the following code could be used:
+</P>
+<P>
+<PRE>
+  setlocale(LC_CTYPE, "fr");
+  tables = pcre_maketables();
+  re = pcre_compile(..., tables);
+</PRE>
+</P>
+<P>
+The tables are built in memory that is obtained via <B>pcre_malloc</B>. The
+pointer that is passed to <B>pcre_compile</B> is saved with the compiled
+pattern, and the same tables are used via this pointer by <B>pcre_study()</B>
+and <B>pcre_exec()</B>. Thus for any single pattern, compilation, studying and
+matching all happen in the same locale, but different patterns can be compiled
+in different locales. It is the caller's responsibility to ensure that the
+memory containing the tables remains available for as long as it is needed.
+</P>
+<LI><A NAME="SEC8" HREF="#TOC1">INFORMATION ABOUT A PATTERN</A>
+<P>
+The <B>pcre_info()</B> function returns information about a compiled pattern.
+Its yield is the number of capturing subpatterns, or one of the following
+negative numbers:
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_NULL       the argument <I>code</I> was NULL
+  PCRE_ERROR_BADMAGIC   the "magic number" was not found
+</PRE>
+</P>
+<P>
+If the <I>optptr</I> argument is not NULL, a copy of the options with which the
+pattern was compiled is placed in the integer it points to. These option bits
+are those specified in the call to <B>pcre_compile()</B>, modified by any
+top-level option settings within the pattern itself, and with the PCRE_ANCHORED
+bit set if the form of the pattern implies that it can match only at the start
+of a subject string.
+</P>
+<P>
+If the pattern is not anchored and the <I>firstcharptr</I> argument is not NULL,
+it is used to pass back information about the first character of any matched
+string. 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
+<I>firstcharptr</I>. Otherwise, if either
+</P>
+<P>
+(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
+starts with "^", or
+</P>
+<P>
+(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
+(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.
+</P>
+<LI><A NAME="SEC9" HREF="#TOC1">MATCHING A PATTERN</A>
+<P>
+The function <B>pcre_exec()</B> is called to match a subject string against a
+pre-compiled pattern, which is passed in the <I>code</I> argument. If the
+pattern has been studied, the result of the study should be passed in the
+<I>extra</I> argument. Otherwise this must be NULL.
+</P>
+<P>
+The PCRE_ANCHORED option can be passed in the <I>options</I> argument, whose
+unused bits must be zero. However, if a pattern was compiled with
+PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it
+cannot be made unachored at matching time.
+</P>
+<P>
+There are also three further options that can be set only at matching time:
+</P>
+<P>
+<PRE>
+  PCRE_NOTBOL
+</PRE>
+</P>
+<P>
+The first character of the string is not the beginning of a line, so the
+circumflex metacharacter should not match before it. Setting this without
+PCRE_MULTILINE (at compile time) causes circumflex never to match.
+</P>
+<P>
+<PRE>
+  PCRE_NOTEOL
+</PRE>
+</P>
+<P>
+The end of the string is not the end of a line, so the dollar metacharacter
+should not match it nor (except in multiline mode) a newline immediately before
+it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never
+to match.
+</P>
+<P>
+<PRE>
+  PCRE_NOTEMPTY
+</PRE>
+</P>
+<P>
+An empty string is not considered to be a valid match if this option is set. If
+there are alternatives in the pattern, they are tried. If all the alternatives
+match the empty string, the entire match fails. For example, if the pattern
+</P>
+<P>
+<PRE>
+  a?b?
+</PRE>
+</P>
+<P>
+is applied to a string not beginning with "a" or "b", it matches the empty
+string at the start of the subject. With PCRE_NOTEMPTY set, this match is not
+valid, so PCRE searches further into the string for occurrences of "a" or "b".
+Perl has no direct equivalent of this option, but it makes a special case of
+a pattern match of the empty string within its <B>split()</B> function, or when
+using the /g modifier. Using PCRE_NOTEMPTY it is possible to emulate this
+behaviour.
+</P>
+<P>
+The subject string is passed as a pointer in <I>subject</I>, a length in
+<I>length</I>, and a starting offset in <I>startoffset</I>. Unlike the pattern
+string, it may contain binary zero characters. When the starting offset is
+zero, the search for a match starts at the beginning of the subject, and this
+is by far the most common case.
+</P>
+<P>
+A non-zero starting offset is useful when searching for another match in the
+same subject by calling <B>pcre_exec()</B> again after a previous success.
+Setting <I>startoffset</I> differs from just passing over a shortened string and
+setting PCRE_NOTBOL in the case of a pattern that begins with any kind of
+lookbehind. For example, consider the pattern
+</P>
+<P>
+<PRE>
+  \Biss\B
+</PRE>
+</P>
+<P>
+which finds occurrences of "iss" in the middle of words. (\B matches only if
+the current position in the subject is not a word boundary.) When applied to
+the string "Mississipi" the first call to <B>pcre_exec()</B> finds the first
+occurrence. If <B>pcre_exec()</B> is called again with just the remainder of the
+subject, namely "issipi", it does not match, because \B is always false at the
+start of the subject, which is deemed to be a word boundary. However, if
+<B>pcre_exec()</B> is passed the entire string again, but with <I>startoffset</I>
+set to 4, it finds the second occurrence of "iss" because it is able to look
+behind the starting point to discover that it is preceded by a letter.
+</P>
+<P>
+If a non-zero starting offset is passed when the pattern is anchored, one
+attempt to match at the given offset is tried. This can only succeed if the
+pattern does not require the match to be at the start of the subject.
+</P>
+<P>
+In general, a pattern matches a certain portion of the subject, and in
+addition, further substrings from the subject may be picked out by parts of the
+pattern. Following the usage in Jeffrey Friedl's book, this is called
+"capturing" in what follows, and the phrase "capturing subpattern" is used for
+a fragment of a pattern that picks out a substring. PCRE supports several other
+kinds of parenthesized subpattern that do not cause substrings to be captured.
+</P>
+<P>
+Captured substrings are returned to the caller via a vector of integer offsets
+whose address is passed in <I>ovector</I>. The number of elements in the vector
+is passed in <I>ovecsize</I>. The first two-thirds of the vector is used to pass
+back captured substrings, each substring using a pair of integers. The
+remaining third of the vector is used as workspace by <B>pcre_exec()</B> while
+matching capturing subpatterns, and is not available for passing back
+information. The length passed in <I>ovecsize</I> should always be a multiple of
+three. If it is not, it is rounded down.
+</P>
+<P>
+When a match has been successful, information about captured substrings is
+returned in pairs of integers, starting at the beginning of <I>ovector</I>, and
+continuing up to two-thirds of its length at the most. The first element of a
+pair is set to the offset of the first character in a substring, and the second
+is set to the offset of the first character after the end of a substring. The
+first pair, <I>ovector[0]</I> and <I>ovector[1]</I>, identify the portion of the
+subject string matched by the entire pattern. The next pair is used for the
+first capturing subpattern, and so on. The value returned by <B>pcre_exec()</B>
+is the number of pairs that have been set. If there are no capturing
+subpatterns, the return value from a successful match is 1, indicating that
+just the first pair of offsets has been set.
+</P>
+<P>
+Some convenience functions are provided for extracting the captured substrings
+as separate strings. These are described in the following section.
+</P>
+<P>
+It is possible for an capturing subpattern number <I>n+1</I> to match some
+part of the subject when subpattern <I>n</I> has not been used at all. For
+example, if the string "abc" is matched against the pattern (a|(z))(bc)
+subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset
+values corresponding to the unused subpattern are set to -1.
+</P>
+<P>
+If a capturing subpattern is matched repeatedly, it is the last portion of the
+string that it matched that gets returned.
+</P>
+<P>
+If the vector is too small to hold all the captured substrings, it is used as
+far as possible (up to two-thirds of its length), and the function returns a
+value of zero. In particular, if the substring offsets are not of interest,
+<B>pcre_exec()</B> may be called with <I>ovector</I> passed as NULL and
+<I>ovecsize</I> as zero. However, if the pattern contains back references and
+the <I>ovector</I> isn't big enough to remember the related substrings, PCRE has
+to get additional memory for use during matching. Thus it is usually advisable
+to supply an <I>ovector</I>.
+</P>
+<P>
+Note that <B>pcre_info()</B> can be used to find out how many capturing
+subpatterns there are in a compiled pattern. The smallest size for
+<I>ovector</I> that will allow for <I>n</I> captured substrings in addition to
+the offsets of the substring matched by the whole pattern is (<I>n</I>+1)*3.
+</P>
+<P>
+If <B>pcre_exec()</B> fails, it returns a negative number. The following are
+defined in the header file:
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_NOMATCH        (-1)
+</PRE>
+</P>
+<P>
+The subject string did not match the pattern.
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_NULL           (-2)
+</PRE>
+</P>
+<P>
+Either <I>code</I> or <I>subject</I> was passed as NULL, or <I>ovector</I> was
+NULL and <I>ovecsize</I> was not zero.
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_BADOPTION      (-3)
+</PRE>
+</P>
+<P>
+An unrecognized bit was set in the <I>options</I> argument.
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_BADMAGIC       (-4)
+</PRE>
+</P>
+<P>
+PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch
+the case when it is passed a junk pointer. This is the error it gives when the
+magic number isn't present.
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_UNKNOWN_NODE   (-5)
+</PRE>
+</P>
+<P>
+While running the pattern match, an unknown item was encountered in the
+compiled pattern. This error could be caused by a bug in PCRE or by overwriting
+of the compiled pattern.
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_NOMEMORY       (-6)
+</PRE>
+</P>
+<P>
+If a pattern contains back references, but the <I>ovector</I> that is passed to
+<B>pcre_exec()</B> is not big enough to remember the referenced substrings, PCRE
+gets a block of memory at the start of matching to use for this purpose. If the
+call via <B>pcre_malloc()</B> fails, this error is given. The memory is freed at
+the end of matching.
+</P>
+<LI><A NAME="SEC10" HREF="#TOC1">EXTRACTING CAPTURED SUBSTRINGS</A>
+<P>
+Captured substrings can be accessed directly by using the offsets returned by
+<B>pcre_exec()</B> in <I>ovector</I>. For convenience, the functions
+<B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and
+<B>pcre_get_substring_list()</B> are provided for extracting captured substrings
+as new, separate, zero-terminated strings. A substring that contains a binary
+zero is correctly extracted and has a further zero added on the end, but the
+result does not, of course, function as a C string.
+</P>
+<P>
+The first three arguments are the same for all three functions: <I>subject</I>
+is the subject string which has just been successfully matched, <I>ovector</I>
+is a pointer to the vector of integer offsets that was passed to
+<B>pcre_exec()</B>, and <I>stringcount</I> is the number of substrings that
+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.
+</P>
+<P>
+The functions <B>pcre_copy_substring()</B> and <B>pcre_get_substring()</B>
+extract a single substring, whose number is given as <I>stringnumber</I>. A
+value of zero extracts the substring that matched the entire pattern, while
+higher values extract the captured substrings. For <B>pcre_copy_substring()</B>,
+the string is placed in <I>buffer</I>, whose length is given by
+<I>buffersize</I>, while for <B>pcre_get_substring()</B> a new block of store is
+obtained via <B>pcre_malloc</B>, and its address is returned via
+<I>stringptr</I>. The yield of the function is the length of the string, not
+including the terminating zero, or one of
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_NOMEMORY       (-6)
+</PRE>
+</P>
+<P>
+The buffer was too small for <B>pcre_copy_substring()</B>, or the attempt to get
+memory failed for <B>pcre_get_substring()</B>.
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_NOSUBSTRING    (-7)
+</PRE>
+</P>
+<P>
+There is no substring whose number is <I>stringnumber</I>.
+</P>
+<P>
+The <B>pcre_get_substring_list()</B> function extracts all available substrings
+and builds a list of pointers to them. All this is done in a single block of
+memory which is obtained via <B>pcre_malloc</B>. The address of the memory block
+is returned via <I>listptr</I>, which is also the start of the list of string
+pointers. The end of the list is marked by a NULL pointer. The yield of the
+function is zero if all went well, or
+</P>
+<P>
+<PRE>
+  PCRE_ERROR_NOMEMORY       (-6)
+</PRE>
+</P>
+<P>
+if the attempt to get the memory block failed.
+</P>
+<P>
+When any of these functions encounter a substring that is unset, which can
+happen when capturing subpattern number <I>n+1</I> matches some part of the
+subject, but subpattern <I>n</I> has not been used at all, they return an empty
+string. This can be distinguished from a genuine zero-length substring by
+inspecting the appropriate offset in <I>ovector</I>, which is negative for unset
+substrings.
+</P>
+<LI><A NAME="SEC11" HREF="#TOC1">LIMITATIONS</A>
+<P>
+There are some size limitations in PCRE but it is hoped that they will never in
+practice be relevant.
+The maximum length of a compiled pattern is 65539 (sic) bytes.
+All values in repeating quantifiers must be less than 65536.
+The maximum number of capturing subpatterns is 99.
+The maximum number of all parenthesized subpatterns, including capturing
+subpatterns, assertions, and other types of subpattern, is 200.
+</P>
+<P>
+The maximum length of a subject string is the largest positive number that an
+integer variable can hold. However, PCRE uses recursion to handle subpatterns
+and indefinite repetition. This means that the available stack space may limit
+the size of a subject string that can be processed by certain patterns.
+</P>
+<LI><A NAME="SEC12" HREF="#TOC1">DIFFERENCES FROM PERL</A>
+<P>
+The differences described here are with respect to Perl 5.005.
+</P>
+<P>
+1. By default, a whitespace character is any character that the C library
+function <B>isspace()</B> recognizes, though it is possible to compile PCRE with
+alternative character type tables. Normally <B>isspace()</B> matches space,
+formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5
+no longer includes vertical tab in its set of whitespace characters. The \v
+escape that was in the Perl documentation for a long time was never in fact
+recognized. However, the character itself was treated as whitespace at least
+up to 5.002. In 5.004 and 5.005 it does not match \s.
+</P>
+<P>
+2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits
+them, but they do not mean what you might think. For example, (?!a){3} does
+not assert that the next three characters are not "a". It just asserts that the
+next character is not "a" three times.
+</P>
+<P>
+3. Capturing subpatterns that occur inside negative lookahead assertions are
+counted, but their entries in the offsets vector are never set. Perl sets its
+numerical variables from any such patterns that are matched before the
+assertion fails to match something (thereby succeeding), but only if the
+negative lookahead assertion contains just one branch.
+</P>
+<P>
+4. Though binary zero characters are supported in the subject string, they are
+not allowed in a pattern string because it is passed as a normal C string,
+terminated by zero. The escape sequence "\0" can be used in the pattern to
+represent a binary zero.
+</P>
+<P>
+5. The following Perl escape sequences are not supported: \l, \u, \L, \U,
+\E, \Q. In fact these are implemented by Perl's general string-handling and
+are not part of its pattern matching engine.
+</P>
+<P>
+6. The Perl \G assertion is not supported as it is not relevant to single
+pattern matches.
+</P>
+<P>
+7. Fairly obviously, PCRE does not support the (?{code}) construction.
+</P>
+<P>
+8. There are at the time of writing some oddities in Perl 5.005_02 concerned
+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.
+</P>
+<P>
+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
+follow.
+</P>
+<P>
+9. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern
+/^(a)?(?(1)a|b)+$/ matches the string "a", whereas in PCRE it does not.
+However, in both Perl and PCRE /^(a)?a/ matched against "a" leaves $1 unset.
+</P>
+<P>
+10. PCRE provides some extensions to the Perl regular expression facilities:
+</P>
+<P>
+(a) Although lookbehind assertions must match fixed length strings, each
+alternative branch of a lookbehind assertion can match a different length of
+string. Perl 5.005 requires them all to have the same length.
+</P>
+<P>
+(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta-
+character matches only at the very end of the string.
+</P>
+<P>
+(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special
+meaning is faulted.
+</P>
+<P>
+(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is
+inverted, that is, by default they are not greedy, but if followed by a
+question mark they are.
+</P>
+<P>
+(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start
+of the subject.
+</P>
+<P>
+(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for
+<B>pcre_exec()</B> have no Perl equivalents.
+</P>
+<LI><A NAME="SEC13" HREF="#TOC1">REGULAR EXPRESSION DETAILS</A>
+<P>
+The syntax and semantics of the regular expressions supported by PCRE are
+described below. Regular expressions are also described in the Perl
+documentation and in a number of other books, some of which have copious
+examples. Jeffrey Friedl's "Mastering Regular Expressions", published by
+O'Reilly (ISBN 1-56592-257-3), covers them in great detail. The description
+here is intended as reference documentation.
+</P>
+<P>
+A regular expression is a pattern that is matched against a subject string from
+left to right. Most characters stand for themselves in a pattern, and match the
+corresponding characters in the subject. As a trivial example, the pattern
+</P>
+<P>
+<PRE>
+  The quick brown fox
+</PRE>
+</P>
+<P>
+matches a portion of a subject string that is identical to itself. The power of
+regular expressions comes from the ability to include alternatives and
+repetitions in the pattern. These are encoded in the pattern by the use of
+<I>meta-characters</I>, which do not stand for themselves but instead are
+interpreted in some special way.
+</P>
+<P>
+There are two different sets of meta-characters: those that are recognized
+anywhere in the pattern except within square brackets, and those that are
+recognized in square brackets. Outside square brackets, the meta-characters are
+as follows:
+</P>
+<P>
+<PRE>
+  \      general escape character with several uses
+  ^      assert start of subject (or line, in multiline mode)
+  $      assert end of subject (or line, in multiline mode)
+  .      match any character except newline (by default)
+  [      start character class definition
+  |      start of alternative branch
+  (      start subpattern
+  )      end subpattern
+  ?      extends the meaning of (
+         also 0 or 1 quantifier
+         also quantifier minimizer
+  *      0 or more quantifier
+  +      1 or more quantifier
+  {      start min/max quantifier
+</PRE>
+</P>
+<P>
+Part of a pattern that is in square brackets is called a "character class". In
+a character class the only meta-characters are:
+</P>
+<P>
+<PRE>
+  \      general escape character
+  ^      negate the class, but only if the first character
+  -      indicates character range
+  ]      terminates the character class
+</PRE>
+</P>
+<P>
+The following sections describe the use of each of the meta-characters.
+</P>
+<LI><A NAME="SEC14" HREF="#TOC1">BACKSLASH</A>
+<P>
+The backslash character has several uses. Firstly, if it is followed by a
+non-alphameric character, it takes away any special meaning that character may
+have. This use of backslash as an escape character applies both inside and
+outside character classes.
+</P>
+<P>
+For example, if you want to match a "*" character, you write "\*" in the
+pattern. This applies whether or not the following character would otherwise be
+interpreted as a meta-character, so it is always safe to precede a
+non-alphameric with "\" to specify that it stands for itself. In particular,
+if you want to match a backslash, you write "\\".
+</P>
+<P>
+If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the
+pattern (other than in a character class) and characters between a "#" outside
+a character class and the next newline character are ignored. An escaping
+backslash can be used to include a whitespace or "#" character as part of the
+pattern.
+</P>
+<P>
+A second use of backslash provides a way of encoding non-printing characters
+in patterns in a visible manner. There is no restriction on the appearance of
+non-printing characters, apart from the binary zero that terminates a pattern,
+but when a pattern is being prepared by text editing, it is usually easier to
+use one of the following escape sequences than the binary character it
+represents:
+</P>
+<P>
+<PRE>
+  \a     alarm, that is, the BEL character (hex 07)
+  \cx    "control-x", where x is any character
+  \e     escape (hex 1B)
+  \f     formfeed (hex 0C)
+  \n     newline (hex 0A)
+  \r     carriage return (hex 0D)
+  \t     tab (hex 09)
+  \xhh   character with hex code hh
+  \ddd   character with octal code ddd, or backreference
+</PRE>
+</P>
+<P>
+The precise effect of "\cx" is as follows: if "x" is a lower case letter, it
+is converted to upper case. Then bit 6 of the character (hex 40) is inverted.
+Thus "\cz" becomes hex 1A, but "\c{" becomes hex 3B, while "\c;" becomes hex
+7B.
+</P>
+<P>
+After "\x", up to two hexadecimal digits are read (letters can be in upper or
+lower case).
+</P>
+<P>
+After "\0" up to two further octal digits are read. In both cases, if there
+are fewer than two digits, just those that are present are used. Thus the
+sequence "\0\x\07" specifies two binary zeros followed by a BEL character.
+Make sure you supply two digits after the initial zero if the character that
+follows is itself an octal digit.
+</P>
+<P>
+The handling of a backslash followed by a digit other than 0 is complicated.
+Outside a character class, PCRE reads it and any following digits as a decimal
+number. If the number is less than 10, or if there have been at least that many
+previous capturing left parentheses in the expression, the entire sequence is
+taken as a <I>back reference</I>. A description of how this works is given
+later, following the discussion of parenthesized subpatterns.
+</P>
+<P>
+Inside a character class, or if the decimal number is greater than 9 and there
+have not been that many capturing subpatterns, PCRE re-reads up to three octal
+digits following the backslash, and generates a single byte from the least
+significant 8 bits of the value. Any subsequent digits stand for themselves.
+For example:
+</P>
+<P>
+<PRE>
+  \040   is another way of writing a space
+  \40    is the same, provided there are fewer than 40
+            previous capturing subpatterns
+  \7     is always a back reference
+  \11    might be a back reference, or another way of
+            writing a tab
+  \011   is always a tab
+  \0113  is a tab followed by the character "3"
+  \113   is the character with octal code 113 (since there
+            can be no more than 99 back references)
+  \377   is a byte consisting entirely of 1 bits
+  \81    is either a back reference, or a binary zero
+            followed by the two characters "8" and "1"
+</PRE>
+</P>
+<P>
+Note that octal values of 100 or greater must not be introduced by a leading
+zero, because no more than three octal digits are ever read.
+</P>
+<P>
+All the sequences that define a single byte value can be used both inside and
+outside character classes. In addition, inside a character class, the sequence
+"\b" is interpreted as the backspace character (hex 08). Outside a character
+class it has a different meaning (see below).
+</P>
+<P>
+The third use of backslash is for specifying generic character types:
+</P>
+<P>
+<PRE>
+  \d     any decimal digit
+  \D     any character that is not a decimal digit
+  \s     any whitespace character
+  \S     any character that is not a whitespace character
+  \w     any "word" character
+  \W     any "non-word" character
+</PRE>
+</P>
+<P>
+Each pair of escape sequences partitions the complete set of characters into
+two disjoint sets. Any given character matches one, and only one, of each pair.
+</P>
+<P>
+A "word" character is any letter or digit or the underscore character, that is,
+any character which can be part of a Perl "word". The definition of letters and
+digits is controlled by PCRE's character tables, and may vary if locale-
+specific matching is taking place (see "Locale support" above). For example, in
+the "fr" (French) locale, some character codes greater than 128 are used for
+accented letters, and these are matched by \w.
+</P>
+<P>
+These character type sequences can appear both inside and outside character
+classes. They each match one character of the appropriate type. If the current
+matching point is at the end of the subject string, all of them fail, since
+there is no character to match.
+</P>
+<P>
+The fourth use of backslash is for certain simple assertions. An assertion
+specifies a condition that has to be met at a particular point in a match,
+without consuming any characters from the subject string. The use of
+subpatterns for more complicated assertions is described below. The backslashed
+assertions are
+</P>
+<P>
+<PRE>
+  \b     word boundary
+  \B     not a word boundary
+  \A     start of subject (independent of multiline mode)
+  \Z     end of subject or newline at end (independent of multiline mode)
+  \z     end of subject (independent of multiline mode)
+</PRE>
+</P>
+<P>
+These assertions may not appear in character classes (but note that "\b" has a
+different meaning, namely the backspace character, inside a character class).
+</P>
+<P>
+A word boundary is a position in the subject string where the current character
+and the previous character do not both match \w or \W (i.e. one matches
+\w and the other matches \W), or the start or end of the string if the
+first or last character matches \w, respectively.
+</P>
+<P>
+The \A, \Z, and \z assertions differ from the traditional circumflex and
+dollar (described below) in that they only ever match at the very start and end
+of the subject string, whatever options are set. They are not affected by the
+PCRE_NOTBOL or PCRE_NOTEOL options. If the <I>startoffset</I> argument of
+<B>pcre_exec()</B> is non-zero, \A can never match. The difference between \Z
+and \z is that \Z matches before a newline that is the last character of the
+string as well as at the end of the string, whereas \z matches only at the
+end.
+</P>
+<LI><A NAME="SEC15" HREF="#TOC1">CIRCUMFLEX AND DOLLAR</A>
+<P>
+Outside a character class, in the default matching mode, the circumflex
+character is an assertion which is true only if the current matching point is
+at the start of the subject string. If the <I>startoffset</I> argument of
+<B>pcre_exec()</B> is non-zero, circumflex can never match. Inside a character
+class, circumflex has an entirely different meaning (see below).
+</P>
+<P>
+Circumflex need not be the first character of the pattern if a number of
+alternatives are involved, but it should be the first thing in each alternative
+in which it appears if the pattern is ever to match that branch. If all
+possible alternatives start with a circumflex, that is, if the pattern is
+constrained to match only at the start of the subject, it is said to be an
+"anchored" pattern. (There are also other constructs that can cause a pattern
+to be anchored.)
+</P>
+<P>
+A dollar character is an assertion which is true only if the current matching
+point is at the end of the subject string, or immediately before a newline
+character that is the last character in the string (by default). Dollar need
+not be the last character of the pattern if a number of alternatives are
+involved, but it should be the last item in any branch in which it appears.
+Dollar has no special meaning in a character class.
+</P>
+<P>
+The meaning of dollar can be changed so that it matches only at the very end of
+the string, by setting the PCRE_DOLLAR_ENDONLY option at compile or matching
+time. This does not affect the \Z assertion.
+</P>
+<P>
+The meanings of the circumflex and dollar characters are changed if the
+PCRE_MULTILINE option is set. When this is the case, they match immediately
+after and immediately before an internal "\n" character, respectively, in
+addition to matching at the start and end of the subject string. For example,
+the pattern /^abc$/ matches the subject string "def\nabc" in multiline mode,
+but not otherwise. Consequently, patterns that are anchored in single line mode
+because all branches start with "^" are not anchored in multiline mode, and a
+match for circumflex is possible when the <I>startoffset</I> argument of
+<B>pcre_exec()</B> is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if
+PCRE_MULTILINE is set.
+</P>
+<P>
+Note that the sequences \A, \Z, and \z can be used to match the start and
+end of the subject in both modes, and if all branches of a pattern start with
+\A is it always anchored, whether PCRE_MULTILINE is set or not.
+</P>
+<LI><A NAME="SEC16" HREF="#TOC1">FULL STOP (PERIOD, DOT)</A>
+<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.
+</P>
+<LI><A NAME="SEC17" HREF="#TOC1">SQUARE BRACKETS</A>
+<P>
+An opening square bracket introduces a character class, terminated by a closing
+square bracket. A closing square bracket on its own is not special. If a
+closing square bracket is required as a member of the class, it should be the
+first data character in the class (after an initial circumflex, if present) or
+escaped with a backslash.
+</P>
+<P>
+A character class matches a single character in the subject; the character must
+be in the set of characters defined by the class, unless the first character in
+the class is a circumflex, in which case the subject character must not be in
+the set defined by the class. If a circumflex is actually required as a member
+of the class, ensure it is not the first character, or escape it with a
+backslash.
+</P>
+<P>
+For example, the character class [aeiou] matches any lower case vowel, while
+[^aeiou] matches any character that is not a lower case vowel. Note that a
+circumflex is just a convenient notation for specifying the characters which
+are in the class by enumerating those that are not. It is not an assertion: it
+still consumes a character from the subject string, and fails if the current
+pointer is at the end of the string.
+</P>
+<P>
+When caseless matching is set, any letters in a class represent both their
+upper case and lower case versions, so for example, a caseless [aeiou] matches
+"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a
+caseful version would.
+</P>
+<P>
+The newline character is never treated in any special way in character classes,
+whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class
+such as [^a] will always match a newline.
+</P>
+<P>
+The minus (hyphen) character can be used to specify a range of characters in a
+character class. For example, [d-m] matches any letter between d and m,
+inclusive. If a minus character is required in a class, it must be escaped with
+a backslash or appear in a position where it cannot be interpreted as
+indicating a range, typically as the first or last character in the class.
+</P>
+<P>
+It is not possible to have the literal character "]" as the end character of a
+range. A pattern such as [W-]46] is interpreted as a class of two characters
+("W" and "-") followed by a literal string "46]", so it would match "W46]" or
+"-46]". However, if the "]" is escaped with a backslash it is interpreted as
+the end of range, so [W-\]46] is interpreted as a single class containing a
+range followed by two separate characters. The octal or hexadecimal
+representation of "]" can also be used to end a range.
+</P>
+<P>
+Ranges operate in ASCII collating sequence. They can also be used for
+characters specified numerically, for example [\000-\037]. If a range that
+includes letters is used when caseless matching is set, it matches the letters
+in either case. For example, [W-c] is equivalent to [][\^_`wxyzabc], matched
+caselessly, and if character tables for the "fr" locale are in use,
+[\xc8-\xcb] matches accented E characters in both cases.
+</P>
+<P>
+The character types \d, \D, \s, \S, \w, and \W may also appear in a
+character class, and add the characters that they match to the class. For
+example, [\dABCDEF] matches any hexadecimal digit. A circumflex can
+conveniently be used with the upper case character types to specify a more
+restricted set of characters than the matching lower case type. For example,
+the class [^\W_] matches any letter or digit, but not underscore.
+</P>
+<P>
+All non-alphameric characters other than \, -, ^ (at the start) and the
+terminating ] are non-special in character classes, but it does no harm if they
+are escaped.
+</P>
+<LI><A NAME="SEC18" HREF="#TOC1">VERTICAL BAR</A>
+<P>
+Vertical bar characters are used to separate alternative patterns. For example,
+the pattern
+</P>
+<P>
+<PRE>
+  gilbert|sullivan
+</PRE>
+</P>
+<P>
+matches either "gilbert" or "sullivan". Any number of alternatives may appear,
+and an empty alternative is permitted (matching the empty string).
+The matching process tries each alternative in turn, from left to right,
+and the first one that succeeds is used. If the alternatives are within a
+subpattern (defined below), "succeeds" means matching the rest of the main
+pattern as well as the alternative in the subpattern.
+</P>
+<LI><A NAME="SEC19" HREF="#TOC1">INTERNAL OPTION SETTING</A>
+<P>
+The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and PCRE_EXTENDED
+can be changed from within the pattern by a sequence of Perl option letters
+enclosed between "(?" and ")". The option letters are
+</P>
+<P>
+<PRE>
+  i  for PCRE_CASELESS
+  m  for PCRE_MULTILINE
+  s  for PCRE_DOTALL
+  x  for PCRE_EXTENDED
+</PRE>
+</P>
+<P>
+For example, (?im) sets caseless, multiline matching. It is also possible to
+unset these options by preceding the letter with a hyphen, and a combined
+setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and
+PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also
+permitted. If a letter appears both before and after the hyphen, the option is
+unset.
+</P>
+<P>
+The scope of these option changes depends on where in the pattern the setting
+occurs. For settings that are outside any subpattern (defined below), the
+effect is the same as if the options were set or unset at the start of
+matching. The following patterns all behave in exactly the same way:
+</P>
+<P>
+<PRE>
+  (?i)abc
+  a(?i)bc
+  ab(?i)c
+  abc(?i)
+</PRE>
+</P>
+<P>
+which in turn is the same as compiling the pattern abc with PCRE_CASELESS set.
+In other words, such "top level" settings apply to the whole pattern (unless
+there are other changes inside subpatterns). If there is more than one setting
+of the same option at top level, the rightmost setting is used.
+</P>
+<P>
+If an option change occurs inside a subpattern, the effect is different. This
+is a change of behaviour in Perl 5.005. An option change inside a subpattern
+affects only that part of the subpattern that follows it, so
+</P>
+<P>
+<PRE>
+  (a(?i)b)c
+</PRE>
+</P>
+<P>
+matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).
+By this means, options can be made to have different settings in different
+parts of the pattern. Any changes made in one alternative do carry on
+into subsequent branches within the same subpattern. For example,
+</P>
+<P>
+<PRE>
+  (a(?i)b|c)
+</PRE>
+</P>
+<P>
+matches "ab", "aB", "c", and "C", even though when matching "C" the first
+branch is abandoned before the option setting. This is because the effects of
+option settings happen at compile time. There would be some very weird
+behaviour otherwise.
+</P>
+<P>
+The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the
+same way as the Perl-compatible options by using the characters U and X
+respectively. The (?X) flag setting is special in that it must always occur
+earlier in the pattern than any of the additional features it turns on, even
+when it is at top level. It is best put at the start.
+</P>
+<LI><A NAME="SEC20" HREF="#TOC1">SUBPATTERNS</A>
+<P>
+Subpatterns are delimited by parentheses (round brackets), which can be nested.
+Marking part of a pattern as a subpattern does two things:
+</P>
+<P>
+1. It localizes a set of alternatives. For example, the pattern
+</P>
+<P>
+<PRE>
+  cat(aract|erpillar|)
+</PRE>
+</P>
+<P>
+matches one of the words "cat", "cataract", or "caterpillar". Without the
+parentheses, it would match "cataract", "erpillar" or the empty string.
+</P>
+<P>
+2. It sets up the subpattern as a capturing subpattern (as defined above).
+When the whole pattern matches, that portion of the subject string that matched
+the subpattern is passed back to the caller via the <I>ovector</I> argument of
+<B>pcre_exec()</B>. Opening parentheses are counted from left to right (starting
+from 1) to obtain the numbers of the capturing subpatterns.
+</P>
+<P>
+For example, if the string "the red king" is matched against the pattern
+</P>
+<P>
+<PRE>
+  the ((red|white) (king|queen))
+</PRE>
+</P>
+<P>
+the captured substrings are "red king", "red", and "king", and are numbered 1,
+2, and 3.
+</P>
+<P>
+The fact that plain parentheses fulfil two functions is not always helpful.
+There are often times when a grouping subpattern is required without a
+capturing requirement. If an opening parenthesis is followed by "?:", the
+subpattern does not do any capturing, and is not counted when computing the
+number of any subsequent capturing subpatterns. For example, if the string "the
+white queen" is matched against the pattern
+</P>
+<P>
+<PRE>
+  the ((?:red|white) (king|queen))
+</PRE>
+</P>
+<P>
+the captured substrings are "white queen" and "queen", and are numbered 1 and
+2. The maximum number of captured substrings is 99, and the maximum number of
+all subpatterns, both capturing and non-capturing, is 200.
+</P>
+<P>
+As a convenient shorthand, if any option settings are required at the start of
+a non-capturing subpattern, the option letters may appear between the "?" and
+the ":". Thus the two patterns
+</P>
+<P>
+<PRE>
+  (?i:saturday|sunday)
+  (?:(?i)saturday|sunday)
+</PRE>
+</P>
+<P>
+match exactly the same set of strings. Because alternative branches are tried
+from left to right, and options are not reset until the end of the subpattern
+is reached, an option setting in one branch does affect subsequent branches, so
+the above patterns match "SUNDAY" as well as "Saturday".
+</P>
+<LI><A NAME="SEC21" HREF="#TOC1">REPETITION</A>
+<P>
+Repetition is specified by quantifiers, which can follow any of the following
+items:
+</P>
+<P>
+<PRE>
+  a single character, possibly escaped
+  the . metacharacter
+  a character class
+  a back reference (see next section)
+  a parenthesized subpattern (unless it is an assertion - see below)
+</PRE>
+</P>
+<P>
+The general repetition quantifier specifies a minimum and maximum number of
+permitted matches, by giving the two numbers in curly brackets (braces),
+separated by a comma. The numbers must be less than 65536, and the first must
+be less than or equal to the second. For example:
+</P>
+<P>
+<PRE>
+  z{2,4}
+</PRE>
+</P>
+<P>
+matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special
+character. If the second number is omitted, but the comma is present, there is
+no upper limit; if the second number and the comma are both omitted, the
+quantifier specifies an exact number of required matches. Thus
+</P>
+<P>
+<PRE>
+  [aeiou]{3,}
+</PRE>
+</P>
+<P>
+matches at least 3 successive vowels, but may match many more, while
+</P>
+<P>
+<PRE>
+  \d{8}
+</PRE>
+</P>
+<P>
+matches exactly 8 digits. An opening curly bracket that appears in a position
+where a quantifier is not allowed, or one that does not match the syntax of a
+quantifier, is taken as a literal character. For example, {,6} is not a
+quantifier, but a literal string of four characters.
+</P>
+<P>
+The quantifier {0} is permitted, causing the expression to behave as if the
+previous item and the quantifier were not present.
+</P>
+<P>
+For convenience (and historical compatibility) the three most common
+quantifiers have single-character abbreviations:
+</P>
+<P>
+<PRE>
+  *    is equivalent to {0,}
+  +    is equivalent to {1,}
+  ?    is equivalent to {0,1}
+</PRE>
+</P>
+<P>
+It is possible to construct infinite loops by following a subpattern that can
+match no characters with a quantifier that has no upper limit, for example:
+</P>
+<P>
+<PRE>
+  (a?)*
+</PRE>
+</P>
+<P>
+Earlier versions of Perl and PCRE used to give an error at compile time for
+such patterns. However, because there are cases where this can be useful, such
+patterns are now accepted, but if any repetition of the subpattern does in fact
+match no characters, the loop is forcibly broken.
+</P>
+<P>
+By default, the quantifiers are "greedy", that is, they match as much as
+possible (up to the maximum number of permitted times), without causing the
+rest of the pattern to fail. The classic example of where this gives problems
+is in trying to match comments in C programs. These appear between the
+sequences /* and */ and within the sequence, individual * and / characters may
+appear. An attempt to match C comments by applying the pattern
+</P>
+<P>
+<PRE>
+  /\*.*\*/
+</PRE>
+</P>
+<P>
+to the string
+</P>
+<P>
+<PRE>
+  /* first command */  not comment  /* second comment */
+</PRE>
+</P>
+<P>
+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
+greedy, and instead matches the minimum number of times possible, so the
+pattern
+</P>
+<P>
+<PRE>
+  /\*.*?\*/
+</PRE>
+</P>
+<P>
+does the right thing with the C comments. The meaning of the various
+quantifiers is not otherwise changed, just the preferred number of matches.
+Do not confuse this use of question mark with its use as a quantifier in its
+own right. Because it has two uses, it can sometimes appear doubled, as in
+</P>
+<P>
+<PRE>
+  \d??\d
+</PRE>
+</P>
+<P>
+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
+greedy by following them with a question mark. In other words, it inverts the
+default behaviour.
+</P>
+<P>
+When a parenthesized subpattern is quantified with a minimum repeat count that
+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.
+</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
+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
+string contains no newlines, it is worth setting PCRE_DOTALL when the pattern
+begins with .* in order to obtain this optimization, or alternatively using ^
+to indicate anchoring explicitly.
+</P>
+<P>
+When a capturing subpattern is repeated, the value captured is the substring
+that matched the final iteration. For example, after
+</P>
+<P>
+<PRE>
+  (tweedle[dume]{3}\s*)+
+</PRE>
+</P>
+<P>
+has matched "tweedledum tweedledee" the value of the captured substring is
+"tweedledee". However, if there are nested capturing subpatterns, the
+corresponding captured values may have been set in previous iterations. For
+example, after
+</P>
+<P>
+<PRE>
+  /(a|(b))+/
+</PRE>
+</P>
+<P>
+matches "aba" the value of the second captured substring is "b".
+</P>
+<LI><A NAME="SEC22" HREF="#TOC1">BACK REFERENCES</A>
+<P>
+Outside a character class, a backslash followed by a digit greater than 0 (and
+possibly further digits) is a back reference to a capturing subpattern earlier
+(i.e. to its left) in the pattern, provided there have been that many previous
+capturing left parentheses.
+</P>
+<P>
+However, if the decimal number following the backslash is less than 10, it is
+always taken as a back reference, and causes an error only if there are not
+that many capturing left parentheses in the entire pattern. In other words, the
+parentheses that are referenced need not be to the left of the reference for
+numbers less than 10. See the section entitled "Backslash" above for further
+details of the handling of digits following a backslash.
+</P>
+<P>
+A back reference matches whatever actually matched the capturing subpattern in
+the current subject string, rather than anything matching the subpattern
+itself. So the pattern
+</P>
+<P>
+<PRE>
+  (sens|respons)e and \1ibility
+</PRE>
+</P>
+<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,
+</P>
+<P>
+<PRE>
+  ((?i)rah)\s+\1
+</PRE>
+</P>
+<P>
+matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original
+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
+references to it always fail. For example, the pattern
+</P>
+<P>
+<PRE>
+  (a|(bc))\2
+</PRE>
+</P>
+<P>
+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.
+</P>
+<P>
+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.
+However, such references can be useful inside repeated subpatterns. For
+example, the pattern
+</P>
+<P>
+<PRE>
+  (a|b\1)+
+</PRE>
+</P>
+<P>
+matches any number of "a"s and also "aba", "ababaa" etc. At each iteration of
+the subpattern, the back reference matches the character string corresponding
+to the previous iteration. In order for this to work, the pattern must be such
+that the first iteration does not need to match the back reference. This can be
+done using alternation, as in the example above, or by a quantifier with a
+minimum of zero.
+</P>
+<LI><A NAME="SEC23" HREF="#TOC1">ASSERTIONS</A>
+<P>
+An assertion is a test on the characters following or preceding the current
+matching point that does not actually consume any characters. The simple
+assertions coded as \b, \B, \A, \Z, \z, ^ and $ are described above. More
+complicated assertions are coded as subpatterns. There are two kinds: those
+that look ahead of the current position in the subject string, and those that
+look behind it.
+</P>
+<P>
+An assertion subpattern is matched in the normal way, except that it does not
+cause the current matching position to be changed. Lookahead assertions start
+with (?= for positive assertions and (?! for negative assertions. For example,
+</P>
+<P>
+<PRE>
+  \w+(?=;)
+</PRE>
+</P>
+<P>
+matches a word followed by a semicolon, but does not include the semicolon in
+the match, and
+</P>
+<P>
+<PRE>
+  foo(?!bar)
+</PRE>
+</P>
+<P>
+matches any occurrence of "foo" that is not followed by "bar". Note that the
+apparently similar pattern
+</P>
+<P>
+<PRE>
+  (?!foo)bar
+</PRE>
+</P>
+<P>
+does not find an occurrence of "bar" that is preceded by something other than
+"foo"; it finds any occurrence of "bar" whatsoever, because the assertion
+(?!foo) is always true when the next three characters are "bar". A
+lookbehind assertion is needed to achieve this effect.
+</P>
+<P>
+Lookbehind assertions start with (?&#60;= for positive assertions and (?&#60;! for
+negative assertions. For example,
+</P>
+<P>
+<PRE>
+  (?&#60;!foo)bar
+</PRE>
+</P>
+<P>
+does find an occurrence of "bar" that is not preceded by "foo". The contents of
+a lookbehind assertion are restricted such that all the strings it matches must
+have a fixed length. However, if there are several alternatives, they do not
+all have to have the same fixed length. Thus
+</P>
+<P>
+<PRE>
+  (?&#60;=bullock|donkey)
+</PRE>
+</P>
+<P>
+is permitted, but
+</P>
+<P>
+<PRE>
+  (?&#60;!dogs?|cats?)
+</PRE>
+</P>
+<P>
+causes an error at compile time. Branches that match different length strings
+are permitted only at the top level of a lookbehind assertion. This is an
+extension compared with Perl 5.005, which requires all branches to match the
+same length of string. An assertion such as
+</P>
+<P>
+<PRE>
+  (?&#60;=ab(c|de))
+</PRE>
+</P>
+<P>
+is not permitted, because its single top-level branch can match two different
+lengths, but it is acceptable if rewritten to use two top-level branches:
+</P>
+<P>
+<PRE>
+  (?&#60;=abc|abde)
+</PRE>
+</P>
+<P>
+The implementation of lookbehind assertions is, for each alternative, to
+temporarily move the current position back by the fixed width and then try to
+match. If there are insufficient characters before the current position, the
+match is deemed to fail. Lookbehinds in conjunction with once-only subpatterns
+can be particularly useful for matching at the ends of strings; an example is
+given at the end of the section on once-only subpatterns.
+</P>
+<P>
+Several assertions (of any sort) may occur in succession. For example,
+</P>
+<P>
+<PRE>
+  (?&#60;=\d{3})(?&#60;!999)foo
+</PRE>
+</P>
+<P>
+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".
+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
+</P>
+<P>
+<PRE>
+  (?&#60;=\d{3}...)(?&#60;!999)foo
+</PRE>
+</P>
+<P>
+This time the first assertion looks at the preceding six characters, checking
+that the first three are digits, and then the second assertion checks that the
+preceding three characters are not "999".
+</P>
+<P>
+Assertions can be nested in any combination. For example,
+</P>
+<P>
+<PRE>
+  (?&#60;=(?&#60;!foo)bar)baz
+</PRE>
+</P>
+<P>
+matches an occurrence of "baz" that is preceded by "bar" which in turn is not
+preceded by "foo", while
+</P>
+<P>
+<PRE>
+  (?&#60;=\d{3}(?!999)...)foo
+</PRE>
+</P>
+<P>
+is another pattern which matches "foo" preceded by three digits and any three
+characters that are not "999".
+</P>
+<P>
+Assertion subpatterns are not capturing subpatterns, and may not be repeated,
+because it makes no sense to assert the same thing several times. If any kind
+of assertion contains capturing subpatterns within it, these are counted for
+the purposes of numbering the capturing subpatterns in the whole pattern.
+However, substring capturing is carried out only for positive assertions,
+because it does not make sense for negative assertions.
+</P>
+<P>
+Assertions count towards the maximum of 200 parenthesized subpatterns.
+</P>
+<LI><A NAME="SEC24" HREF="#TOC1">ONCE-ONLY SUBPATTERNS</A>
+<P>
+With both maximizing and minimizing repetition, failure of what follows
+normally causes the repeated item to be re-evaluated to see if a different
+number of repeats allows the rest of the pattern to match. Sometimes it is
+useful to prevent this, either to change the nature of the match, or to cause
+it fail earlier than it otherwise might, when the author of the pattern knows
+there is no point in carrying on.
+</P>
+<P>
+Consider, for example, the pattern \d+foo when applied to the subject line
+</P>
+<P>
+<PRE>
+  123456bar
+</PRE>
+</P>
+<P>
+After matching all 6 digits and then failing to match "foo", the normal
+action of the matcher is to try again with only 5 digits matching the \d+
+item, and then with 4, and so on, before ultimately failing. Once-only
+subpatterns provide the means for specifying that once a portion of the pattern
+has matched, it is not to be re-evaluated in this way, so the matcher would
+give up immediately on failing to match "foo" the first time. The notation is
+another kind of special parenthesis, starting with (?&#62; as in this example:
+</P>
+<P>
+<PRE>
+  (?&#62;\d+)bar
+</PRE>
+</P>
+<P>
+This kind of parenthesis "locks up" the  part of the pattern it contains once
+it has matched, and a failure further into the pattern is prevented from
+backtracking into it. Backtracking past it to previous items, however, works as
+normal.
+</P>
+<P>
+An alternative description is that a subpattern of this type matches the string
+of characters that an identical standalone pattern would match, if anchored at
+the current point in the subject string.
+</P>
+<P>
+Once-only subpatterns are not capturing subpatterns. Simple cases such as the
+above example can be thought of as a maximizing repeat that must swallow
+everything it can. So, while both \d+ and \d+? are prepared to adjust the
+number of digits they match in order to make the rest of the pattern match,
+(?&#62;\d+) can only match an entire sequence of digits.
+</P>
+<P>
+This construction can of course contain arbitrarily complicated subpatterns,
+and it can be nested.
+</P>
+<P>
+Once-only subpatterns can be used in conjunction with lookbehind assertions to
+specify efficient matching at the end of the subject string. Consider a simple
+pattern such as
+</P>
+<P>
+<PRE>
+  abcd$
+</PRE>
+</P>
+<P>
+when applied to a long string which does not match it. Because matching
+proceeds from left to right, PCRE will look for each "a" in the subject and
+then see if what follows matches the rest of the pattern. If the pattern is
+specified as
+</P>
+<P>
+<PRE>
+  ^.*abcd$
+</PRE>
+</P>
+<P>
+then the initial .* matches the entire string at first, but when this fails, 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>
+  ^(?&#62;.*)(?&#60;=abcd)
+</PRE>
+</P>
+<P>
+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 processing time.
+</P>
+<LI><A NAME="SEC25" HREF="#TOC1">CONDITIONAL SUBPATTERNS</A>
+<P>
+It is possible to cause the matching process to obey a subpattern
+conditionally or to choose between two alternative subpatterns, depending on
+the result of an assertion, or whether a previous capturing subpattern matched
+or not. The two possible forms of conditional subpattern are
+</P>
+<P>
+<PRE>
+  (?(condition)yes-pattern)
+  (?(condition)yes-pattern|no-pattern)
+</PRE>
+</P>
+<P>
+If the condition is satisfied, the yes-pattern is used; otherwise the
+no-pattern (if present) is used. If there are more than two alternatives in the
+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:
+</P>
+<P>
+<PRE>
+  ( \( )?    [^()]+    (?(1) \) )
+</PRE>
+</P>
+<P>
+The first part matches an optional opening parenthesis, and if that
+character is present, sets it as the first captured substring. The second part
+matches one or more characters that are not parentheses. The third part is a
+conditional subpattern that tests whether the first set of parentheses matched
+or not. If they did, that is, if subject started with an opening parenthesis,
+the condition is true, and so the yes-pattern is executed and a closing
+parenthesis is required. Otherwise, since no-pattern is not present, the
+subpattern matches nothing. In other words, this pattern matches a sequence of
+non-parentheses, optionally enclosed in parentheses.
+</P>
+<P>
+If the condition is not a sequence of digits, it must be an assertion. This may
+be a positive or negative lookahead or lookbehind assertion. Consider this
+pattern, again containing non-significant white space, and with the two
+alternatives on the second line:
+</P>
+<P>
+<PRE>
+  (?(?=[^a-z]*[a-z])
+  \d{2}[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
+</PRE>
+</P>
+<P>
+The condition is a positive lookahead assertion that matches an optional
+sequence of non-letters followed by a letter. In other words, it tests for the
+presence of at least one letter in the subject. If a letter is found, the
+subject is matched against the first alternative; otherwise it is matched
+against the second. This pattern matches strings in one of the two forms
+dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.
+</P>
+<LI><A NAME="SEC26" HREF="#TOC1">COMMENTS</A>
+<P>
+The sequence (?# marks the start of a comment which continues up to the next
+closing parenthesis. Nested parentheses are not permitted. The characters
+that make up a comment play no part in the pattern matching at all.
+</P>
+<P>
+If the PCRE_EXTENDED option is set, an unescaped # character outside a
+character class introduces a comment that continues up to the next newline
+character in the pattern.
+</P>
+<LI><A NAME="SEC27" HREF="#TOC1">PERFORMANCE</A>
+<P>
+Certain items that may appear in patterns are more efficient than others. It is
+more efficient to use a character class like [aeiou] than a set of alternatives
+such as (a|e|i|o|u). In general, the simplest construction that provides the
+required behaviour is usually the most efficient. Jeffrey Friedl's book
+contains a lot of discussion about optimizing regular expressions for efficient
+performance.
+</P>
+<P>
+When a pattern begins with .* and the PCRE_DOTALL option is set, the pattern is
+implicitly anchored by PCRE, since it can match only at the start of a subject
+string. However, if PCRE_DOTALL is not set, PCRE cannot make this optimization,
+because the . metacharacter does not then match a newline, and if the subject
+string contains newlines, the pattern may match from the character immediately
+following one of them instead of from the very start. For example, the pattern
+</P>
+<P>
+<PRE>
+  (.*) second
+</PRE>
+</P>
+<P>
+matches the subject "first\nand second" (where \n stands for a newline
+character) with the first captured substring being "and". In order to do this,
+PCRE has to retry the match starting after every newline in the subject.
+</P>
+<P>
+If you are using such a pattern with subject strings that do not contain
+newlines, the best performance is obtained by setting PCRE_DOTALL, or starting
+the pattern with ^.* to indicate explicit anchoring. That saves PCRE from
+having to scan along the subject looking for a newline to restart at.
+</P>
+<P>
+Beware of patterns that contain nested indefinite repeats. These can take a
+long time to run when applied to a string that does not match. Consider the
+pattern fragment
+</P>
+<P>
+<PRE>
+  (a+)*
+</PRE>
+</P>
+<P>
+This can match "aaaa" in 33 different ways, and this number increases very
+rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4
+times, and for each of those cases other than 0, the + repeats can match
+different numbers of times.) When the remainder of the pattern is such that the
+entire match is going to fail, PCRE has in principle to try every possible
+variation, and this can take an extremely long time.
+</P>
+<P>
+An optimization catches some of the more simple cases such as
+</P>
+<P>
+<PRE>
+  (a+)*b
+</PRE>
+</P>
+<P>
+where a literal character follows. Before embarking on the standard matching
+procedure, PCRE checks that there is a "b" later in the subject string, and if
+there is not, it fails the match immediately. However, when there is no
+following literal this optimization cannot be used. You can see the difference
+by comparing the behaviour of
+</P>
+<P>
+<PRE>
+  (a+)*\d
+</PRE>
+</P>
+<P>
+with the pattern above. The former gives a failure almost instantly when
+applied to a whole line of "a" characters, whereas the latter takes an
+appreciable time with strings longer than about 20 characters.
+</P>
+<LI><A NAME="SEC28" HREF="#TOC1">AUTHOR</A>
+<P>
+Philip Hazel &#60;ph10@cam.ac.uk&#62;
+<BR>
+University Computing Service,
+<BR>
+New Museums Site,
+<BR>
+Cambridge CB2 3QG, England.
+<BR>
+Phone: +44 1223 334714
+</P>
+<P>
+Last updated: 29 July 1999
+<BR>
+Copyright (c) 1997-1999 University of Cambridge.
diff --git a/ext/pcre/pcrelib/pcre.3.txt b/ext/pcre/pcrelib/pcre.3.txt
new file mode 100644 (file)
index 0000000..8bd367c
--- /dev/null
@@ -0,0 +1,1739 @@
+NAME
+     pcre - Perl-compatible regular expressions.
+
+
+
+SYNOPSIS
+     #include <pcre.h>
+
+     pcre *pcre_compile(const char *pattern, int options,
+          const char **errptr, int *erroffset,
+          const unsigned char *tableptr);
+
+     pcre_extra *pcre_study(const pcre *code, int options,
+          const char **errptr);
+
+     int pcre_exec(const pcre *code, const pcre_extra *extra,
+          const char *subject, int length, int startoffset,
+          int options, int *ovector, int ovecsize);
+
+     int pcre_copy_substring(const char *subject, int *ovector,
+          int stringcount, int stringnumber, char *buffer,
+          int buffersize);
+
+     int pcre_get_substring(const char *subject, int *ovector,
+          int stringcount, int stringnumber,
+          const char **stringptr);
+
+     int pcre_get_substring_list(const char *subject,
+          int *ovector, int stringcount, const char ***listptr);
+
+     const unsigned char *pcre_maketables(void);
+
+     int pcre_info(const pcre *code, int *optptr, *firstcharptr);
+
+     char *pcre_version(void);
+
+     void *(*pcre_malloc)(size_t);
+
+     void (*pcre_free)(void *);
+
+
+
+
+DESCRIPTION
+     The PCRE library is a set of functions that implement  regu-
+     lar  expression  pattern  matching using the same syntax and
+     semantics as Perl  5,  with  just  a  few  differences  (see
+     below).  The  current  implementation  corresponds  to  Perl
+     5.005.
+
+     PCRE has its own native API,  which  is  described  in  this
+     document.  There  is  also  a  set of wrapper functions that
+     correspond to the POSIX API.  These  are  described  in  the
+     pcreposix documentation.
+     The native API function prototypes are defined in the header
+     file  pcre.h,  and  on  Unix  systems  the library itself is
+     called libpcre.a, so can be accessed by adding -lpcre to the
+     command for linking an application which calls it.
+
+     The functions pcre_compile(), pcre_study(), and  pcre_exec()
+     are  used  for  compiling  and matching regular expressions,
+     while   pcre_copy_substring(),   pcre_get_substring(),   and
+     pcre_get_substring_list()   are  convenience  functions  for
+     extracting  captured  substrings  from  a  matched   subject
+     string.  The function pcre_maketables() is used (optionally)
+     to build a set of character tables in the current locale for
+     passing to pcre_compile().
+
+     The function pcre_info() is used  to  find  out  information
+     about  a compiled pattern, while the function pcre_version()
+     returns a pointer to a string containing the version of PCRE
+     and its date of release.
+
+     The global variables  pcre_malloc  and  pcre_free  initially
+     contain the entry points of the standard malloc() and free()
+     functions respectively. PCRE  calls  the  memory  management
+     functions  via  these  variables,  so  a calling program can
+     replace them if it  wishes  to  intercept  the  calls.  This
+     should be done before calling any PCRE functions.
+
+
+
+MULTI-THREADING
+     The PCRE functions can be used in  multi-threading  applica-
+     tions, with the proviso that the memory management functions
+     pointed to by pcre_malloc and pcre_free are  shared  by  all
+     threads.
+
+     The compiled form of a regular  expression  is  not  altered
+     during  matching, so the same compiled pattern can safely be
+     used by several threads at once.
+
+
+
+COMPILING A PATTERN
+     The function pcre_compile() is called to compile  a  pattern
+     into  an internal form. The pattern is a C string terminated
+     by a binary zero, and is passed in the argument  pattern.  A
+     pointer  to  a  single  block of memory that is obtained via
+     pcre_malloc is returned. This contains the compiled code and
+     related data. The pcre type is defined for this for conveni-
+     ence, but in fact pcre is just a typedef for void, since the
+     contents  of  the block are not externally defined. It is up
+     to the caller to free  the  memory  when  it  is  no  longer
+     required.
+
+     The size of a compiled pattern is  roughly  proportional  to
+     the length of the pattern string, except that each character
+     class (other than those containing just a single  character,
+     negated  or  not)  requires 33 bytes, and repeat quantifiers
+     with a minimum greater than one or a bounded  maximum  cause
+     the  relevant  portions of the compiled pattern to be repli-
+     cated.
+
+     The options argument contains independent bits  that  affect
+     the  compilation.  It  should  be  zero  if  no  options are
+     required. Some of the options, in particular, those that are
+     compatible  with Perl, can also be set and unset from within
+     the pattern (see the detailed description of regular expres-
+     sions below). For these options, the contents of the options
+     argument specifies their initial settings at  the  start  of
+     compilation  and  execution. The PCRE_ANCHORED option can be
+     set at the time of matching as well as at compile time.
+
+     If errptr is NULL, pcre_compile() returns NULL  immediately.
+     Otherwise, if compilation of a pattern fails, pcre_compile()
+     returns NULL, and sets the variable pointed to by errptr  to
+     point  to a textual error message. The offset from the start
+     of  the  pattern  to  the  character  where  the  error  was
+     discovered   is   placed  in  the  variable  pointed  to  by
+     erroffset, which must not be NULL. If it  is,  an  immediate
+     error is given.
+
+     If the final  argument,  tableptr,  is  NULL,  PCRE  uses  a
+     default  set  of character tables which are built when it is
+     compiled, using the default C  locale.  Otherwise,  tableptr
+     must  be  the result of a call to pcre_maketables(). See the
+     section on locale support below.
+
+     The following option bits are defined in the header file:
+
+       PCRE_ANCHORED
+
+     If this bit is set, the pattern is forced to be  "anchored",
+     that is, it is constrained to match only at the start of the
+     string which is being searched (the "subject string").  This
+     effect can also be achieved by appropriate constructs in the
+     pattern itself, which is the only way to do it in Perl.
+
+       PCRE_CASELESS
+
+     If this bit is set, letters in the pattern match both  upper
+     and  lower  case  letters.  It  is  equivalent  to Perl's /i
+     option.
+
+       PCRE_DOLLAR_ENDONLY
+
+     If this bit is set, a dollar metacharacter  in  the  pattern
+     matches  only at the end of the subject string. Without this
+     option, a dollar also matches immediately before  the  final
+     character  if it is a newline (but not before any other new-
+     lines).  The  PCRE_DOLLAR_ENDONLY  option  is   ignored   if
+     PCRE_MULTILINE is set. There is no equivalent to this option
+     in Perl.
+
+       PCRE_DOTALL
+
+     If this bit is  set,  a  dot  metacharater  in  the  pattern
+     matches all characters, including newlines. Without it, new-
+     lines are excluded. This option is equivalent to  Perl's  /s
+     option.  A negative class such as [^a] always matches a new-
+     line character, independent of the setting of this option.
+
+       PCRE_EXTENDED
+
+     If this bit is set, whitespace data characters in  the  pat-
+     tern  are  totally  ignored  except when escaped or inside a
+     character class, and characters between an unescaped #  out-
+     side  a  character  class  and  the  next newline character,
+     inclusive, are also ignored. This is equivalent to Perl's /x
+     option,  and  makes  it  possible to include comments inside
+     complicated patterns. Note, however, that this applies  only
+     to  data  characters. Whitespace characters may never appear
+     within special character sequences in a pattern, for example
+     within  the sequence (?( which introduces a conditional sub-
+     pattern.
+
+       PCRE_EXTRA
+
+     This option turns on additional functionality of  PCRE  that
+     is  incompatible  with Perl. Any backslash in a pattern that
+     is followed by a letter that has no special  meaning  causes
+     an  error,  thus  reserving  these  combinations  for future
+     expansion. By default, as in Perl, a backslash followed by a
+     letter  with  no  special  meaning  is treated as a literal.
+     There are at present no other features  controlled  by  this
+     option.
+
+       PCRE_MULTILINE
+
+     By default, PCRE treats the subject string as consisting  of
+     a  single "line" of characters (even if it actually contains
+     several newlines). The "start  of  line"  metacharacter  (^)
+     matches  only  at the start of the string, while the "end of
+     line" metacharacter ($) matches  only  at  the  end  of  the
+     string,    or   before   a   terminating   newline   (unless
+     PCRE_DOLLAR_ENDONLY is set). This is the same as Perl.
+
+     When PCRE_MULTILINE it is set, the "start of line" and  "end
+     of   line"   constructs   match   immediately  following  or
+     immediately  before  any  newline  in  the  subject  string,
+     respectively,  as well as at the very start and end. This is
+     equivalent to Perl's /m option. If there are no "\n" charac-
+     ters  in  a subject string, or no occurrences of ^ or $ in a
+     pattern, setting PCRE_MULTILINE has no effect.
+
+       PCRE_UNGREEDY
+
+     This option inverts the "greediness" of the  quantifiers  so
+     that  they  are  not greedy by default, but become greedy if
+     followed by "?". It is not compatible with Perl. It can also
+     be set by a (?U) option setting within the pattern.
+
+
+
+STUDYING A PATTERN
+     When a pattern is going to be  used  several  times,  it  is
+     worth  spending  more time analyzing it in order to speed up
+     the time taken for matching. The function pcre_study() takes
+     a  pointer  to a compiled pattern as its first argument, and
+     returns a  pointer  to  a  pcre_extra  block  (another  void
+     typedef)  containing  additional  information about the pat-
+     tern; this can be passed to pcre_exec().  If  no  additional
+     information is available, NULL is returned.
+
+     The second argument contains option  bits.  At  present,  no
+     options  are  defined  for  pcre_study(),  and this argument
+     should always be zero.
+
+     The third argument for pcre_study() is a pointer to an error
+     message. If studying succeeds (even if no data is returned),
+     the variable it points to  is  set  to  NULL.  Otherwise  it
+     points to a textual error message.
+
+     At present, studying a  pattern  is  useful  only  for  non-
+     anchored  patterns  that do not have a single fixed starting
+     character. A  bitmap  of  possible  starting  characters  is
+     created.
+
+
+
+LOCALE SUPPORT
+     PCRE handles caseless matching, and determines whether char-
+     acters  are  letters, digits, or whatever, by reference to a
+     set of tables. The library contains a default set of  tables
+     which  is  created in the default C locale when PCRE is com-
+     piled.  This  is   used   when   the   final   argument   of
+     pcre_compile()  is NULL, and is sufficient for many applica-
+     tions.
+
+     An alternative set of tables can, however, be supplied. Such
+     tables  are built by calling the pcre_maketables() function,
+     which has no arguments, in the relevant locale.  The  result
+     can  then be passed to pcre_compile() as often as necessary.
+     For example, to build and use tables  that  are  appropriate
+     for  the French locale (where accented characters with codes
+     greater than 128 are treated as letters), the following code
+     could be used:
+
+       setlocale(LC_CTYPE, "fr");
+       tables = pcre_maketables();
+       re = pcre_compile(..., tables);
+
+     The  tables  are  built  in  memory  that  is  obtained  via
+     pcre_malloc.  The  pointer that is passed to pcre_compile is
+     saved with the compiled pattern, and  the  same  tables  are
+     used  via this pointer by pcre_study() and pcre_exec(). Thus
+     for any single pattern, compilation, studying  and  matching
+     all happen in the same locale, but different patterns can be
+     compiled in different locales. It is the caller's  responsi-
+     bility  to  ensure  that  the  memory  containing the tables
+     remains available for as long as it is needed.
+
+
+
+INFORMATION ABOUT A PATTERN
+     The pcre_info() function returns information  about  a  com-
+     piled pattern.  Its yield is the number of capturing subpat-
+     terns, or one of the following negative numbers:
+
+       PCRE_ERROR_NULL       the argument code was NULL
+       PCRE_ERROR_BADMAGIC   the "magic number" was not found
+
+     If the optptr argument is not NULL, a copy  of  the  options
+     with which the pattern was compiled is placed in the integer
+     it points to. These option bits are those specified  in  the
+     call  to  pcre_compile(),  modified  by any top-level option
+     settings  within  the   pattern   itself,   and   with   the
+     PCRE_ANCHORED  bit  set  if  the form of the pattern implies
+     that it can match only at the start of a subject string.
+
+     If the pattern is not anchored and the firstcharptr argument
+     is  not  NULL, it is used to pass back information about the
+     first character of any matched string. 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 firstcharptr. Otherwise, if either
+
+     (a) the pattern was compiled with the PCRE_MULTILINE option,
+     and every branch 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.
+
+
+
+MATCHING A PATTERN
+     The function pcre_exec() is called to match a subject string
+     against  a pre-compiled pattern, which is passed in the code
+     argument. If the pattern has been studied, the result of the
+     study should be passed in the extra argument. Otherwise this
+     must be NULL.
+
+     The PCRE_ANCHORED option can be passed in the options  argu-
+     ment,  whose unused bits must be zero. However, if a pattern
+     was  compiled  with  PCRE_ANCHORED,  or  turned  out  to  be
+     anchored  by  virtue  of  its  contents,  it  cannot be made
+     unachored at matching time.
+
+     There are also three further options that can be set only at
+     matching time:
+
+       PCRE_NOTBOL
+
+     The first character of the string is not the beginning of  a
+     line,  so  the  circumflex  metacharacter  should  not match
+     before it. Setting this without PCRE_MULTILINE  (at  compile
+     time) causes circumflex never to match.
+
+       PCRE_NOTEOL
+
+     The end of the string is not the end of a line, so the  dol-
+     lar  metacharacter should not match it nor (except in multi-
+     line mode) a newline immediately  before  it.  Setting  this
+     without PCRE_MULTILINE (at compile time) causes dollar never
+     to match.
+
+       PCRE_NOTEMPTY
+
+     An empty string is not considered to be  a  valid  match  if
+     this  option  is  set. If there are alternatives in the pat-
+     tern, they are tried. If  all  the  alternatives  match  the
+     empty  string,  the  entire match fails. For example, if the
+     pattern
+
+       a?b?
+
+     is applied to a string not beginning with  "a"  or  "b",  it
+     matches  the  empty string at the start of the subject. With
+     PCRE_NOTEMPTY set, this match is not valid, so PCRE searches
+     further into the string for occurrences of "a" or "b".  Perl
+     has no direct equivalent of this  option,  but  it  makes  a
+     special  case  of a pattern match of the empty string within
+     its split() function, or when using the /g  modifier.  Using
+     PCRE_NOTEMPTY it is possible to emulate this behaviour.
+
+     The subject string is passed as  a  pointer  in  subject,  a
+     length  in  length,  and  a  starting offset in startoffset.
+     Unlike the pattern string, it may contain binary zero  char-
+     acters.  When  the starting offset is zero, the search for a
+     match starts at the beginning of the subject, and this is by
+     far the most common case.
+
+     A non-zero starting offset  is  useful  when  searching  for
+     another  match  in  the  same subject by calling pcre_exec()
+     again after a previous success.  Setting startoffset differs
+     from  just  passing  over  a  shortened  string  and setting
+     PCRE_NOTBOL in the case of a pattern that  begins  with  any
+     kind of lookbehind. For example, consider the pattern
+
+       \Biss\B
+
+     which finds occurrences of "iss" in the middle of words. (\B
+     matches only if the current position in the subject is not a
+     word boundary.) When applied to the string "Mississipi"  the
+     first  call  to  pcre_exec()  finds the first occurrence. If
+     pcre_exec() is called again with just the remainder  of  the
+     subject,  namely  "issipi", it does not match, because \B is
+     always false at the start of the subject, which is deemed to
+     be  a  word  boundary. However, if pcre_exec() is passed the
+     entire string again, but with startoffset set to 4, it finds
+     the  second  occurrence  of "iss" because it is able to look
+     behind the starting point to discover that it is preceded by
+     a letter.
+
+     If a non-zero starting offset is passed when the pattern  is
+     anchored, one attempt to match at the given offset is tried.
+     This can only succeed if the pattern does  not  require  the
+     match to be at the start of the subject.
+
+     In general, a pattern matches a certain portion of the  sub-
+     ject,  and  in addition, further substrings from the subject
+     may be picked out by parts of  the  pattern.  Following  the
+     usage  in  Jeffrey Friedl's book, this is called "capturing"
+     in what follows, and the phrase  "capturing  subpattern"  is
+     used for a fragment of a pattern that picks out a substring.
+     PCRE supports several other kinds of  parenthesized  subpat-
+     tern that do not cause substrings to be captured.
+
+     Captured substrings are returned to the caller via a  vector
+     of  integer  offsets whose address is passed in ovector. The
+     number of elements in the vector is passed in ovecsize.  The
+     first two-thirds of the vector is used to pass back captured
+     substrings, each substring using a  pair  of  integers.  The
+     remaining  third  of  the  vector  is  used  as workspace by
+     pcre_exec() while matching capturing subpatterns, and is not
+     available for passing back information. The length passed in
+     ovecsize should always be a multiple of three. If it is not,
+     it is rounded down.
+
+     When a match has been successful, information about captured
+     substrings is returned in pairs of integers, starting at the
+     beginning of ovector, and continuing up to two-thirds of its
+     length  at  the  most. The first element of a pair is set to
+     the offset of the first character in a  substring,  and  the
+     second is set to the offset of the first character after the
+     end of a substring. The first  pair,  ovector[0]  and  ovec-
+     tor[1],  identify  the portion of the subject string matched
+     by the entire pattern. The next pair is used for  the  first
+     capturing  subpattern,  and  so  on.  The  value returned by
+     pcre_exec() is the number of pairs that have  been  set.  If
+     there  are no capturing subpatterns, the return value from a
+     successful match is 1, indicating that just the  first  pair
+     of offsets has been set.
+
+     Some convenience functions are provided for  extracting  the
+     captured substrings as separate strings. These are described
+     in the following section.
+
+     It is possible for an capturing  subpattern  number  n+1  to
+     match  some  part  of  the subject when subpattern n has not
+     been used at all.  For  example,  if  the  string  "abc"  is
+     matched  against the pattern (a|(z))(bc) subpatterns 1 and 3
+     are matched, but 2 is not. When this  happens,  both  offset
+     values corresponding to the unused subpattern are set to -1.
+
+     If a capturing subpattern is matched repeatedly, it  is  the
+     last  portion  of  the  string  that  it  matched  that gets
+     returned.
+
+     If the vector is too small to hold  all  the  captured  sub-
+     strings,  it is used as far as possible (up to two-thirds of
+     its length), and the function returns a value  of  zero.  In
+     particular,  if  the  substring offsets are not of interest,
+     pcre_exec() may be called with ovector passed  as  NULL  and
+     ovecsize  as  zero.  However,  if  the pattern contains back
+     references and the ovector isn't big enough to remember  the
+     related  substrings,  PCRE  has to get additional memory for
+     use during matching. Thus it is usually advisable to  supply
+     an ovector.
+
+     Note that pcre_info() can be used to find out how many  cap-
+     turing  subpatterns  there  are  in  a compiled pattern. The
+     smallest size for ovector that will  allow  for  n  captured
+     substrings  in  addition  to  the  offsets  of the substring
+     matched by the whole pattern is (n+1)*3.
+     If pcre_exec() fails, it returns a negative number. The fol-
+     lowing are defined in the header file:
+
+       PCRE_ERROR_NOMATCH        (-1)
+
+     The subject string did not match the pattern.
+
+       PCRE_ERROR_NULL           (-2)
+
+     Either code or subject was passed as NULL,  or  ovector  was
+     NULL and ovecsize was not zero.
+
+       PCRE_ERROR_BADOPTION      (-3)
+
+     An unrecognized bit was set in the options argument.
+
+       PCRE_ERROR_BADMAGIC       (-4)
+
+     PCRE stores a 4-byte "magic number" at the start of the com-
+     piled  code,  to  catch  the  case  when it is passed a junk
+     pointer. This is the error it gives when  the  magic  number
+     isn't present.
+
+       PCRE_ERROR_UNKNOWN_NODE   (-5)
+
+     While running the pattern match, an unknown item was encoun-
+     tered in the compiled pattern. This error could be caused by
+     a bug in PCRE or by overwriting of the compiled pattern.
+
+       PCRE_ERROR_NOMEMORY       (-6)
+
+     If a pattern contains back references, but the ovector  that
+     is  passed  to pcre_exec() is not big enough to remember the
+     referenced substrings, PCRE gets a block of  memory  at  the
+     start  of  matching to use for this purpose. If the call via
+     pcre_malloc() fails, this error  is  given.  The  memory  is
+     freed at the end of matching.
+
+
+
+EXTRACTING CAPTURED SUBSTRINGS
+     Captured substrings can be accessed directly  by  using  the
+     offsets returned by pcre_exec() in ovector. For convenience,
+     the functions  pcre_copy_substring(),  pcre_get_substring(),
+     and  pcre_get_substring_list()  are  provided for extracting
+     captured  substrings  as  new,   separate,   zero-terminated
+     strings.   A  substring  that  contains  a  binary  zero  is
+     correctly extracted and has a further zero added on the end,
+     but the result does not, of course, function as a C string.
+
+     The first three arguments are the same for all  three  func-
+     tions:  subject  is  the  subject string which has just been
+     successfully matched, ovector is a pointer to the vector  of
+     integer   offsets   that  was  passed  to  pcre_exec(),  and
+     stringcount is the number of substrings that  were  captured
+     by  the  match,  including  the  substring  that matched the
+     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.
+
+     The functions pcre_copy_substring() and pcre_get_substring()
+     extract a single substring, whose number is given as string-
+     number. A value of zero extracts the substring that  matched
+     the entire pattern, while higher values extract the captured
+     substrings. For pcre_copy_substring(), the string is  placed
+     in  buffer,  whose  length is given by buffersize, while for
+     pcre_get_substring() a new block of store  is  obtained  via
+     pcre_malloc,  and its address is returned via stringptr. The
+     yield of the function is  the  length  of  the  string,  not
+     including the terminating zero, or one of
+
+       PCRE_ERROR_NOMEMORY       (-6)
+
+     The buffer was too small for pcre_copy_substring(),  or  the
+     attempt to get memory failed for pcre_get_substring().
+
+       PCRE_ERROR_NOSUBSTRING    (-7)
+
+     There is no substring whose number is stringnumber.
+
+     The pcre_get_substring_list() function extracts  all  avail-
+     able  substrings  and builds a list of pointers to them. All
+     this is done in a single block of memory which  is  obtained
+     via pcre_malloc. The address of the memory block is returned
+     via listptr, which is also the start of the list  of  string
+     pointers.  The  end of the list is marked by a NULL pointer.
+     The yield of the function is zero if all went well, or
+
+       PCRE_ERROR_NOMEMORY       (-6)
+
+     if the attempt to get the memory block failed.
+
+     When any of these functions encounter a  substring  that  is
+     unset, which can happen when capturing subpattern number n+1
+     matches some part of the subject, but subpattern n  has  not
+     been  used  at all, they return an empty string. This can be
+     distinguished  from  a  genuine  zero-length  substring   by
+     inspecting the appropriate offset in ovector, which is nega-
+     tive for unset substrings.
+
+
+
+LIMITATIONS
+     There are some size limitations in PCRE but it is hoped that
+     they will never in practice be relevant.  The maximum length
+     of a compiled pattern is 65539 (sic) bytes.  All  values  in
+     repeating  quantifiers must be less than 65536.  The maximum
+     number of capturing subpatterns is 99.  The  maximum  number
+     of  all  parenthesized subpatterns, including capturing sub-
+     patterns, assertions, and other types of subpattern, is 200.
+
+     The maximum length of a subject string is the largest  posi-
+     tive number that an integer variable can hold. However, PCRE
+     uses recursion to handle subpatterns and indefinite  repeti-
+     tion.  This  means  that the available stack space may limit
+     the size of a subject string that can be processed  by  cer-
+     tain patterns.
+
+
+
+DIFFERENCES FROM PERL
+     The differences described here  are  with  respect  to  Perl
+     5.005.
+
+     1. By default, a whitespace character is any character  that
+     the  C  library  function isspace() recognizes, though it is
+     possible to compile PCRE  with  alternative  character  type
+     tables. Normally isspace() matches space, formfeed, newline,
+     carriage return, horizontal tab, and vertical tab. Perl 5 no
+     longer  includes vertical tab in its set of whitespace char-
+     acters. The \v escape that was in the Perl documentation for
+     a long time was never in fact recognized. However, the char-
+     acter itself was treated as whitespace at least up to 5.002.
+     In 5.004 and 5.005 it does not match \s.
+
+     2. PCRE does  not  allow  repeat  quantifiers  on  lookahead
+     assertions. Perl permits them, but they do not mean what you
+     might think. For example, (?!a){3} does not assert that  the
+     next  three characters are not "a". It just asserts that the
+     next character is not "a" three times.
+
+     3. Capturing subpatterns that occur inside  negative  looka-
+     head  assertions  are  counted,  but  their  entries  in the
+     offsets vector are never set. Perl sets its numerical  vari-
+     ables  from  any  such  patterns that are matched before the
+     assertion fails to match something (thereby succeeding), but
+     only  if  the negative lookahead assertion contains just one
+     branch.
+
+     4. Though binary zero characters are supported in  the  sub-
+     ject  string,  they  are  not  allowed  in  a pattern string
+     because it is passed as a normal  C  string,  terminated  by
+     zero. The escape sequence "\0" can be used in the pattern to
+     represent a binary zero.
+     5. The following Perl escape sequences  are  not  supported:
+     \l,  \u,  \L,  \U,  \E, \Q. In fact these are implemented by
+     Perl's general string-handling and are not part of its  pat-
+     tern matching engine.
+
+     6. The Perl \G assertion is  not  supported  as  it  is  not
+     relevant to single pattern matches.
+
+     7. Fairly obviously, PCRE does  not  support  the  (?{code})
+     construction.
+
+     8. There are at the time of writing some  oddities  in  Perl
+     5.005_02  concerned  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.
+
+     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 follow.
+
+     9. Another as yet unresolved discrepancy  is  that  in  Perl
+     5.005_02  the  pattern /^(a)?(?(1)a|b)+$/ matches the string
+     "a", whereas in PCRE it does not.  However, in both Perl and
+     PCRE /^(a)?a/ matched against "a" leaves $1 unset.
+
+     10. PCRE  provides  some  extensions  to  the  Perl  regular
+     expression facilities:
+
+     (a) Although lookbehind assertions must match  fixed  length
+     strings,  each  alternative branch of a lookbehind assertion
+     can match a different length of string. Perl 5.005  requires
+     them all to have the same length.
+
+     (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is  not
+     set,  the  $ meta- character matches only at the very end of
+     the string.
+
+     (c) If PCRE_EXTRA is set, a backslash followed by  a  letter
+     with no special meaning is faulted.
+
+     (d) If PCRE_UNGREEDY is set, the greediness of  the  repeti-
+     tion  quantifiers  is inverted, that is, by default they are
+     not greedy, but if followed by a question mark they are.
+
+     (e) PCRE_ANCHORED can be used to force a pattern to be tried
+     only at the start of the subject.
+
+     (f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY  options
+     for pcre_exec() have no Perl equivalents.
+
+
+
+REGULAR EXPRESSION DETAILS
+     The syntax and semantics of  the  regular  expressions  sup-
+     ported  by PCRE are described below. Regular expressions are
+     also described in the Perl documentation and in a number  of
+     other  books,  some  of which have copious examples. Jeffrey
+     Friedl's  "Mastering  Regular  Expressions",  published   by
+     O'Reilly  (ISBN 1-56592-257-3), covers them in great detail.
+     The description here is intended as reference documentation.
+
+     A regular expression is a pattern that is matched against  a
+     subject string from left to right. Most characters stand for
+     themselves in a pattern, and match the corresponding charac-
+     ters in the subject. As a trivial example, the pattern
+
+       The quick brown fox
+
+     matches a portion of a subject string that is  identical  to
+     itself.  The  power  of  regular  expressions comes from the
+     ability to include alternatives and repetitions in the  pat-
+     tern.  These  are encoded in the pattern by the use of meta-
+     characters, which do not stand for  themselves  but  instead
+     are interpreted in some special way.
+
+     There are two different sets of meta-characters: those  that
+     are  recognized anywhere in the pattern except within square
+     brackets, and those that are recognized in square  brackets.
+     Outside square brackets, the meta-characters are as follows:
+
+       \      general escape character with several uses
+       ^      assert start of  subject  (or  line,  in  multiline
+     mode)
+       $      assert end of subject (or line, in multiline mode)
+       .      match any character except newline (by default)
+       [      start character class definition
+       |      start of alternative branch
+       (      start subpattern
+       )      end subpattern
+       ?      extends the meaning of (
+              also 0 or 1 quantifier
+              also quantifier minimizer
+       *      0 or more quantifier
+       +      1 or more quantifier
+       {      start min/max quantifier
+
+     Part of a pattern that is in square  brackets  is  called  a
+     "character  class".  In  a  character  class  the only meta-
+     characters are:
+
+       \      general escape character
+       ^      negate the class, but only if the first character
+       -      indicates character range
+       ]      terminates the character class
+
+     The following sections describe  the  use  of  each  of  the
+     meta-characters.
+
+
+
+BACKSLASH
+     The backslash character has several uses. Firstly, if it  is
+     followed  by  a  non-alphameric character, it takes away any
+     special  meaning  that  character  may  have.  This  use  of
+     backslash  as  an  escape  character applies both inside and
+     outside character classes.
+
+     For example, if you want to match a "*" character, you write
+     "\*" in the pattern. This applies whether or not the follow-
+     ing character would otherwise  be  interpreted  as  a  meta-
+     character,  so it is always safe to precede a non-alphameric
+     with "\" to specify that it stands for itself.  In  particu-
+     lar, if you want to match a backslash, you write "\\".
+
+     If a pattern is compiled with the PCRE_EXTENDED option, whi-
+     tespace in the pattern (other than in a character class) and
+     characters between a "#" outside a character class  and  the
+     next  newline  character  are ignored. An escaping backslash
+     can be used to include a whitespace or "#" character as part
+     of the pattern.
+
+     A second use of backslash provides a way  of  encoding  non-
+     printing  characters  in patterns in a visible manner. There
+     is no restriction on the appearance of non-printing  charac-
+     ters,  apart from the binary zero that terminates a pattern,
+     but when a pattern is being prepared by text editing, it  is
+     usually  easier to use one of the following escape sequences
+     than the binary character it represents:
+
+       \a     alarm, that is, the BEL character (hex 07)
+       \cx    "control-x", where x is any character
+       \e     escape (hex 1B)
+       \f     formfeed (hex 0C)
+       \n     newline (hex 0A)
+       \r     carriage return (hex 0D)
+       \t     tab (hex 09)
+       \xhh   character with hex code hh
+       \ddd   character with octal code ddd, or backreference
+
+     The precise effect of "\cx" is as follows: if "x" is a lower
+     case  letter,  it  is converted to upper case. Then bit 6 of
+     the character (hex 40) is inverted.  Thus "\cz" becomes  hex
+     1A, but "\c{" becomes hex 3B, while "\c;" becomes hex 7B.
+
+     After "\x", up to two hexadecimal digits are  read  (letters
+     can be in upper or lower case).
+
+     After "\0" up to two further octal digits are read. In  both
+     cases,  if  there are fewer than two digits, just those that
+     are present are used. Thus the sequence "\0\x\07"  specifies
+     two binary zeros followed by a BEL character.  Make sure you
+     supply two digits after the initial zero  if  the  character
+     that follows is itself an octal digit.
+
+     The handling of a backslash followed by a digit other than 0
+     is  complicated.   Outside  a character class, PCRE reads it
+     and any following digits as a decimal number. If the  number
+     is  less  than  10, or if there have been at least that many
+     previous capturing left parentheses in the  expression,  the
+     entire  sequence is taken as a back reference. A description
+     of how this works is given later, following  the  discussion
+     of parenthesized subpatterns.
+
+     Inside a character  class,  or  if  the  decimal  number  is
+     greater  than  9 and there have not been that many capturing
+     subpatterns, PCRE re-reads up to three octal digits  follow-
+     ing  the  backslash,  and  generates  a single byte from the
+     least significant 8 bits of the value. Any subsequent digits
+     stand for themselves.  For example:
+
+       \040   is another way of writing a space
+       \40    is the same, provided there are fewer than 40
+                 previous capturing subpatterns
+       \7     is always a back reference
+       \11    might be a back reference, or another way of
+                 writing a tab
+       \011   is always a tab
+       \0113  is a tab followed by the character "3"
+       \113   is the character with octal code 113 (since there
+                 can be no more than 99 back references)
+       \377   is a byte consisting entirely of 1 bits
+       \81    is either a back reference, or a binary zero
+                 followed by the two characters "8" and "1"
+
+     Note that octal values of 100 or greater must not be  intro-
+     duced  by  a  leading zero, because no more than three octal
+     digits are ever read.
+
+     All the sequences that define a single  byte  value  can  be
+     used both inside and outside character classes. In addition,
+     inside a character class, the sequence "\b"  is  interpreted
+     as  the  backspace  character  (hex 08). Outside a character
+     class it has a different meaning (see below).
+
+     The third use of backslash is for specifying generic charac-
+     ter types:
+
+       \d     any decimal digit
+       \D     any character that is not a decimal digit
+       any whitespace character
+       \S     any character that is not a whitespace character
+       \w     any "word" character
+       \W     any "non-word" character
+
+     Each pair of escape sequences partitions the complete set of
+     characters  into  two  disjoint  sets.  Any  given character
+     matches one, and only one, of each pair.
+
+     A "word" character is any letter or digit or the  underscore
+     character,  that  is,  any  character which can be part of a
+     Perl "word". The definition of letters and  digits  is  con-
+     trolled  by PCRE's character tables, and may vary if locale-
+     specific matching is  taking  place  (see  "Locale  support"
+     above). For example, in the "fr" (French) locale, some char-
+     acter codes greater than 128 are used for accented  letters,
+     and these are matched by \w.
+
+     These character type sequences can appear  both  inside  and
+     outside  character classes. They each match one character of
+     the appropriate type. If the current matching  point  is  at
+     the end of the subject string, all of them fail, since there
+     is no character to match.
+
+     The fourth use of backslash is  for  certain  simple  asser-
+     tions. An assertion specifies a condition that has to be met
+     at a particular point in  a  match,  without  consuming  any
+     characters  from  the subject string. The use of subpatterns
+     for more complicated  assertions  is  described  below.  The
+     backslashed assertions are
+
+       \b     word boundary
+       \B     not a word boundary
+       \A     start of subject (independent of multiline mode)
+       \Z     end of subject or newline at  end  (independent  of
+     multiline mode)
+       \z     end of subject (independent of multiline mode)
+
+     These assertions may not appear in  character  classes  (but
+     note that "\b" has a different meaning, namely the backspace
+     character, inside a character class).
+
+     A word boundary is a position in the  subject  string  where
+     the current character and the previous character do not both
+     match \w or \W (i.e. one matches \w and  the  other  matches
+     \W),  or the start or end of the string if the first or last
+     character matches \w, respectively.
+
+     The \A, \Z, and \z assertions differ  from  the  traditional
+     circumflex  and  dollar  (described below) in that they only
+     ever match at the very start and end of the subject  string,
+     whatever  options  are  set.  They  are  not affected by the
+     PCRE_NOTBOL or PCRE_NOTEOL options. If the startoffset argu-
+     ment  of  pcre_exec()  is  non-zero, \A can never match. The
+     difference between \Z and \z is that  \Z  matches  before  a
+     newline  that is the last character of the string as well as
+     at the end of the string, whereas \z  matches  only  at  the
+     end.
+
+
+
+CIRCUMFLEX AND DOLLAR
+     Outside a character class, in the default matching mode, the
+     circumflex  character  is an assertion which is true only if
+     the current matching point is at the start  of  the  subject
+     string.  If  the startoffset argument of pcre_exec() is non-
+     zero, circumflex can never match. Inside a character  class,
+     circumflex has an entirely different meaning (see below).
+
+     Circumflex need not be the first character of the pattern if
+     a  number of alternatives are involved, but it should be the
+     first thing in each alternative in which it appears  if  the
+     pattern is ever to match that branch. If all possible alter-
+     natives start with a circumflex, that is, if the pattern  is
+     constrained to match only at the start of the subject, it is
+     said to be an "anchored" pattern. (There are also other con-
+     structs that can cause a pattern to be anchored.)
+
+     A dollar character is an assertion which is true only if the
+     current  matching point is at the end of the subject string,
+     or immediately before a newline character that is  the  last
+     character in the string (by default). Dollar need not be the
+     last character of the pattern if a  number  of  alternatives
+     are  involved,  but it should be the last item in any branch
+     in which it appears.  Dollar has no  special  meaning  in  a
+     character class.
+
+     The meaning of dollar can be changed so that it matches only
+     at   the   very   end   of   the   string,  by  setting  the
+     PCRE_DOLLAR_ENDONLY option at compile or matching time. This
+     does not affect the \Z assertion.
+
+     The meanings of the circumflex  and  dollar  characters  are
+     changed  if  the  PCRE_MULTILINE option is set. When this is
+     the case,  they  match  immediately  after  and  immediately
+     before an internal "\n" character, respectively, in addition
+     to matching at the start and end of the subject string.  For
+     example,  the  pattern  /^abc$/  matches  the subject string
+     "def\nabc" in multiline  mode,  but  not  otherwise.  Conse-
+     quently,  patterns  that  are  anchored  in single line mode
+     because all branches start with "^" are not anchored in mul-
+     tiline mode, and a match for circumflex is possible when the
+     startoffset  argument  of  pcre_exec()  is   non-zero.   The
+     PCRE_DOLLAR_ENDONLY  option  is ignored if PCRE_MULTILINE is
+     set.
+
+     Note that the sequences \A, \Z, and \z can be used to  match
+     the  start  and end of the subject in both modes, and if all
+     branches of a pattern start with \A is it  always  anchored,
+     whether PCRE_MULTILINE is set or not.
+
+
+
+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.
+
+
+
+SQUARE BRACKETS
+     An opening square bracket introduces a character class, ter-
+     minated  by  a  closing  square  bracket.  A  closing square
+     bracket on its own is  not  special.  If  a  closing  square
+     bracket  is  required as a member of the class, it should be
+     the first data character in the class (after an initial cir-
+     cumflex, if present) or escaped with a backslash.
+
+     A character class matches a single character in the subject;
+     the  character  must  be in the set of characters defined by
+     the class, unless the first character in the class is a cir-
+     cumflex,  in which case the subject character must not be in
+     the set defined by the class. If a  circumflex  is  actually
+     required  as  a  member  of  the class, ensure it is not the
+     first character, or escape it with a backslash.
+
+     For example, the character class [aeiou] matches  any  lower
+     case vowel, while [^aeiou] matches any character that is not
+     a lower case vowel. Note that a circumflex is  just  a  con-
+     venient  notation for specifying the characters which are in
+     the class by enumerating those that are not. It  is  not  an
+     assertion:  it  still  consumes a character from the subject
+     string, and fails if the current pointer is at  the  end  of
+     the string.
+
+     When caseless matching  is  set,  any  letters  in  a  class
+     represent  both their upper case and lower case versions, so
+     for example, a caseless [aeiou] matches "A" as well as  "a",
+     and  a caseless [^aeiou] does not match "A", whereas a case-
+     ful version would.
+
+     The newline character is never treated in any special way in
+     character  classes,  whatever the setting of the PCRE_DOTALL
+     or PCRE_MULTILINE options is. A  class  such  as  [^a]  will
+     always match a newline.
+
+     The minus (hyphen) character can be used to specify a  range
+     of  characters  in  a  character  class.  For example, [d-m]
+     matches any letter between d and m, inclusive.  If  a  minus
+     character  is required in a class, it must be escaped with a
+     backslash or appear in a position where it cannot be  inter-
+     preted as indicating a range, typically as the first or last
+     character in the class.
+
+     It is not possible to have the literal character "]" as  the
+     end  character  of  a  range.  A  pattern such as [W-]46] is
+     interpreted as a class of two characters ("W" and "-")  fol-
+     lowed by a literal string "46]", so it would match "W46]" or
+     "-46]". However, if the "]" is escaped with a  backslash  it
+     is  interpreted  as  the end of range, so [W-\]46] is inter-
+     preted as a single class containing a range followed by  two
+     separate characters. The octal or hexadecimal representation
+     of "]" can also be used to end a range.
+
+     Ranges operate in ASCII collating sequence. They can also be
+     used  for  characters  specified  numerically,  for  example
+     [\000-\037]. If a range that includes letters is  used  when
+     caseless  matching  is set, it matches the letters in either
+     case. For example, [W-c] is equivalent  to  [][\^_`wxyzabc],
+     matched  caselessly,  and  if  character tables for the "fr"
+     locale are in use, [\xc8-\xcb] matches accented E characters
+     in both cases.
+
+     The character types \d, \D, \s, \S,  \w,  and  \W  may  also
+     appear  in  a  character  class, and add the characters that
+     they match to the class. For example, [\dABCDEF] matches any
+     hexadecimal  digit.  A  circumflex  can conveniently be used
+     with the upper case character types to specify a  more  res-
+     tricted set of characters than the matching lower case type.
+     For example, the class [^\W_] matches any letter  or  digit,
+     but not underscore.
+
+     All non-alphameric characters other than \,  -,  ^  (at  the
+     start)  and  the  terminating ] are non-special in character
+     classes, but it does no harm if they are escaped.
+
+
+
+VERTICAL BAR
+     Vertical bar characters are  used  to  separate  alternative
+     patterns. For example, the pattern
+
+       gilbert|sullivan
+
+     matches either "gilbert" or "sullivan". Any number of alter-
+     natives  may  appear,  and an empty alternative is permitted
+     (matching the empty string).   The  matching  process  tries
+     each  alternative in turn, from left to right, and the first
+     one that succeeds is used. If the alternatives are within  a
+     subpattern  (defined  below),  "succeeds" means matching the
+     rest of the main pattern as well as the alternative  in  the
+     subpattern.
+
+
+
+INTERNAL OPTION SETTING
+     The settings of PCRE_CASELESS, PCRE_MULTILINE,  PCRE_DOTALL,
+     and  PCRE_EXTENDED can be changed from within the pattern by
+     a sequence of Perl option letters enclosed between "(?"  and
+     ")". The option letters are
+
+       i  for PCRE_CASELESS
+       m  for PCRE_MULTILINE
+       s  for PCRE_DOTALL
+       x  for PCRE_EXTENDED
+
+     For example, (?im) sets caseless, multiline matching. It  is
+     also possible to unset these options by preceding the letter
+     with a hyphen, and a combined setting and unsetting such  as
+     (?im-sx),  which sets PCRE_CASELESS and PCRE_MULTILINE while
+     unsetting PCRE_DOTALL and PCRE_EXTENDED, is also  permitted.
+     If  a  letter  appears both before and after the hyphen, the
+     option is unset.
+
+     The scope of these option changes depends on  where  in  the
+     pattern  the  setting  occurs. For settings that are outside
+     any subpattern (defined below), the effect is the same as if
+     the  options were set or unset at the start of matching. The
+     following patterns all behave in exactly the same way:
+
+       (?i)abc
+       a(?i)bc
+       ab(?i)c
+       abc(?i)
+
+     which in turn is the same as compiling the pattern abc  with
+     PCRE_CASELESS  set.   In  other words, such "top level" set-
+     tings apply to the whole pattern  (unless  there  are  other
+     changes  inside subpatterns). If there is more than one set-
+     ting of the same option at top level, the rightmost  setting
+     is used.
+
+     If an option change occurs inside a subpattern,  the  effect
+     is  different.  This is a change of behaviour in Perl 5.005.
+     An option change inside a subpattern affects only that  part
+     of the subpattern that follows it, so
+
+       (a(?i)b)c
+
+     matches  abc  and  aBc  and  no  other   strings   (assuming
+     PCRE_CASELESS  is  not used).  By this means, options can be
+     made to have different settings in different  parts  of  the
+     pattern.  Any  changes  made  in one alternative do carry on
+     into subsequent branches within  the  same  subpattern.  For
+     example,
+
+       (a(?i)b|c)
+
+     matches "ab", "aB", "c", and "C", even though when  matching
+     "C" the first branch is abandoned before the option setting.
+     This is because the effects of  option  settings  happen  at
+     compile  time. There would be some very weird behaviour oth-
+     erwise.
+
+     The PCRE-specific options PCRE_UNGREEDY and  PCRE_EXTRA  can
+     be changed in the same way as the Perl-compatible options by
+     using the characters U and X  respectively.  The  (?X)  flag
+     setting  is  special in that it must always occur earlier in
+     the pattern than any of the additional features it turns on,
+     even when it is at top level. It is best put at the start.
+
+
+
+SUBPATTERNS
+     Subpatterns are delimited by parentheses  (round  brackets),
+     which can be nested.  Marking part of a pattern as a subpat-
+     tern does two things:
+
+     1. It localizes a set of alternatives. For example, the pat-
+     tern
+
+       cat(aract|erpillar|)
+
+     matches one of the words "cat",  "cataract",  or  "caterpil-
+     lar".  Without  the  parentheses, it would match "cataract",
+     "erpillar" or the empty string.
+
+     2. It sets up the subpattern as a capturing  subpattern  (as
+     defined  above).   When the whole pattern matches, that por-
+     tion of the subject string that matched  the  subpattern  is
+     passed  back  to  the  caller  via  the  ovector argument of
+     pcre_exec(). Opening parentheses are counted  from  left  to
+     right (starting from 1) to obtain the numbers of the captur-
+     ing subpatterns.
+
+     For example, if the string "the red king" is matched against
+     the pattern
+
+       the ((red|white) (king|queen))
+
+     the captured substrings are "red king", "red",  and  "king",
+     and are numbered 1, 2, and 3.
+
+     The fact that plain parentheses fulfil two functions is  not
+     always  helpful.  There are often times when a grouping sub-
+     pattern is required without a capturing requirement.  If  an
+     opening parenthesis is followed by "?:", the subpattern does
+     not do any capturing, and is not counted when computing  the
+     number of any subsequent capturing subpatterns. For example,
+     if the string "the white queen" is matched against the  pat-
+     tern
+
+       the ((?:red|white) (king|queen))
+
+     the captured substrings are "white queen" and  "queen",  and
+     are  numbered  1  and 2. The maximum number of captured sub-
+     strings is 99, and the maximum number  of  all  subpatterns,
+     both capturing and non-capturing, is 200.
+
+     As a  convenient  shorthand,  if  any  option  settings  are
+     required  at  the  start  of a non-capturing subpattern, the
+     option letters may appear between the "?" and the ":".  Thus
+     the two patterns
+
+       (?i:saturday|sunday)
+       (?:(?i)saturday|sunday)
+
+     match exactly the same set of strings.  Because  alternative
+     branches  are  tried from left to right, and options are not
+     reset until the end of the subpattern is reached, an  option
+     setting  in  one  branch does affect subsequent branches, so
+     the above patterns match "SUNDAY" as well as "Saturday".
+
+
+
+REPETITION
+     Repetition is specified by quantifiers, which can follow any
+     of the following items:
+
+       a single character, possibly escaped
+       the . metacharacter
+       a character class
+       a back reference (see next section)
+       a parenthesized subpattern (unless it is  an  assertion  -
+     see below)
+
+     The general repetition quantifier specifies  a  minimum  and
+     maximum  number  of  permitted  matches,  by  giving the two
+     numbers in curly brackets (braces), separated  by  a  comma.
+     The  numbers  must be less than 65536, and the first must be
+     less than or equal to the second. For example:
+
+       z{2,4}
+
+     matches "zz", "zzz", or "zzzz". A closing brace on  its  own
+     is not a special character. If the second number is omitted,
+     but the comma is present, there is no upper  limit;  if  the
+     second number and the comma are both omitted, the quantifier
+     specifies an exact number of required matches. Thus
+
+       [aeiou]{3,}
+
+     matches at least 3 successive vowels,  but  may  match  many
+     more, while
+
+       \d{8}
+
+     matches exactly 8 digits.  An  opening  curly  bracket  that
+     appears  in a position where a quantifier is not allowed, or
+     one that does not match the syntax of a quantifier, is taken
+     as  a literal character. For example, {,6} is not a quantif-
+     ier, but a literal string of four characters.
+
+     The quantifier {0} is permitted, causing the  expression  to
+     behave  as  if the previous item and the quantifier were not
+     present.
+
+     For convenience (and  historical  compatibility)  the  three
+     most common quantifiers have single-character abbreviations:
+
+       *    is equivalent to {0,}
+       +    is equivalent to {1,}
+       ?    is equivalent to {0,1}
+
+     It is possible to construct infinite loops  by  following  a
+     subpattern  that  can  match no characters with a quantifier
+     that has no upper limit, for example:
+
+       (a?)*
+
+     Earlier versions of Perl and PCRE used to give an  error  at
+     compile  time  for such patterns. However, because there are
+     cases where this  can  be  useful,  such  patterns  are  now
+     accepted,  but  if  any repetition of the subpattern does in
+     fact match no characters, the loop is forcibly broken.
+
+     By default, the quantifiers  are  "greedy",  that  is,  they
+     match  as much as possible (up to the maximum number of per-
+     mitted times), without causing the rest of  the  pattern  to
+     fail. The classic example of where this gives problems is in
+     trying to match comments in C programs. These appear between
+     the  sequences /* and */ and within the sequence, individual
+     * and / characters may appear. An attempt to  match  C  com-
+     ments by applying the pattern
+
+       /\*.*\*/
+
+     to the string
+
+       /* first command */  not comment  /* second comment */
+
+     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
+
+       /\*.*?\*/
+
+     does the right thing with the C comments. The meaning of the
+     various  quantifiers is not otherwise changed, just the pre-
+     ferred number of matches.  Do not confuse this use of  ques-
+     tion  mark  with  its  use as a quantifier in its own right.
+     Because it has two uses, it can sometimes appear doubled, as
+     in
+
+       \d??\d
+
+     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 greedy by following
+     them  with  a  question mark. In other words, it inverts the
+     default behaviour.
+
+     When a parenthesized subpattern is quantified with a minimum
+     repeat  count  that is greater than 1 or with a limited max-
+     imum, 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 charac-
+     ter 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 string contains
+     no newlines, it is worth setting PCRE_DOTALL when  the  pat-
+     tern begins with .* in order to obtain this optimization, or
+     alternatively using ^ to indicate anchoring explicitly.
+
+     When a capturing subpattern is repeated, the value  captured
+     is  the  substring  that  matched  the  final iteration. For
+     example, after
+
+       (tweedle[dume]{3}\s*)+
+
+     has matched "tweedledum tweedledee" the value  of  the  cap-
+     tured  substring  is  "tweedledee".  However,  if  there are
+     nested capturing  subpatterns,  the  corresponding  captured
+     values  may  have been set in previous iterations. For exam-
+     ple, after
+
+       /(a|(b))+/
+
+     matches "aba" the value of the second captured substring  is
+     "b".
+
+
+
+BACK REFERENCES
+     Outside a character class, a backslash followed by  a  digit
+     greater  than  0  (and  possibly  further  digits) is a back
+     reference to a capturing subpattern  earlier  (i.e.  to  its
+     left)  in  the  pattern,  provided there have been that many
+     previous capturing left parentheses.
+
+     However, if the decimal number following  the  backslash  is
+     less  than  10,  it is always taken as a back reference, and
+     causes an error only if there are not  that  many  capturing
+     left  parentheses in the entire pattern. In other words, the
+     parentheses that are referenced need not be to the  left  of
+     the  reference  for  numbers  less  than 10. See the section
+     entitled "Backslash" above for further details of  the  han-
+     dling of digits following a backslash.
+
+     A back reference matches whatever actually matched the  cap-
+     turing subpattern in the current subject string, rather than
+     anything matching the subpattern itself. So the pattern
+
+       (sens|respons)e and \1ibility
+
+     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,
+
+       ((?i)rah)\s+\1
+
+     matches "rah rah" and "RAH RAH", but  not  "RAH  rah",  even
+     though  the  original  capturing subpattern is matched case-
+     lessly.
+
+     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
+
+       (a|(bc))\2
+
+     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.
+
+     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.  However, such references  can
+     be useful inside repeated subpatterns. For example, the pat-
+     tern
+
+       (a|b\1)+
+
+     matches any number of "a"s and also "aba", "ababaa" etc.  At
+     each iteration of the subpattern, the back reference matches
+     the character string corresponding to  the  previous  itera-
+     tion.  In  order  for this to work, the pattern must be such
+     that the first iteration does not need  to  match  the  back
+     reference.  This  can  be  done using alternation, as in the
+     example above, or by a quantifier with a minimum of zero.
+
+
+
+ASSERTIONS
+     An assertion is  a  test  on  the  characters  following  or
+     preceding  the current matching point that does not actually
+     consume any characters. The simple assertions coded  as  \b,
+     \B,  \A,  \Z,  \z, ^ and $ are described above. More compli-
+     cated assertions are coded as  subpatterns.  There  are  two
+     kinds:  those that look ahead of the current position in the
+     subject string, and those that look behind it.
+
+     An assertion subpattern is matched in the normal way, except
+     that  it  does not cause the current matching position to be
+     changed. Lookahead assertions start with  (?=  for  positive
+     assertions and (?! for negative assertions. For example,
+
+       \w+(?=;)
+
+     matches a word followed by a semicolon, but does not include
+     the semicolon in the match, and
+
+       foo(?!bar)
+
+     matches any occurrence of "foo"  that  is  not  followed  by
+     "bar". Note that the apparently similar pattern
+
+       (?!foo)bar
+
+     does not find an occurrence of "bar"  that  is  preceded  by
+     something other than "foo"; it finds any occurrence of "bar"
+     whatsoever, because the assertion  (?!foo)  is  always  true
+     when  the  next  three  characters  are  "bar". A lookbehind
+     assertion is needed to achieve this effect.
+
+     Lookbehind assertions start with (?<=  for  positive  asser-
+     tions and (?<! for negative assertions. For example,
+
+       (?<!foo)bar
+
+     does find an occurrence of "bar" that  is  not  preceded  by
+     "foo". The contents of a lookbehind assertion are restricted
+     such that all the strings  it  matches  must  have  a  fixed
+     length.  However, if there are several alternatives, they do
+     not all have to have the same fixed length. Thus
+
+       (?<=bullock|donkey)
+
+     is permitted, but
+
+       (?<!dogs?|cats?)
+
+     causes an error at compile time. Branches  that  match  dif-
+     ferent length strings are permitted only at the top level of
+     a lookbehind assertion. This is an extension  compared  with
+     Perl  5.005,  which  requires all branches to match the same
+     length of string. An assertion such as
+
+       (?<=ab(c|de))
+
+     is not permitted, because its single  top-level  branch  can
+     match two different lengths, but it is acceptable if rewrit-
+     ten to use two top-level branches:
+
+       (?<=abc|abde)
+
+     The implementation of lookbehind  assertions  is,  for  each
+     alternative,  to  temporarily move the current position back
+     by the fixed width and then  try  to  match.  If  there  are
+     insufficient  characters  before  the  current position, the
+     match is deemed to fail.  Lookbehinds  in  conjunction  with
+     once-only  subpatterns can be particularly useful for match-
+     ing at the ends of strings; an example is given at  the  end
+     of the section on once-only subpatterns.
+
+     Several assertions (of any sort) may  occur  in  succession.
+     For example,
+
+       (?<=\d{3})(?<!999)foo
+
+     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".   This  pattern  does not 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
+
+       (?<=\d{3}...)(?<!999)foo
+
+     This time the first assertion looks  at  the  preceding  six
+     characters,  checking  that  the first three are digits, and
+     then the second assertion checks that  the  preceding  three
+     characters are not "999".
+
+     Assertions can be nested in any combination. For example,
+
+       (?<=(?<!foo)bar)baz
+
+     matches an occurrence of "baz" that  is  preceded  by  "bar"
+     which in turn is not preceded by "foo", while
+
+       (?<=\d{3}(?!999)...)foo
+
+     is another pattern which matches  "foo"  preceded  by  three
+     digits and any three characters that are not "999".
+
+     Assertion subpatterns are not capturing subpatterns, and may
+     not  be  repeated,  because  it makes no sense to assert the
+     same thing several times. If any kind of assertion  contains
+     capturing  subpatterns  within it, these are counted for the
+     purposes of numbering the capturing subpatterns in the whole
+     pattern.   However,  substring capturing is carried out only
+     for positive assertions, because it does not make sense  for
+     negative assertions.
+
+     Assertions count towards the maximum  of  200  parenthesized
+     subpatterns.
+
+
+
+ONCE-ONLY SUBPATTERNS
+     With both maximizing and minimizing repetition,  failure  of
+     what  follows  normally  causes  the repeated item to be re-
+     evaluated to see if a different number of repeats allows the
+     rest  of  the  pattern  to  match. Sometimes it is useful to
+     prevent this, either to change the nature of the  match,  or
+     to  cause  it fail earlier than it otherwise might, when the
+     author of the pattern knows there is no  point  in  carrying
+     on.
+
+     Consider, for example, the pattern \d+foo  when  applied  to
+     the subject line
+
+       123456bar
+
+     After matching all 6 digits and then failing to match "foo",
+     the normal action of the matcher is to try again with only 5
+     digits matching the \d+ item, and then with 4,  and  so  on,
+     before ultimately failing. Once-only subpatterns provide the
+     means for specifying that once a portion of the pattern  has
+     matched,  it  is  not to be re-evaluated in this way, so the
+     matcher would give up immediately on failing to match  "foo"
+     the  first  time.  The  notation  is another kind of special
+     parenthesis, starting with (?> as in this example:
+
+       (?>\d+)bar
+
+     This kind of parenthesis "locks up" the  part of the pattern
+     it  contains once it has matched, and a failure further into
+     the pattern is prevented from backtracking  into  it.  Back-
+     tracking  past  it to previous items, however, works as nor-
+     mal.
+
+     An alternative description is that a subpattern of this type
+     matches  the  string  of  characters that an identical stan-
+     dalone pattern would match, if anchored at the current point
+     in the subject string.
+
+     Once-only subpatterns are not capturing subpatterns.  Simple
+     cases  such as the above example can be thought of as a max-
+     imizing repeat that must  swallow  everything  it  can.  So,
+     while both \d+ and \d+? are prepared to adjust the number of
+     digits they match in order to make the rest of  the  pattern
+     match, (?>\d+) can only match an entire sequence of digits.
+
+     This construction can of course contain arbitrarily  compli-
+     cated subpatterns, and it can be nested.
+
+     Once-only subpatterns can be used in conjunction with  look-
+     behind  assertions  to specify efficient matching at the end
+     of the subject string. Consider a simple pattern such as
+
+       abcd$
+
+     when applied to a long  string  which  does  not  match  it.
+     Because matching proceeds from left to right, PCRE will look
+     for each "a" in the subject and then  see  if  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,  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 pat-
+     tern 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.
+
+
+
+CONDITIONAL SUBPATTERNS
+     It is possible to cause the matching process to obey a  sub-
+     pattern  conditionally  or to choose between two alternative
+     subpatterns, depending on the result  of  an  assertion,  or
+     whether  a previous capturing subpattern matched or not. The
+     two possible forms of conditional subpattern are
+
+       (?(condition)yes-pattern)
+       (?(condition)yes-pattern|no-pattern)
+
+     If the condition is satisfied, the yes-pattern is used; oth-
+     erwise  the  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 con-
+     dition 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:
+
+       ( \( )?    [^()]+    (?(1) \) )
+
+     The first part matches an optional opening parenthesis,  and
+     if  that character is present, sets it as the first captured
+     substring. The second part matches one  or  more  characters
+     that  are  not  parentheses. The third part is a conditional
+     subpattern that tests whether the first set  of  parentheses
+     matched  or  not.  If  they did, that is, if subject started
+     with an opening parenthesis, the condition is true,  and  so
+     the  yes-pattern  is  executed  and a closing parenthesis is
+     required. Otherwise, since no-pattern is  not  present,  the
+     subpattern  matches  nothing.  In  other words, this pattern
+     matches a sequence of non-parentheses,  optionally  enclosed
+     in parentheses.
+
+     If the condition is not a sequence of digits, it must be  an
+     assertion.  This  may be a positive or negative lookahead or
+     lookbehind assertion. Consider this pattern, again  contain-
+     ing  non-significant  white space, and with the two alterna-
+     tives on the second line:
+
+       (?(?=[^a-z]*[a-z])
+       \d{2}[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
+
+     The condition is a positive lookahead assertion that matches
+     an optional sequence of non-letters followed by a letter. In
+     other words, it tests for  the  presence  of  at  least  one
+     letter  in the subject. If a letter is found, the subject is
+     matched against  the  first  alternative;  otherwise  it  is
+     matched  against the second. This pattern matches strings in
+     one of the two forms dd-aaa-dd or dd-dd-dd,  where  aaa  are
+     letters and dd are digits.
+
+
+
+COMMENTS
+     The sequence (?# marks the start of a comment which  contin-
+     ues  up  to the next closing parenthesis. Nested parentheses
+     are not permitted. The characters that  make  up  a  comment
+     play no part in the pattern matching at all.
+
+     If the PCRE_EXTENDED option is set, an unescaped # character
+     outside  a character class introduces a comment that contin-
+     ues up to the next newline character in the pattern.
+
+
+
+PERFORMANCE
+     Certain items that may appear in patterns are more efficient
+     than  others.  It is more efficient to use a character class
+     like [aeiou] than a set of alternatives such as (a|e|i|o|u).
+     In  general,  the  simplest  construction  that provides the
+     required behaviour is usually the  most  efficient.  Jeffrey
+     Friedl's  book contains a lot of discussion about optimizing
+     regular expressions for efficient performance.
+
+     When a pattern begins with .* and the PCRE_DOTALL option  is
+     set,  the  pattern  is implicitly anchored by PCRE, since it
+     can match only at the start of a subject string. However, if
+     PCRE_DOTALL  is not set, PCRE cannot make this optimization,
+     because the . metacharacter does not then match  a  newline,
+     and if the subject string contains newlines, the pattern may
+     match from the character immediately following one  of  them
+     instead of from the very start. For example, the pattern
+
+       (.*) second
+
+     matches the subject "first\nand second" (where \n stands for
+     a newline character) with the first captured substring being
+     "and". In order to do this, PCRE  has  to  retry  the  match
+     starting after every newline in the subject.
+
+     If you are using such a pattern with subject strings that do
+     not  contain  newlines,  the best performance is obtained by
+     setting PCRE_DOTALL, or starting the  pattern  with  ^.*  to
+     indicate  explicit anchoring. That saves PCRE from having to
+     scan along the subject looking for a newline to restart at.
+
+     Beware of patterns that contain nested  indefinite  repeats.
+     These  can  take a long time to run when applied to a string
+     that does not match. Consider the pattern fragment
+
+       (a+)*
+
+     This can match "aaaa" in 33 different ways, and this  number
+     increases  very  rapidly  as  the string gets longer. (The *
+     repeat can match 0, 1, 2, 3, or 4 times,  and  for  each  of
+     those  cases other than 0, the + repeats can match different
+     numbers of times.) When the remainder of the pattern is such
+     that  the entire match is going to fail, PCRE has in princi-
+     ple to try every possible variation, and this  can  take  an
+     extremely long time.
+
+     An optimization catches some of the more simple  cases  such
+     as
+
+       (a+)*b
+
+     where a literal character follows. Before embarking  on  the
+     standard matching procedure, PCRE checks that there is a "b"
+     later in the subject string, and if there is not,  it  fails
+     the  match  immediately. However, when there is no following
+     literal this optimization cannot be used. You  can  see  the
+     difference by comparing the behaviour of
+
+       (a+)*\d
+
+     with the pattern above. The former gives  a  failure  almost
+     instantly  when  applied  to a whole line of "a" characters,
+     whereas the latter takes an appreciable  time  with  strings
+     longer than about 20 characters.
+
+
+
+AUTHOR
+     Philip Hazel <ph10@cam.ac.uk>
+     University Computing Service,
+     New Museums Site,
+     Cambridge CB2 3QG, England.
+     Phone: +44 1223 334714
+
+     Last updated: 29 July 1999
+     Copyright (c) 1997-1999 University of Cambridge.
index 51cb6b6c878ad8418f375f0deb4d3db3fb104926..6735b823d43b0ba32baa01f63f22dc2f6daed2b7 100644 (file)
@@ -111,7 +111,7 @@ static const short int escapes[] = {
 
 static BOOL
   compile_regex(int, int, int *, uschar **, const uschar **, const char **,
-    BOOL, int, compile_data *);
+    BOOL, int, int *, int *, compile_data *);
 
 
 
@@ -148,10 +148,13 @@ tables. */
 *          Return version string                 *
 *************************************************/
 
+#define STRING(a)  # a
+#define XSTRING(s) STRING(s)
+
 const char *
 pcre_version(void)
 {
-return PCRE_VERSION;
+return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE);
 }
 
 
@@ -162,7 +165,10 @@ return PCRE_VERSION;
 *************************************************/
 
 /* This function picks potentially useful data out of the private
-structure.
+structure. The public options are passed back in an int - though the
+re->options field has been expanded to a long int, all the public options
+at the low end of it, and so even on 16-bit systems this will still be OK.
+Therefore, I haven't changed the API for pcre_info().
 
 Arguments:
   external_re   points to compiled code
@@ -181,7 +187,7 @@ pcre_info(const pcre *external_re, int *optptr, int *first_char)
 const real_pcre *re = (const real_pcre *)external_re;
 if (re == NULL) return PCRE_ERROR_NULL;
 if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-if (optptr != NULL) *optptr = (re->options & PUBLIC_OPTIONS);
+if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
 if (first_char != NULL)
   *first_char = ((re->options & PCRE_FIRSTSET) != 0)? re->first_char :
      ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
@@ -532,6 +538,7 @@ for (;;)
 
     case OP_REVERSE:
     cc++;
+    /* Fall through */
 
     case OP_CREF:
     case OP_OPT:
@@ -627,6 +634,8 @@ Arguments:
   ptrptr       points to the current pattern pointer
   errorptr     points to pointer to error message
   optchanged   set to the value of the last OP_OPT item compiled
+  reqchar      set to the last literal character required, else -1
+  countlits    set to count of mandatory literal characters
   cd           contains pointers to tables
 
 Returns:       TRUE on success
@@ -636,12 +645,15 @@ Returns:       TRUE on success
 static BOOL
 compile_branch(int options, int *brackets, uschar **codeptr,
   const uschar **ptrptr, const char **errorptr, int *optchanged,
-  compile_data *cd)
+  int *reqchar, int *countlits, compile_data *cd)
 {
 int repeat_type, op_type;
 int repeat_min, repeat_max;
 int bravalue, length;
 int greedy_default, greedy_non_default;
+int prevreqchar;
+int condcount = 0;
+int subcountlits = 0;
 register int c;
 register uschar *code = *codeptr;
 uschar *tempcode;
@@ -655,6 +667,11 @@ uschar class[32];
 greedy_default = ((options & PCRE_UNGREEDY) != 0);
 greedy_non_default = greedy_default ^ 1;
 
+/* Initialize no required char, and count of literals */
+
+*reqchar = prevreqchar = -1;
+*countlits = 0;
+
 /* Switch on next character until the end of the branch */
 
 for (;; ptr++)
@@ -664,6 +681,7 @@ for (;; ptr++)
   int class_lastchar;
   int newoptions;
   int condref;
+  int subreqchar;
 
   c = *ptr;
   if ((options & PCRE_EXTENDED) != 0)
@@ -937,18 +955,19 @@ for (;; ptr++)
       { repeat_type = greedy_non_default; ptr++; }
     else repeat_type = greedy_default;
 
-    /* If the maximum is zero then the minimum must also be zero; Perl allows
-    this case, so we do too - by simply omitting the item altogether. */
-
-    if (repeat_max == 0) code = previous;
-
     /* If previous was a string of characters, chop off the last one and use it
     as the subject of the repeat. If there was only one character, we can
-    abolish the previous item altogether. */
+    abolish the previous item altogether. A repeat with a zero minimum wipes
+    out any reqchar setting, backing up to the previous value. We must also
+    adjust the countlits value. */
 
-    else if (*previous == OP_CHARS)
+    if (*previous == OP_CHARS)
       {
       int len = previous[1];
+
+      if (repeat_min == 0) *reqchar = prevreqchar;
+      *countlits += repeat_min - 1;
+
       if (len == 1)
         {
         c = previous[2];
@@ -987,7 +1006,15 @@ for (;; ptr++)
       code = previous;
 
       OUTPUT_SINGLE_REPEAT:
-      repeat_type += op_type;      /* Combine both values for many cases */
+
+      /* If the maximum is zero then the minimum must also be zero; Perl allows
+      this case, so we do too - by simply omitting the item altogether. */
+
+      if (repeat_max == 0) goto END_REPEAT;
+
+      /* Combine the op_type with the repeat_type */
+
+      repeat_type += op_type;
 
       /* A minimum of zero is handled either as the special case * or ?, or as
       an UPTO, with the maximum given. */
@@ -1064,10 +1091,15 @@ for (;; ptr++)
       }
 
     /* If previous was a character class or a back reference, we put the repeat
-    stuff after it. */
+    stuff after it, but just skip the item if the repeat was {0,0}. */
 
     else if (*previous == OP_CLASS || *previous == OP_REF)
       {
+      if (repeat_max == 0)
+        {
+        code = previous;
+        goto END_REPEAT;
+        }
       if (repeat_min == 0 && repeat_max == -1)
         *code++ = OP_CRSTAR + repeat_type;
       else if (repeat_min == 1 && repeat_max == -1)
@@ -1118,14 +1150,22 @@ for (;; ptr++)
 
       if (repeat_min == 0)
         {
+        /* If we set up a required char from the bracket, we must back off
+        to the previous value and reset the countlits value too. */
+
+        if (subcountlits > 0)
+          {
+          *reqchar = prevreqchar;
+          *countlits -= subcountlits;
+          }
+
         /* If the maximum is also zero, we just omit the group from the output
         altogether. */
 
         if (repeat_max == 0)
           {
           code = previous;
-          previous = NULL;
-          break;
+          goto END_REPEAT;
           }
 
         /* If the maximum is 1 or unlimited, we just have to stick in the
@@ -1230,59 +1270,6 @@ for (;; ptr++)
       correct offset was computed above. */
 
       else code[-ketoffset] = OP_KETRMAX + repeat_type;
-
-
-#ifdef NEVER
-      /* If the minimum is greater than zero, and the maximum is unlimited or
-      equal to the minimum, the first copy remains where it is, and is
-      replicated up to the minimum number of times. This case includes the +
-      repeat, but of course no replication is needed in that case. */
-
-      if (repeat_min > 0 && (repeat_max == -1 || repeat_max == repeat_min))
-        {
-        for (i = 1; i < repeat_min; i++)
-          {
-          memcpy(code, previous, len);
-          code += len;
-          }
-        }
-
-      /* If the minimum is zero, stick BRAZERO in front of the first copy.
-      Then, if there is a fixed upper limit, replicated up to that many times,
-      sticking BRAZERO in front of all the optional ones. */
-
-      else
-        {
-        if (repeat_min == 0)
-          {
-          memmove(previous+1, previous, len);
-          code++;
-          *previous++ = OP_BRAZERO + repeat_type;
-          }
-
-        for (i = 1; i < repeat_min; i++)
-          {
-          memcpy(code, previous, len);
-          code += len;
-          }
-
-        for (i = (repeat_min > 0)? repeat_min : 1; i < repeat_max; i++)
-          {
-          *code++ = OP_BRAZERO + repeat_type;
-          memcpy(code, previous, len);
-          code += len;
-          }
-        }
-
-      /* If the maximum is unlimited, set a repeater in the final copy. We
-      can't just offset backwards from the current code point, because we
-      don't know if there's been an options resetting after the ket. The
-      correct offset was computed above. */
-
-      if (repeat_max == -1) code[-ketoffset] = OP_KETRMAX + repeat_type;
-#endif
-
-
       }
 
     /* Else there's some kind of shambles */
@@ -1295,6 +1282,7 @@ for (;; ptr++)
 
     /* In all case we no longer have a previous item. */
 
+    END_REPEAT:
     previous = NULL;
     break;
 
@@ -1463,6 +1451,8 @@ for (;; ptr++)
          (bravalue == OP_ASSERTBACK ||
           bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
          condref,                      /* Condition reference number */
+         &subreqchar,                  /* For possible last char */
+         &subcountlits,                /* For literal count */
          cd))                          /* Tables block */
       goto FAILED;
 
@@ -1476,22 +1466,39 @@ for (;; ptr++)
 
     if (bravalue == OP_COND)
       {
-      int branchcount = 0;
       uschar *tc = code;
+      condcount = 0;
 
       do {
-         branchcount++;
+         condcount++;
          tc += (tc[1] << 8) | tc[2];
          }
       while (*tc != OP_KET);
 
-      if (branchcount > 2)
+      if (condcount > 2)
         {
         *errorptr = ERR27;
         goto FAILED;
         }
       }
 
+    /* Handle updating of the required character. If the subpattern didn't
+    set one, leave it as it was. Otherwise, update it for normal brackets of
+    all kinds, forward assertions, and conditions with two branches. Don't
+    update the literal count for forward assertions, however. If the bracket
+    is followed by a quantifier with zero repeat, we have to back off. Hence
+    the definition of prevreqchar and subcountlits outside the main loop so
+    that they can be accessed for the back off. */
+
+    if (subreqchar > 0 &&
+         (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_ASSERT ||
+         (bravalue == OP_COND && condcount == 2)))
+      {
+      prevreqchar = *reqchar;
+      *reqchar = subreqchar;
+      if (bravalue != OP_ASSERT) *countlits += subcountlits;
+      }
+
     /* Now update the main code pointer to the end of the group. */
 
     code = tempcode;
@@ -1586,6 +1593,12 @@ for (;; ptr++)
 
     while (length < 255 && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0);
 
+    /* Update the last character and the count of literals */
+
+    prevreqchar = (length > 1)? code[-2] : *reqchar;
+    *reqchar = code[-1];
+    *countlits += length;
+
     /* Compute the length and set it in the data vector, and advance to
     the next state. */
 
@@ -1629,6 +1642,8 @@ Argument:
   errorptr    -> pointer to error message
   lookbehind  TRUE if this is a lookbehind assertion
   condref     > 0 for OPT_CREF setting at start of conditional group
+  reqchar     -> place to put the last required character, or a negative number
+  countlits   -> place to put the shortest literal count of any branch
   cd          points to the data block with tables pointers
 
 Returns:      TRUE on success
@@ -1637,7 +1652,7 @@ Returns:      TRUE on success
 static BOOL
 compile_regex(int options, int optchanged, int *brackets, uschar **codeptr,
   const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int condref,
-  compile_data *cd)
+  int *reqchar, int *countlits, compile_data *cd)
 {
 const uschar *ptr = *ptrptr;
 uschar *code = *codeptr;
@@ -1645,7 +1660,10 @@ uschar *last_branch = code;
 uschar *start_bracket = code;
 uschar *reverse_count = NULL;
 int oldoptions = options & PCRE_IMS;
+int branchreqchar, branchcountlits;
 
+*reqchar = -1;
+*countlits = INT_MAX;
 code += 3;
 
 /* At the start of a reference-based conditional group, insert the reference
@@ -1684,7 +1702,8 @@ for (;;)
 
   /* Now compile the branch */
 
-  if (!compile_branch(options,brackets,&code,&ptr,errorptr,&optchanged,cd))
+  if (!compile_branch(options, brackets, &code, &ptr, errorptr, &optchanged,
+      &branchreqchar, &branchcountlits, cd))
     {
     *ptrptr = ptr;
     return FALSE;
@@ -1696,6 +1715,25 @@ for (;;)
   last_branch[1] = length >> 8;
   last_branch[2] = length & 255;
 
+  /* Save the last required character if all branches have the same; a current
+  value of -1 means unset, while -2 means "previous branch had no last required
+  char".  */
+
+  if (*reqchar != -2)
+    {
+    if (branchreqchar >= 0)
+      {
+      if (*reqchar == -1) *reqchar = branchreqchar;
+      else if (*reqchar != branchreqchar) *reqchar = -2;
+      }
+    else *reqchar = -2;
+    }
+
+  /* Keep the shortest literal count */
+
+  if (branchcountlits < *countlits) *countlits = branchcountlits;
+  DPRINTF(("literal count = %d min=%d\n", branchcountlits, *countlits));
+
   /* If lookbehind, check that this branch matches a fixed-length string,
   and put the length into the OP_REVERSE item. Temporarily mark the end of
   the branch with OP_END. */
@@ -1790,6 +1828,11 @@ for (;;)
     code += 2;
     break;
 
+    case OP_WORD_BOUNDARY:
+    case OP_NOT_WORD_BOUNDARY:
+    code++;
+    break;
+
     case OP_ASSERT_NOT:
     case OP_ASSERTBACK:
     case OP_ASSERTBACK_NOT:
@@ -1972,7 +2015,7 @@ pcre_compile(const char *pattern, int options, const char **errorptr,
 real_pcre *re;
 int length = 3;      /* For initial BRA plus length */
 int runlength;
-int c, size;
+int c, size, reqchar, countlits;
 int bracount = 0;
 int top_backref = 0;
 int branch_extra = 0;
@@ -2312,13 +2355,16 @@ while ((c = *(++ptr)) != 0)
             will lead to an over-estimate on the length, but this shouldn't
             matter very much. We also have to allow for resetting options at
             the start of any alternations, which we do by setting
-            branch_newextra to 2. */
+            branch_newextra to 2. Finally, we record whether the case-dependent
+            flag ever changes within the regex. This is used by the "required
+            character" code. */
 
             case ':':
             if (((set|unset) & PCRE_IMS) != 0)
               {
               length += 4;
               branch_newextra = 2;
+              if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;
               }
             goto END_OPTIONS;
 
@@ -2519,7 +2565,7 @@ code = re->code;
 *code = OP_BRA;
 bracount = 0;
 (void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, -1,
-  &compile_block);
+  &reqchar, &countlits, &compile_block);
 re->top_bracket = bracount;
 re->top_backref = top_backref;
 
@@ -2579,6 +2625,15 @@ if ((options & PCRE_ANCHORED) == 0)
     }
   }
 
+/* Save the last required character if there are at least two literal
+characters on all paths, or if there is no first character setting. */
+
+if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0))
+  {
+  re->req_char = reqchar;
+  re->options |= PCRE_REQCHSET;
+  }
+
 /* Print out the compiled data for debugging */
 
 #ifdef DEBUG
@@ -2588,9 +2643,10 @@ printf("Length = %d top_bracket = %d top_backref = %d\n",
 
 if (re->options != 0)
   {
-  printf("%s%s%s%s%s%s%s%s\n",
+  printf("%s%s%s%s%s%s%s%s%s\n",
     ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
     ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
+    ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",
     ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
     ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
     ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
@@ -2605,6 +2661,12 @@ if ((re->options & PCRE_FIRSTSET) != 0)
     else printf("First char = \\x%02x\n", re->first_char);
   }
 
+if ((re->options & PCRE_REQCHSET) != 0)
+  {
+  if (isprint(re->req_char)) printf("Req char = %c\n", re->req_char);
+    else printf("Req char = \\x%02x\n", re->req_char);
+  }
+
 code_end = code;
 code_base = code = re->code;
 
@@ -2838,7 +2900,7 @@ Returns:      TRUE if matched
 
 static BOOL
 match_ref(int offset, register const uschar *eptr, int length, match_data *md,
-  int ims)
+  unsigned long int ims)
 {
 const uschar *p = md->start_subject + md->offset_vector[offset];
 
@@ -2897,9 +2959,10 @@ Returns:       TRUE if matched
 
 static BOOL
 match(register const uschar *eptr, register const uschar *ecode,
-  int offset_top, match_data *md, int ims, BOOL condassert, const uschar *eptrb)
+  int offset_top, match_data *md, unsigned long int ims, BOOL condassert,
+  const uschar *eptrb)
 {
-int original_ims = ims;   /* Save for resetting on ')' */
+unsigned long int original_ims = ims;   /* Save for resetting on ')' */
 
 for (;;)
   {
@@ -3014,9 +3077,11 @@ for (;;)
     ecode += 2;
     break;
 
-    /* End of the pattern */
+    /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched
+    an empty string - recursion will then try other alternatives, if any. */
 
     case OP_END:
+    if (md->notempty && eptr == md->start_match) return FALSE;
     md->end_match_ptr = eptr;          /* Record where we ended */
     md->end_offset_top = offset_top;   /* and how many extracts were taken */
     return TRUE;
@@ -3026,7 +3091,7 @@ for (;;)
     case OP_OPT:
     ims = ecode[1];
     ecode += 2;
-    DPRINTF(("ims set to %02x\n", ims));
+    DPRINTF(("ims set to %02lx\n", ims));
     break;
 
     /* Assertion brackets. Check the alternative branches in turn - the
@@ -3133,7 +3198,7 @@ for (;;)
       if (ecode[3] == OP_OPT)
         {
         ims = (ims & ~PCRE_IMS) | ecode[4];
-        DPRINTF(("ims set to %02x at group repeat\n", ims));
+        DPRINTF(("ims set to %02lx at group repeat\n", ims));
         }
 
       if (*ecode == OP_KETRMIN)
@@ -3227,7 +3292,7 @@ for (;;)
       the group. */
 
       ims = original_ims;
-      DPRINTF(("ims reset to %02x\n", ims));
+      DPRINTF(("ims reset to %02lx\n", ims));
 
       /* For a non-repeating ket, just continue at this level. This also
       happens for a repeating ket if no characters were matched in the group.
@@ -3321,12 +3386,8 @@ for (;;)
     case OP_NOT_WORD_BOUNDARY:
     case OP_WORD_BOUNDARY:
       {
-      /* Modified the next line to check previous character
-        in case we're not at the beginning of the whole string
-        (Andrey Zmievski) */
-      BOOL prev_is_word = (eptr != md->start_subject) ?
-        ((md->ctypes[eptr[-1]] & ctype_word) != 0) :
-               ((md->ctypes[md->regprev] & ctype_word) != 0);
+      BOOL prev_is_word = (eptr != md->start_subject) &&
+        ((md->ctypes[eptr[-1]] & ctype_word) != 0);
       BOOL cur_is_word = (eptr < md->end_subject) &&
         ((md->ctypes[*eptr] & ctype_word) != 0);
       if ((*ecode++ == OP_WORD_BOUNDARY)?
@@ -4117,6 +4178,7 @@ Arguments:
   external_extra  points to "hints" from pcre_study() or is NULL
   subject         points to the subject string
   length          length of subject string (may contain binary zeros)
+  start_offset    where to start in the subject string
   options         option bits
   offsets         points to a vector of ints to be filled in with offsets
   offsetcount     the number of elements in the vector
@@ -4129,16 +4191,19 @@ Returns:          > 0 => success; value is the number of elements filled in
 
 int
 pcre_exec(const pcre *external_re, const pcre_extra *external_extra,
-  const char *subject, int length, const char *strbeg, int options,
-  int *offsets, int offsetcount, int minlen)
+  const char *subject, int length, int start_offset, int options, int *offsets,
+  int offsetcount)
 {
 int resetcount, ocount;
 int first_char = -1;
-int ims = 0;
+int req_char = -1;
+int req_char2 = -1;
+unsigned long int ims = 0;
 match_data match_block;
 const uschar *start_bits = NULL;
-const uschar *start_match = (const uschar *)subject;
+const uschar *start_match = (const uschar *)subject + start_offset;
 const uschar *end_subject;
+const uschar *req_char_ptr = start_match - 1;
 const real_pcre *re = (const real_pcre *)external_re;
 const real_pcre_extra *extra = (const real_pcre_extra *)external_extra;
 BOOL using_temporary_offsets = FALSE;
@@ -4159,21 +4224,13 @@ match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
 
 match_block.notbol = (options & PCRE_NOTBOL) != 0;
 match_block.noteol = (options & PCRE_NOTEOL) != 0;
+match_block.notempty = (options & PCRE_NOTEMPTY) != 0;
 
 match_block.errorcode = PCRE_ERROR_NOMATCH;     /* Default error */
 
 match_block.lcc = re->tables + lcc_offset;
 match_block.ctypes = re->tables + ctypes_offset;
 
-/* Setup previous character (Andrey Zmievski) */
-if (subject == strbeg)
-       match_block.regprev = '\n';
-else {
-       match_block.regprev = subject[-1];
-       if (!(re->options & PCRE_MULTILINE) && match_block.regprev == '\n')
-               match_block.regprev = '\0';
-}
-
 /* The ims options can vary during the matching as a result of the presence
 of (?ims) items in the pattern. They are kept in a local variable so that
 restoring at the exit of a group is easy. */
@@ -4238,7 +4295,23 @@ if (!anchored)
         start_bits = extra->start_bits;
   }
 
-/* Loop for unanchored matches; for anchored regexps the loop runs just once. */
+/* For anchored or unanchored matches, there may be a "last known required
+character" set. If the PCRE_CASELESS is set, implying that the match starts
+caselessly, or if there are any changes of this flag within the regex, set up
+both cases of the character. Otherwise set the two values the same, which will
+avoid duplicate testing (which takes significant time). This covers the vast
+majority of cases. It will be suboptimal when the case flag changes in a regex
+and the required character in fact is caseful. */
+
+if ((re->options & PCRE_REQCHSET) != 0)
+  {
+  req_char = re->req_char;
+  req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0)?
+    (re->tables + fcc_offset)[req_char] : req_char;
+  }
+
+/* Loop for handling unanchored repeated matching attempts; for anchored regexs
+the loop runs just once. */
 
 do
   {
@@ -4267,14 +4340,14 @@ do
 
   else if (startline)
     {
-    if (start_match > match_block.start_subject)
+    if (start_match > match_block.start_subject + start_offset)
       {
       while (start_match < end_subject && start_match[-1] != '\n')
         start_match++;
       }
     }
 
-  /* Or to a non-unique first char */
+  /* Or to a non-unique first char after study */
 
   else if (start_bits != NULL)
     {
@@ -4291,6 +4364,59 @@ do
   printf("\n");
 #endif
 
+  /* If req_char is set, we know that that character must appear in the subject
+  for the match to succeed. If the first character is set, req_char must be
+  later in the subject; otherwise the test starts at the match point. This
+  optimization can save a huge amount of backtracking in patterns with nested
+  unlimited repeats that aren't going to match. We don't know what the state of
+  case matching may be when this character is hit, so test for it in both its
+  cases if necessary. However, the different cased versions will not be set up
+  unless PCRE_CASELESS was given or the casing state changes within the regex.
+  Writing separate code makes it go faster, as does using an autoincrement and
+  backing off on a match. */
+
+  if (req_char >= 0)
+    {
+    register const uschar *p = start_match + ((first_char >= 0)? 1 : 0);
+
+    /* We don't need to repeat the search if we haven't yet reached the
+    place we found it at last time. */
+
+    if (p > req_char_ptr)
+      {
+      /* Do a single test if no case difference is set up */
+
+      if (req_char == req_char2)
+        {
+        while (p < end_subject)
+          {
+          if (*p++ == req_char) { p--; break; }
+          }
+        }
+
+      /* Otherwise test for either case */
+
+      else
+        {
+        while (p < end_subject)
+          {
+          register int pp = *p++;
+          if (pp == req_char || pp == req_char2) { p--; break; }
+          }
+        }
+
+      /* If we can't find the required character, break the matching loop */
+
+      if (p >= end_subject) break;
+
+      /* If we have found the required character, save the point where we
+      found it, so that we don't search again next time round the loop if
+      the start hasn't passed this character yet. */
+
+      req_char_ptr = p;
+      }
+    }
+
   /* When a match occurs, substrings will be set for all internal extractions;
   we just need to set up the whole thing as substring 0 before returning. If
   there were too many extractions, set the return code to zero. In the case
@@ -4298,13 +4424,10 @@ do
   those back references that we can. In this case there need not be overflow
   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))
     continue;
 
-  /* Check that the match is not closer than minlen (Andrey Zmievski) */
-  if (start_match - match_block.start_subject < minlen)
-    continue;
-
   /* Copy the offset information from temporary store if necessary */
 
   if (using_temporary_offsets)
diff --git a/ext/pcre/pcrelib/pcre.def b/ext/pcre/pcrelib/pcre.def
new file mode 100644 (file)
index 0000000..0e8cf3f
--- /dev/null
@@ -0,0 +1,19 @@
+EXPORTS
+
+pcre_malloc DATA
+pcre_free DATA
+
+pcre_compile
+pcre_copy_substring
+pcre_exec
+pcre_get_substring
+pcre_get_substring_list
+pcre_info
+pcre_maketables
+pcre_study
+pcre_version
+
+regcomp
+regexec
+regerror
+regfree
index 8fedb8189e1e927ce507309053feae2bc3a2b487..4888b452570ff59176bc390c40ce3f106cc0f2a5 100644 (file)
@@ -7,6 +7,22 @@
 #ifndef _PCRE_H
 #define _PCRE_H
 
+#define PCRE_MAJOR 2
+#define PCRE_MINOR 08
+#define PCRE_DATE  31-Aug-1999
+
+/* Win32 uses DLL by default */
+
+#ifdef _WIN32
+# ifdef STATIC
+#  define PCRE_DL_IMPORT
+# else
+#  define PCRE_DL_IMPORT __declspec(dllimport)
+# endif
+#else
+# define PCRE_DL_IMPORT
+#endif
+
 /* Have to include stdlib.h in order to ensure that size_t is defined;
 it is needed here for malloc. */
 
@@ -31,6 +47,7 @@ extern "C" {
 #define PCRE_NOTBOL          0x0080
 #define PCRE_NOTEOL          0x0100
 #define PCRE_UNGREEDY        0x0200
+#define PCRE_NOTEMPTY        0x0400
 
 /* Exec-time and get-time error codes */
 
@@ -48,10 +65,13 @@ typedef void pcre;
 typedef void pcre_extra;
 
 /* Store get and free functions. These can be set to alternative malloc/free
-functions if required. */
+functions if required. Some magic is required for Win32 DLL; it is null on
+other OS. */
+
+PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t);
+PCRE_DL_IMPORT extern void  (*pcre_free)(void *);
 
-extern void *(*pcre_malloc)(size_t);
-extern void  (*pcre_free)(void *);
+#undef PCRE_DL_IMPORT
 
 /* Functions */
 
@@ -59,7 +79,7 @@ extern pcre *pcre_compile(const char *, int, const char **, int *,
   const unsigned char *);
 extern int pcre_copy_substring(const char *, int *, int, int, char *, int);
 extern int pcre_exec(const pcre *, const pcre_extra *, const char *,
-  int, const char *, int, int *, int, int);
+  int, int, int, int *, int);
 extern int pcre_get_substring(const char *, int *, int, int, const char **);
 extern int pcre_get_substring_list(const char *, int *, int, const char ***);
 extern int pcre_info(const pcre *, int *, int *);
index 40601c4bd762c7b7305ac24f4f9ef67a239b45cf..0a40369bddf30097546d81d9c26b25fc719c88aa 100644 (file)
@@ -26,9 +26,15 @@ pcreposix - POSIX API for Perl-compatible regular expressions.
 
 .SH DESCRIPTION
 This set of functions provides a POSIX-style API to the PCRE regular expression
-package. See \fBpcre (3)\fR for a description of the native API, which contains
-additional functionality. The functions described here are just wrapper
-functions that ultimately call the native API.
+package. See the \fBpcre\fR documentation for a description of the native API,
+which contains additional functionality.
+
+The functions described here are just wrapper functions that ultimately call
+the native API. Their prototypes are defined in the \fBpcreposix.h\fR header
+file, and on Unix systems the library itself is called \fBpcreposix.a\fR, so
+can be accessed by adding \fB-lpcreposix\fR to the command for linking an
+application which uses them. Because the POSIX functions call the native ones,
+it is also necessary to add \fR-lpcre\fR.
 
 As I am pretty ignorant about POSIX, these functions must be considered as
 experimental. I have implemented only those option bits that can be reasonably
diff --git a/ext/pcre/pcrelib/pcreposix.3.html b/ext/pcre/pcrelib/pcreposix.3.html
new file mode 100644 (file)
index 0000000..2c764b6
--- /dev/null
@@ -0,0 +1,182 @@
+<HTML>
+<HEAD>
+<TITLE>pcreposix specification</TITLE>
+</HEAD>
+<body bgcolor="#FFFFFF" text="#00005A">
+<H1>pcreposix specification</H1>
+This HTML document has been generated automatically from the original man page.
+If there is any nonsense in it, please consult the man page in case the
+conversion went wrong.
+<UL>
+<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>
+<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>
+<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>
+<LI><A NAME="TOC4" HREF="#SEC4">COMPILING A PATTERN</A>
+<LI><A NAME="TOC5" HREF="#SEC5">MATCHING A PATTERN</A>
+<LI><A NAME="TOC6" HREF="#SEC6">ERROR MESSAGES</A>
+<LI><A NAME="TOC7" HREF="#SEC7">STORAGE</A>
+<LI><A NAME="TOC8" HREF="#SEC8">AUTHOR</A>
+</UL>
+<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>
+<P>
+pcreposix - POSIX API for Perl-compatible regular expressions.
+</P>
+<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>
+<P>
+<B>#include &#60;pcreposix.h&#62;</B>
+</P>
+<P>
+<B>int regcomp(regex_t *<I>preg</I>, const char *<I>pattern</I>,</B>
+<B>int <I>cflags</I>);</B>
+</P>
+<P>
+<B>int regexec(regex_t *<I>preg</I>, const char *<I>string</I>,</B>
+<B>size_t <I>nmatch</I>, regmatch_t <I>pmatch</I>[], int <I>eflags</I>);</B>
+</P>
+<P>
+<B>size_t regerror(int <I>errcode</I>, const regex_t *<I>preg</I>,</B>
+<B>char *<I>errbuf</I>, size_t <I>errbuf_size</I>);</B>
+</P>
+<P>
+<B>void regfree(regex_t *<I>preg</I>);</B>
+</P>
+<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>
+<P>
+This set of functions provides a POSIX-style API to the PCRE regular expression
+package. See the <B>pcre</B> documentation for a description of the native API,
+which contains additional functionality.
+</P>
+<P>
+The functions described here are just wrapper functions that ultimately call
+the native API. Their prototypes are defined in the <B>pcreposix.h</B> header
+file, and on Unix systems the library itself is called <B>pcreposix.a</B>, so
+can be accessed by adding <B>-lpcreposix</B> to the command for linking an
+application which uses them. Because the POSIX functions call the native ones,
+it is also necessary to add \fR-lpcre\fR.
+</P>
+<P>
+As I am pretty ignorant about POSIX, these functions must be considered as
+experimental. I have implemented only those option bits that can be reasonably
+mapped to PCRE native options. Other POSIX options are not even defined. It may
+be that it is useful to define, but ignore, other options. Feedback from more
+knowledgeable folk may cause this kind of detail to change.
+</P>
+<P>
+When PCRE is called via these functions, it is only the API that is POSIX-like
+in style. The syntax and semantics of the regular expressions themselves are
+still those of Perl, subject to the setting of various PCRE options, as
+described below.
+</P>
+<P>
+The header for these functions is supplied as <B>pcreposix.h</B> to avoid any
+potential clash with other POSIX libraries. It can, of course, be renamed or
+aliased as <B>regex.h</B>, which is the "correct" name. It provides two
+structure types, <I>regex_t</I> for compiled internal forms, and
+<I>regmatch_t</I> for returning captured substrings. It also defines some
+constants whose names start with "REG_"; these are used for setting options and
+identifying error codes.
+</P>
+<LI><A NAME="SEC4" HREF="#TOC1">COMPILING A PATTERN</A>
+<P>
+The function <B>regcomp()</B> is called to compile a pattern into an
+internal form. The pattern is a C string terminated by a binary zero, and
+is passed in the argument <I>pattern</I>. The <I>preg</I> argument is a pointer
+to a regex_t structure which is used as a base for storing information about
+the compiled expression.
+</P>
+<P>
+The argument <I>cflags</I> is either zero, or contains one or more of the bits
+defined by the following macros:
+</P>
+<P>
+<PRE>
+  REG_ICASE
+</PRE>
+</P>
+<P>
+The PCRE_CASELESS option is set when the expression is passed for compilation
+to the native function.
+</P>
+<P>
+<PRE>
+  REG_NEWLINE
+</PRE>
+</P>
+<P>
+The PCRE_MULTILINE option is set when the expression is passed for compilation
+to the native function.
+</P>
+<P>
+The yield of <B>regcomp()</B> is zero on success, and non-zero otherwise. The
+<I>preg</I> structure is filled in on success, and one member of the structure
+is publicized: <I>re_nsub</I> contains the number of capturing subpatterns in
+the regular expression. Various error codes are defined in the header file.
+</P>
+<LI><A NAME="SEC5" HREF="#TOC1">MATCHING A PATTERN</A>
+<P>
+The function <B>regexec()</B> is called to match a pre-compiled pattern
+<I>preg</I> against a given <I>string</I>, which is terminated by a zero byte,
+subject to the options in <I>eflags</I>. These can be:
+</P>
+<P>
+<PRE>
+  REG_NOTBOL
+</PRE>
+</P>
+<P>
+The PCRE_NOTBOL option is set when calling the underlying PCRE matching
+function.
+</P>
+<P>
+<PRE>
+  REG_NOTEOL
+</PRE>
+</P>
+<P>
+The PCRE_NOTEOL option is set when calling the underlying PCRE matching
+function.
+</P>
+<P>
+The portion of the string that was matched, and also any captured substrings,
+are returned via the <I>pmatch</I> argument, which points to an array of
+<I>nmatch</I> structures of type <I>regmatch_t</I>, containing the members
+<I>rm_so</I> and <I>rm_eo</I>. These contain the offset to the first character of
+each substring and the offset to the first character after the end of each
+substring, respectively. The 0th element of the vector relates to the entire
+portion of <I>string</I> that was matched; subsequent elements relate to the
+capturing subpatterns of the regular expression. Unused entries in the array
+have both structure members set to -1.
+</P>
+<P>
+A successful match yields a zero return; various error codes are defined in the
+header file, of which REG_NOMATCH is the "expected" failure code.
+</P>
+<LI><A NAME="SEC6" HREF="#TOC1">ERROR MESSAGES</A>
+<P>
+The <B>regerror()</B> function maps a non-zero errorcode from either
+<B>regcomp</B> or <B>regexec</B> to a printable message. If <I>preg</I> is not
+NULL, the error should have arisen from the use of that structure. A message
+terminated by a binary zero is placed in <I>errbuf</I>. The length of the
+message, including the zero, is limited to <I>errbuf_size</I>. The yield of the
+function is the size of buffer needed to hold the whole message.
+</P>
+<LI><A NAME="SEC7" HREF="#TOC1">STORAGE</A>
+<P>
+Compiling a regular expression causes memory to be allocated and associated
+with the <I>preg</I> structure. The function <B>regfree()</B> frees all such
+memory, after which <I>preg</I> may no longer be used as a compiled expression.
+</P>
+<LI><A NAME="SEC8" HREF="#TOC1">AUTHOR</A>
+<P>
+Philip Hazel &#60;ph10@cam.ac.uk&#62;
+<BR>
+University Computing Service,
+<BR>
+New Museums Site,
+<BR>
+Cambridge CB2 3QG, England.
+<BR>
+Phone: +44 1223 334714
+</P>
+<P>
+Copyright (c) 1997-1999 University of Cambridge.
diff --git a/ext/pcre/pcrelib/pcreposix.3.txt b/ext/pcre/pcrelib/pcreposix.3.txt
new file mode 100644 (file)
index 0000000..c85fb84
--- /dev/null
@@ -0,0 +1,150 @@
+NAME
+     pcreposix - POSIX API for  Perl-compatible  regular  expres-
+     sions.
+
+
+
+SYNOPSIS
+     #include <pcreposix.h>
+
+     int regcomp(regex_t *preg, const char *pattern,
+          int cflags);
+
+     int regexec(regex_t *preg, const char *string,
+          size_t nmatch, regmatch_t pmatch[], int eflags);
+
+     size_t regerror(int errcode, const regex_t *preg,
+          char *errbuf, size_t errbuf_size);
+
+     void regfree(regex_t *preg);
+
+
+
+DESCRIPTION
+     This set of functions provides a POSIX-style API to the PCRE
+     regular expression package. See the pcre documentation for a
+     description of the native  API,  which  contains  additional
+     functionality.
+
+     The functions described here are just wrapper functions that
+     ultimately call the native API. Their prototypes are defined
+     in the pcreposix.h header file,  and  on  Unix  systems  the
+     library  itself is called pcreposix.a, so can be accessed by
+     adding -lpcreposix to the command for linking an application
+     which uses them. Because the POSIX functions call the native
+     ones, it is also necessary to add -lpcre.
+
+     As I am pretty ignorant about POSIX, these functions must be
+     considered  as  experimental.  I have implemented only those
+     option bits that can be reasonably  mapped  to  PCRE  native
+     options. Other POSIX options are not even defined. It may be
+     that it is useful to  define,  but  ignore,  other  options.
+     Feedback from more knowledgeable folk may cause this kind of
+     detail to change.
+
+     When PCRE is called via these functions, it is only the  API
+     that is POSIX-like in style. The syntax and semantics of the
+     regular expressions themselves are still those of Perl, sub-
+     ject  to  the  setting of various PCRE options, as described
+     below.
+
+     The header for these functions is supplied as pcreposix.h to
+     avoid  any  potential  clash  with other POSIX libraries. It
+     can, of course, be renamed or aliased as regex.h,  which  is
+     the "correct" name. It provides two structure types, regex_t
+     for compiled internal forms, and  regmatch_t  for  returning
+     captured  substrings.  It  also defines some constants whose
+     names start with "REG_"; these are used for setting  options
+     and identifying error codes.
+
+
+
+COMPILING A PATTERN
+     The function regcomp() is called to compile a  pattern  into
+     an  internal form. The pattern is a C string terminated by a
+     binary zero, and is passed in the argument pattern. The preg
+     argument  is  a pointer to a regex_t structure which is used
+     as a base for storing information about the compiled expres-
+     sion.
+
+     The argument cflags is either zero, or contains one or  more
+     of the bits defined by the following macros:
+
+       REG_ICASE
+
+     The PCRE_CASELESS option  is  set  when  the  expression  is
+     passed for compilation to the native function.
+
+       REG_NEWLINE
+
+     The PCRE_MULTILINE option is  set  when  the  expression  is
+     passed for compilation to the native function.
+
+     The yield of regcomp() is zero on success, and non-zero oth-
+     erwise.  The preg structure is filled in on success, and one
+     member of the structure is publicized: re_nsub contains  the
+     number  of  capturing subpatterns in the regular expression.
+     Various error codes are defined in the header file.
+
+
+
+MATCHING A PATTERN
+     The function regexec() is called  to  match  a  pre-compiled
+     pattern  preg against a given string, which is terminated by
+     a zero byte, subject to the options in eflags. These can be:
+
+       REG_NOTBOL
+
+     The PCRE_NOTBOL option is set when  calling  the  underlying
+     PCRE matching function.
+
+       REG_NOTEOL
+
+     The PCRE_NOTEOL option is set when  calling  the  underlying
+     PCRE matching function.
+
+     The portion of the string that was  matched,  and  also  any
+     captured  substrings,  are returned via the pmatch argument,
+     which points to  an  array  of  nmatch  structures  of  type
+     regmatch_t,  containing  the  members rm_so and rm_eo. These
+     contain the offset to the first character of each  substring
+     and  the offset to the first character after the end of each
+     substring, respectively.  The  0th  element  of  the  vector
+     relates  to  the  entire portion of string that was matched;
+     subsequent elements relate to the capturing  subpatterns  of
+     the  regular  expression.  Unused  entries in the array have
+     both structure members set to -1.
+
+     A successful match yields a zero return; various error codes
+     are  defined in the header file, of which REG_NOMATCH is the
+     "expected" failure code.
+
+
+
+ERROR MESSAGES
+     The regerror()  function  maps  a  non-zero  errorcode  from
+     either regcomp or regexec to a printable message. If preg is
+     not NULL, the error should have arisen from the use of  that
+     structure.  A  message terminated by a binary zero is placed
+     in errbuf. The length of the message, including the zero, is
+     limited  to  errbuf_size.  The  yield of the function is the
+     size of buffer needed to hold the whole message.
+
+
+
+STORAGE
+     Compiling a regular expression causes memory to be allocated
+     and  associated  with  the preg structure. The function reg-
+     free() frees all such memory, after which preg may no longer
+     be used as a compiled expression.
+
+
+
+AUTHOR
+     Philip Hazel <ph10@cam.ac.uk>
+     University Computing Service,
+     New Museums Site,
+     Cambridge CB2 3QG, England.
+     Phone: +44 1223 334714
+
+     Copyright (c) 1997-1999 University of Cambridge.
index 514905bc223fdca972b9ebf417ddf5cedf6e47be..9672be4fd61a478d2bb7ac1748ba842b87fad469 100644 (file)
@@ -223,10 +223,8 @@ if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
 
 preg->re_erroffset = (size_t)(-1);   /* Only has meaning after compile */
 
-rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string),
-                          string, // const char *strbeg (added for vi-like 'g' replace flag)
-                          options, (int *)pmatch, nmatch * 2,
-                          0); // int minlen (added for vi-like 'g' replace flag)
+rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string), 0, options,
+  (int *)pmatch, nmatch * 2);
 
 if (rc == 0) return 0;    /* All pmatch were filled in */
 
index da736a20e715281b74825334655e2fc36903a4da..b2fe20eafc57d90b587f8b1d072e639e0f33bc4b 100644 (file)
 /* Use the internal info for displaying the results of pcre_study(). */
 
 #include "internal.h"
+
+/* It is possible to compile this test program without including support for
+testing the POSIX interface, though this is not available via the standard
+Makefile. */
+
+#if !defined NOPOSIX
 #include "pcreposix.h"
+#endif
 
 #ifndef CLOCKS_PER_SEC
 #ifdef CLK_TCK
@@ -48,7 +55,7 @@ static const char *OP_names[] = {
 };
 
 
-static void print_internals(pcre *re, FILE *outfile)
+static void print_internals(pcre *re)
 {
 unsigned char *code = ((real_pcre *)re)->code;
 
@@ -275,8 +282,8 @@ compiled re. */
 static void *new_malloc(size_t size)
 {
 if (log_store)
-  fprintf(outfile, "Memory allocation request: %d (code space %d)\n",
-    (int)size, (int)size - offsetof(real_pcre, code[0]));
+  fprintf(outfile, "Memory allocation (code space): %d\n",
+    (int)((int)size - offsetof(real_pcre, code[0])));
 return malloc(size);
 }
 
@@ -366,13 +373,20 @@ while (!done)
   {
   pcre *re = NULL;
   pcre_extra *extra = NULL;
+
+#if !defined NOPOSIX  /* There are still compilers that require no indent */
   regex_t preg;
+#endif
+
   const char *error;
   unsigned char *p, *pp, *ppp;
   unsigned const char *tables = NULL;
   int do_study = 0;
   int do_debug = debug;
+  int do_G = 0;
+  int do_g = 0;
   int do_showinfo = showinfo;
+  int do_showrest = 0;
   int do_posix = 0;
   int erroroffset, len, delimiter;
 
@@ -444,17 +458,24 @@ while (!done)
     {
     switch (*pp++)
       {
+      case 'g': do_g = 1; break;
       case 'i': options |= PCRE_CASELESS; break;
       case 'm': options |= PCRE_MULTILINE; break;
       case 's': options |= PCRE_DOTALL; break;
       case 'x': options |= PCRE_EXTENDED; break;
 
+      case '+': do_showrest = 1; break;
       case 'A': options |= PCRE_ANCHORED; break;
       case 'D': do_debug = do_showinfo = 1; break;
       case 'E': options |= PCRE_DOLLAR_ENDONLY; break;
+      case 'G': do_G = 1; break;
       case 'I': do_showinfo = 1; break;
       case 'M': log_store = 1; break;
+
+#if !defined NOPOSIX
       case 'P': do_posix = 1; break;
+#endif
+
       case 'S': do_study = 1; break;
       case 'U': options |= PCRE_UNGREEDY; break;
       case 'X': options |= PCRE_EXTRA; break;
@@ -483,6 +504,7 @@ while (!done)
   timing, showing, or debugging options, nor the ability to pass over
   local character tables. */
 
+#if !defined NOPOSIX
   if (posix || do_posix)
     {
     int rc;
@@ -505,6 +527,8 @@ while (!done)
   /* Handle compiling via the native interface */
 
   else
+#endif  /* !defined NOPOSIX */
+
     {
     if (timeit)
       {
@@ -555,7 +579,7 @@ while (!done)
       {
       int first_char, count;
 
-      if (do_debug) print_internals(re, outfile);
+      if (do_debug) print_internals(re);
 
       count = pcre_info(re, &options, &first_char);
       if (count < 0) fprintf(outfile,
@@ -573,6 +597,10 @@ while (!done)
             ((options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
             ((options & PCRE_EXTRA) != 0)? " extra" : "",
             ((options & PCRE_UNGREEDY) != 0)? " ungreedy" : "");
+
+        if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0)
+          fprintf(outfile, "Case state changes\n");
+
         if (first_char == -1)
           {
           fprintf(outfile, "First char at start or follows \\n\n");
@@ -588,6 +616,16 @@ while (!done)
           else
             fprintf(outfile, "First char = %d\n", first_char);
           }
+
+        if (((((real_pcre *)re)->options) & PCRE_REQCHSET) != 0)
+          {
+          int req_char = ((real_pcre *)re)->req_char;
+          if (isprint(req_char))
+            fprintf(outfile, "Req char = \'%c\'\n", req_char);
+          else
+            fprintf(outfile, "Req char = %d\n", req_char);
+          }
+        else fprintf(outfile, "No req char\n");
         }
       }
 
@@ -661,16 +699,19 @@ while (!done)
   for (;;)
     {
     unsigned char *q;
+    unsigned char *bptr = dbuffer;
     int count, c;
     int copystrings = 0;
     int getstrings = 0;
     int getlist = 0;
+    int gmatched = 0;
+    int start_offset = 0;
     int offsets[45];
     int size_offsets = sizeof(offsets)/sizeof(int);
 
     options = 0;
 
-    if (infile == stdin) printf("  data> ");
+    if (infile == stdin) printf("data> ");
     if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)
       {
       done = 1;
@@ -744,6 +785,10 @@ while (!done)
         getlist = 1;
         continue;
 
+        case 'N':
+        options |= PCRE_NOTEMPTY;
+        continue;
+
         case 'O':
         while(isdigit(*p)) n = n * 10 + *p++ - '0';
         if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n;
@@ -761,6 +806,7 @@ while (!done)
     /* Handle matching via the POSIX interface, which does not
     support timing. */
 
+#if !defined NOPOSIX
     if (posix || do_posix)
       {
       int rc;
@@ -769,8 +815,8 @@ while (!done)
       if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
       if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
 
-      rc = regexec(&preg, (char *)dbuffer, sizeof(pmatch)/sizeof(regmatch_t),
-        pmatch, eflags);
+      rc = regexec(&preg, (const char *)bptr,
+        sizeof(pmatch)/sizeof(regmatch_t), pmatch, eflags);
 
       if (rc != 0)
         {
@@ -788,14 +834,23 @@ while (!done)
             pchars(dbuffer + pmatch[i].rm_so,
               pmatch[i].rm_eo - pmatch[i].rm_so);
             fprintf(outfile, "\n");
+            if (i == 0 && do_showrest)
+              {
+              fprintf(outfile, " 0+ ");
+              pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo);
+              fprintf(outfile, "\n");
+              }
             }
           }
         }
       }
 
-    /* Handle matching via the native interface */
+    /* Handle matching via the native interface - repeats for /g and /G */
 
     else
+#endif  /* !defined NOPOSIX */
+
+    for (;; gmatched++)    /* Loop for /g or /G */
       {
       if (timeit)
         {
@@ -803,16 +858,16 @@ while (!done)
         clock_t time_taken;
         clock_t start_time = clock();
         for (i = 0; i < LOOPREPEAT; i++)
-          count = pcre_exec(re, extra, (char *)dbuffer, len, options, offsets,
-            size_offsets);
+          count = pcre_exec(re, extra, (char *)bptr, len,
+            start_offset, options, offsets, size_offsets);
         time_taken = clock() - start_time;
         fprintf(outfile, "Execute time %.3f milliseconds\n",
           ((double)time_taken * 1000.0)/
           ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));
         }
 
-      count = pcre_exec(re, extra, (char *)dbuffer, len, options, offsets,
-        size_offsets);
+      count = pcre_exec(re, extra, (char *)bptr, len,
+        start_offset, options, offsets, size_offsets);
 
       if (count == 0)
         {
@@ -820,6 +875,8 @@ while (!done)
         count = size_offsets/3;
         }
 
+      /* Matched */
+
       if (count >= 0)
         {
         int i;
@@ -830,8 +887,17 @@ while (!done)
           else
             {
             fprintf(outfile, "%2d: ", i/2);
-            pchars(dbuffer + offsets[i], offsets[i+1] - offsets[i]);
+            pchars(bptr + offsets[i], offsets[i+1] - offsets[i]);
             fprintf(outfile, "\n");
+            if (i == 0)
+              {
+              if (do_showrest)
+                {
+                fprintf(outfile, " 0+ ");
+                pchars(bptr + offsets[i+1], len - offsets[i+1]);
+                fprintf(outfile, "\n");
+                }
+              }
             }
           }
 
@@ -839,13 +905,13 @@ while (!done)
           {
           if ((copystrings & (1 << i)) != 0)
             {
-            char buffer[16];
-            int rc = pcre_copy_substring((char *)dbuffer, offsets, count,
-              i, buffer, sizeof(buffer));
+            char copybuffer[16];
+            int rc = pcre_copy_substring((char *)bptr, offsets, count,
+              i, copybuffer, sizeof(copybuffer));
             if (rc < 0)
               fprintf(outfile, "copy substring %d failed %d\n", i, rc);
             else
-              fprintf(outfile, "%2dC %s (%d)\n", i, buffer, rc);
+              fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc);
             }
           }
 
@@ -854,7 +920,7 @@ while (!done)
           if ((getstrings & (1 << i)) != 0)
             {
             const char *substring;
-            int rc = pcre_get_substring((char *)dbuffer, offsets, count,
+            int rc = pcre_get_substring((char *)bptr, offsets, count,
               i, &substring);
             if (rc < 0)
               fprintf(outfile, "get substring %d failed %d\n", i, rc);
@@ -869,7 +935,7 @@ while (!done)
         if (getlist)
           {
           const char **stringlist;
-          int rc = pcre_get_substring_list((char *)dbuffer, offsets, count,
+          int rc = pcre_get_substring_list((char *)bptr, offsets, count,
             &stringlist);
           if (rc < 0)
             fprintf(outfile, "get substring list failed %d\n", rc);
@@ -882,18 +948,52 @@ while (!done)
             free((void *)stringlist);
             }
           }
+        }
+
+      /* Failed to match */
 
+      else
+        {
+        if (gmatched == 0)
+          {
+          if (count == -1) fprintf(outfile, "No match\n");
+            else fprintf(outfile, "Error %d\n", count);
+          }
+        break;  /* Out of the /g loop */
         }
+
+      /* If not /g or /G we are done */
+
+      if (!do_g && !do_G) break;
+
+      /* If we have matched an empty string, set PCRE_NOTEMPTY for the next
+      match. This mimics what Perl's /g option does. */
+
+      if (offsets[1] == offsets[0])
+        options |= PCRE_NOTEMPTY;
+      else
+        options &= ~PCRE_NOTEMPTY;
+
+      /* For /g, update the start offset, leaving the rest alone */
+
+      if (do_g) start_offset = offsets[1];
+
+      /* For /G, update the pointer and length */
+
       else
         {
-        if (count == -1) fprintf(outfile, "No match\n");
-          else fprintf(outfile, "Error %d\n", count);
+        bptr += offsets[1];
+        len -= offsets[1];
         }
-      }
-    }
+      }  /* End of loop for /g and /G */
+    }    /* End of loop for data lines */
 
   CONTINUE:
+
+#if !defined NOPOSIX
   if (posix || do_posix) regfree(&preg);
+#endif
+
   if (re != NULL) free(re);
   if (extra != NULL) free(extra);
   if (tables != NULL)
index 49f81d31e0691ef878470a89ed18f03b379739da..d9e9b575e01ff81251b5609f195a1821f0a0d5b8 100644 (file)
@@ -2,7 +2,7 @@
 .SH NAME
 pgrep - a grep with Perl-compatible regular expressions.
 .SH SYNOPSIS
-.B pgrep [-chilnsvx] pattern [file] ...
+.B pgrep [-Vchilnsvx] pattern [file] ...
 
 
 .SH DESCRIPTION
@@ -23,6 +23,10 @@ against the pattern.
 
 .SH OPTIONS
 .TP 10
+\fB-V\fR
+Write the version number of the PCRE library being used to the standard error
+stream.
+.TP
 \fB-c\fR
 Do not print individual lines; instead just print a count of the number of
 lines that would otherwise have been printed. If several files are given, a
diff --git a/ext/pcre/pcrelib/pgrep.1.html b/ext/pcre/pcrelib/pgrep.1.html
new file mode 100644 (file)
index 0000000..54efed6
--- /dev/null
@@ -0,0 +1,105 @@
+<HTML>
+<HEAD>
+<TITLE>pgrep specification</TITLE>
+</HEAD>
+<body bgcolor="#FFFFFF" text="#00005A">
+<H1>pgrep specification</H1>
+This HTML document has been generated automatically from the original man page.
+If there is any nonsense in it, please consult the man page in case the
+conversion went wrong.
+<UL>
+<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>
+<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>
+<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>
+<LI><A NAME="TOC4" HREF="#SEC4">OPTIONS</A>
+<LI><A NAME="TOC5" HREF="#SEC5">SEE ALSO</A>
+<LI><A NAME="TOC6" HREF="#SEC6">DIAGNOSTICS</A>
+<LI><A NAME="TOC7" HREF="#SEC7">AUTHOR</A>
+</UL>
+<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>
+<P>
+pgrep - a grep with Perl-compatible regular expressions.
+</P>
+<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>
+<P>
+<B>pgrep [-Vchilnsvx] pattern [file] ...</B>
+</P>
+<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>
+<P>
+<B>pgrep</B> searches files for character patterns, in the same way as other
+grep commands do, but it uses the PCRE regular expression library to support
+patterns that are compatible with the regular expressions of Perl 5. See
+<B>pcre(3)</B> for a full description of syntax and semantics.
+</P>
+<P>
+If no files are specified, <B>pgrep</B> reads the standard input. By default,
+each line that matches the pattern is copied to the standard output, and if
+there is more than one file, the file name is printed before each line of
+output. However, there are options that can change how <B>pgrep</B> behaves.
+</P>
+<P>
+Lines are limited to BUFSIZ characters. BUFSIZ is defined in <B>&#60;stdio.h&#62;</B>.
+The newline character is removed from the end of each line before it is matched
+against the pattern.
+</P>
+<LI><A NAME="SEC4" HREF="#TOC1">OPTIONS</A>
+<P>
+<B>-V</B>
+Write the version number of the PCRE library being used to the standard error
+stream.
+</P>
+<P>
+<B>-c</B>
+Do not print individual lines; instead just print a count of the number of
+lines that would otherwise have been printed. If several files are given, a
+count is printed for each of them.
+</P>
+<P>
+<B>-h</B>
+Suppress printing of filenames when searching multiple files.
+</P>
+<P>
+<B>-i</B>
+Ignore upper/lower case distinctions during comparisons.
+</P>
+<P>
+<B>-l</B>
+Instead of printing lines from the files, just print the names of the files
+containing lines that would have been printed. Each file name is printed
+once, on a separate line.
+</P>
+<P>
+<B>-n</B>
+Precede each line by its line number in the file.
+</P>
+<P>
+<B>-s</B>
+Work silently, that is, display nothing except error messages.
+The exit status indicates whether any matches were found.
+</P>
+<P>
+<B>-v</B>
+Invert the sense of the match, so that lines which do <I>not</I> match the
+pattern are now the ones that are found.
+</P>
+<P>
+<B>-x</B>
+Force the pattern to be anchored (it must start matching at the beginning of
+the line) and in addition, require it to match the entire line. This is
+equivalent to having ^ and $ characters at the start and end of each
+alternative branch in the regular expression.
+</P>
+<LI><A NAME="SEC5" HREF="#TOC1">SEE ALSO</A>
+<P>
+<B>pcre(3)</B>, Perl 5 documentation
+</P>
+<LI><A NAME="SEC6" HREF="#TOC1">DIAGNOSTICS</A>
+<P>
+Exit status is 0 if any matches were found, 1 if no matches were found, and 2
+for syntax errors or inacessible files (even if matches were found).
+</P>
+<LI><A NAME="SEC7" HREF="#TOC1">AUTHOR</A>
+<P>
+Philip Hazel &#60;ph10@cam.ac.uk&#62;
+<BR>
+Copyright (c) 1997-1999 University of Cambridge.
diff --git a/ext/pcre/pcrelib/pgrep.1.txt b/ext/pcre/pcrelib/pgrep.1.txt
new file mode 100644 (file)
index 0000000..bcd08c0
--- /dev/null
@@ -0,0 +1,86 @@
+NAME
+     pgrep - a grep with Perl-compatible regular expressions.
+
+
+
+SYNOPSIS
+     pgrep [-Vchilnsvx] pattern [file] ...
+
+
+
+DESCRIPTION
+     pgrep searches files for character patterns, in the same way
+     as  other  grep  commands  do,  but it uses the PCRE regular
+     expression library to support patterns that  are  compatible
+     with  the  regular  expressions of Perl 5. See pcre(3) for a
+     full description of syntax and semantics.
+
+     If no files are specified, pgrep reads the  standard  input.
+     By  default, each line that matches the pattern is copied to
+     the standard output, and if there is more than one file, the
+     file  name  is  printed before each line of output. However,
+     there are options that can change how pgrep behaves.
+
+     Lines are limited to BUFSIZ characters. BUFSIZ is defined in
+     <stdio.h>.  The newline character is removed from the end of
+     each line before it is matched against the pattern.
+
+
+
+OPTIONS
+     -V        Write the version number of the PCRE library being
+               used to the standard error stream.
+
+     -c        Do not print individual lines; instead just  print
+               a  count  of the number of lines that would other-
+               wise have  been  printed.  If  several  files  are
+               given, a count is printed for each of them.
+
+     -h        Suppress printing of filenames when searching mul-
+               tiple files.
+
+     -i        Ignore upper/lower case distinctions  during  com-
+               parisons.
+
+     -l        Instead of printing lines  from  the  files,  just
+               print the names of the files containing lines that
+               would have been printed. Each file name is printed
+               once, on a separate line.
+
+     -n        Precede each line by its line number in the file.
+
+     -s        Work silently, that  is,  display  nothing  except
+               error messages.  The exit status indicates whether
+               any matches were found.
+
+     -v        Invert the sense of the match, so that lines which
+               do not match the pattern are now the ones that are
+               found.
+
+     -x        Force the pattern to be anchored  (it  must  start
+               matching  at  the  beginning  of  the line) and in
+               addition, require it to  match  the  entire  line.
+               This is equivalent to having ^ and $ characters at
+               the start and end of each  alternative  branch  in
+               the regular expression.
+
+
+
+SEE ALSO
+     pcre(3), Perl 5 documentation
+
+
+
+
+
+DIAGNOSTICS
+     Exit status is 0 if any matches were found, 1 if no  matches
+     were  found,  and  2  for syntax errors or inacessible files
+     (even if matches were found).
+
+
+
+AUTHOR
+     Philip Hazel <ph10@cam.ac.uk>
+     Copyright (c) 1997-1999 University of Cambridge.
+
index b41083605a980c9832baf111366caa821152873e..5bc48ee84af2353c62e211e330ba4ef52593005c 100644 (file)
@@ -74,7 +74,7 @@ while (fgets(buffer, sizeof(buffer), in) != NULL)
   if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0;
   linenumber++;
 
-  match = pcre_exec(pattern, hints, buffer, length, 0, offsets, 99) >= 0;
+  match = pcre_exec(pattern, hints, buffer, length, 0, 0, offsets, 99) >= 0;
   if (match && whole_lines && offsets[1] != length) match = FALSE;
 
   if (match != invert)
@@ -119,7 +119,7 @@ return rc;
 static int
 usage(int rc)
 {
-fprintf(stderr, "Usage: pgrep [-chilnsvx] pattern [file] ...\n");
+fprintf(stderr, "Usage: pgrep [-Vchilnsvx] pattern [file] ...\n");
 return rc;
 }
 
@@ -159,6 +159,11 @@ for (i = 1; i < argc; i++)
       case 's': silent = TRUE; break;
       case 'v': invert = TRUE; break;
       case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break;
+
+      case 'V':
+      fprintf(stderr, "PCRE version %s\n", pcre_version());
+      break;
+
       default:
       fprintf(stderr, "pgrep: unknown option %c\n", s[-1]);
       return usage(2);
index da679eaa800a9f67c54a0e8ef65adc44c6b2453f..3adb63528998426f766de1c3ffd45a33e67ad52a 100644 (file)
     *** Failers 
     abcde\nBar  
 
+/^.*B/
+    **** Failers
+    abc\nB
+     
+/(?s)^.*B/
+    abc\nB
+
+/(?m)^.*B/
+    abc\nB
+     
+/(?ms)^.*B/
+    abc\nB
+
+/(?ms)^B/
+    abc\nB
+
+/(?s)B$/
+    B\n
+
+/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
+    123456654321
+  
+/^\d\d\d\d\d\d\d\d\d\d\d\d/
+    123456654321 
+
+/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
+    123456654321
+  
+/^[abc]{12}/
+    abcabcabcabc
+    
+/^[a-c]{12}/
+    abcabcabcabc
+    
+/^(a|b|c){12}/
+    abcabcabcabc 
+
+/^[abcdefghijklmnopqrstuvwxy0123456789]/
+    n
+    *** Failers 
+    z 
+
+/abcde{0,0}/
+    abcd
+    *** Failers
+    abce  
+
+/ab[cd]{0,0}e/
+    abe
+    *** Failers
+    abcde 
+    
+/ab(c){0,0}d/
+    abd
+    *** Failers
+    abcd   
+
+/a(b*)/
+    a
+    ab
+    abbbb
+    *** Failers
+    bbbbb    
+    
+/ab\d{0}e/
+    abe
+    *** Failers
+    ab1e   
+    
+/"([^\\"]+|\\.)*"/
+    the \"quick\" brown fox
+    \"the \\\"quick\\\" brown fox\" 
+
 / End of test input /
index 39a7560aa7985cb51807e90acd3806cf79733ff9..a1a3cd4e2ccc4413af7185bc7ed3f2a7196dc767 100644 (file)
 
 /(?s:.*X|^B)/D
 
+/\Biss\B/+
+    Mississippi
+
+/\Biss\B/+P
+    Mississippi
+
+/iss/G+
+    Mississippi
+
+/\Biss\B/G+
+    Mississippi
+
+/\Biss\B/g+
+    Mississippi
+    *** Failers
+    Mississippi\A
+
+/(?<=[Ms])iss/g+
+    Mississippi
+
+/(?<=[Ms])iss/G+
+    Mississippi
+
+/^iss/g+
+    ississippi
+    
+/.*iss/g+
+    abciss\nxyzisspqr 
+
+/.i./+g
+    Mississippi
+    Mississippi\A
+    Missouri river
+    Missouri river\A  
+
+/^.is/+g
+    Mississippi
+
+/^ab\n/g+
+    ab\nab\ncd
+
+/^ab\n/mg+
+    ab\nab\ncd
+
+/abc/
+
+/abc|bac/
+
+/(abc|bac)/
+
+/(abc|(c|dc))/
+
+/(abc|(d|de)c)/
+
+/a*/
+
+/a+/
+
+/(baa|a+)/
+
+/a{0,3}/
+
+/baa{3,}/
+
+/"([^\\"]+|\\.)*"/
+
+/(abc|ab[cd])/
+
+/(a|.)/
+
+/a|ba|\w/
+
+/abc(?=pqr)/
+
+/...(?<=abc)/
+
+/abc(?!pqr)/
+
+/ab./
+
+/ab[xyz]/
+
+/abc*/
+
+/ab.c*/
+
+/a.c*/
+
+/.c*/
+
+/ac*/
+
+/(a.c*|b.c*)/
+
+/a.c*|aba/
+
+/.+a/
+
+/(?=abcda)a.*/
+
+/(?=a)a.*/
+
+/a(b)*/
+
+/a\d*/
+
+/ab\d*/
+
+/a(\d)*/
+
+/abcde{0,0}/
+
+/ab\d+/
+
+/a(?(1)b)/
+
+/a(?(1)bag|big)/
+
+/a(?(1)bag|big)*/
+
+/a(?(1)bag|big)+/
+
+/a(?(1)b..|b..)/
+
+/ab\d{0}e/
+
+/a?b?/
+    a
+    b
+    ab
+    \
+    *** Failers
+    \N     
+    
+/|-/
+    abcd
+    -abc
+    \Nab-c
+    *** Failers
+    \Nabc     
+
+/.*?/g+
+  abc
+
 / End of test input /
index 2e686b3d5d3a04c9f6c4bf5add504b0649d0dd9d..0c884d3b7c1b95dfa072916c8a598804cc4a7428 100644 (file)
 /word (?>[a-zA-Z0-9]+ ){0,30}otherword/
     word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
 
+/(?<=\d{3}(?!999))foo/
+    999foo
+    123999foo 
+    *** Failers
+    123abcfoo
+    
+/(?<=(?!...999)\d{3})foo/
+    999foo
+    123999foo 
+    *** Failers
+    123abcfoo
+
+/(?<=\d{3}(?!999)...)foo/
+    123abcfoo
+    123456foo 
+    *** Failers
+    123999foo  
+    
+/(?<=\d{3}...)(?<!999)foo/
+    123abcfoo   
+    123456foo 
+    *** Failers
+    123999foo  
+
+/<a[\s]+href[\s]*=[\s]*          # find <a href=
+ ([\"\'])?                       # find single or double quote
+ (?(1) (.*?)\1 | ([^\s]+))       # if quote found, match up to next matching
+                                 # quote, otherwise match up to next space
+/isx
+    <a href=abcd xyz
+    <a href=\"abcd xyz pqr\" cats
+    <a href=\'abcd xyz pqr\' cats
+
+/<a\s+href\s*=\s*                # find <a href=
+ (["'])?                         # find single or double quote
+ (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
+                                 # quote, otherwise match up to next space
+/isx
+    <a href=abcd xyz
+    <a href=\"abcd xyz pqr\" cats
+    <a href       =       \'abcd xyz pqr\' cats
+
+/<a\s+href(?>\s*)=(?>\s*)        # find <a href=
+ (["'])?                         # find single or double quote
+ (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
+                                 # quote, otherwise match up to next space
+/isx
+    <a href=abcd xyz
+    <a href=\"abcd xyz pqr\" cats
+    <a href       =       \'abcd xyz pqr\' cats
+
 / End of test input /       
index 44e6d5c1a994e4c039ba4e07d4f0da24cdece27b..952317fdc944484299423141a5a3dcc6ff3fecab 100644 (file)
@@ -1,4 +1,4 @@
-PCRE version 2.05 21-Apr-1999
+PCRE version 2.08 31-Aug-1999
 
 /the quick brown fox/
     the quick brown fox
@@ -2768,5 +2768,120 @@ No match
     abcde\nBar  
 No match
 
+/^.*B/
+    **** Failers
+No match
+    abc\nB
+No match
+     
+/(?s)^.*B/
+    abc\nB
+ 0: abc\x0aB
+
+/(?m)^.*B/
+    abc\nB
+ 0: B
+     
+/(?ms)^.*B/
+    abc\nB
+ 0: abc\x0aB
+
+/(?ms)^B/
+    abc\nB
+ 0: B
+
+/(?s)B$/
+    B\n
+ 0: B
+
+/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
+    123456654321
+ 0: 123456654321
+  
+/^\d\d\d\d\d\d\d\d\d\d\d\d/
+    123456654321 
+ 0: 123456654321
+
+/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
+    123456654321
+ 0: 123456654321
+  
+/^[abc]{12}/
+    abcabcabcabc
+ 0: abcabcabcabc
+    
+/^[a-c]{12}/
+    abcabcabcabc
+ 0: abcabcabcabc
+    
+/^(a|b|c){12}/
+    abcabcabcabc 
+ 0: abcabcabcabc
+ 1: c
+
+/^[abcdefghijklmnopqrstuvwxy0123456789]/
+    n
+ 0: n
+    *** Failers 
+No match
+    z 
+No match
+
+/abcde{0,0}/
+    abcd
+ 0: abcd
+    *** Failers
+No match
+    abce  
+No match
+
+/ab[cd]{0,0}e/
+    abe
+ 0: abe
+    *** Failers
+No match
+    abcde 
+No match
+    
+/ab(c){0,0}d/
+    abd
+ 0: abd
+    *** Failers
+No match
+    abcd   
+No match
+
+/a(b*)/
+    a
+ 0: a
+ 1: 
+    ab
+ 0: ab
+ 1: b
+    abbbb
+ 0: abbbb
+ 1: bbbb
+    *** Failers
+ 0: a
+ 1: 
+    bbbbb    
+No match
+    
+/ab\d{0}e/
+    abe
+ 0: abe
+    *** Failers
+No match
+    ab1e   
+No match
+    
+/"([^\\"]+|\\.)*"/
+    the \"quick\" brown fox
+ 0: "quick"
+ 1: quick
+    \"the \\\"quick\\\" brown fox\" 
+ 0: "the \"quick\" brown fox"
+ 1:  brown fox
+
 / End of test input /
 
index 09148ff243dbf8bc21740a95e8e2a5dc030c6be3..5950a913e38df442a1f2811d764bdca1ce6dca0c 100644 (file)
@@ -1,14 +1,16 @@
-PCRE version 2.05 21-Apr-1999
+PCRE version 2.08 31-Aug-1999
 
 /(a)b|/
 Identifying subpattern count = 1
 No options
 No first char
+No req char
 
 /abc/
 Identifying subpattern count = 0
 No options
 First char = 'a'
+Req char = 'c'
     abc
  0: abc
     defabc
@@ -26,6 +28,7 @@ No match
 Identifying subpattern count = 0
 Options: anchored
 No first char
+Req char = 'c'
     abc
  0: abc
     \Aabc
@@ -41,26 +44,31 @@ No match
 Identifying subpattern count = 0
 No options
 First char = 'a'
+Req char = 'c'
 
 /a*bc/
 Identifying subpattern count = 0
 No options
 No first char
+Req char = 'c'
 
 /a{3}bc/
 Identifying subpattern count = 0
 No options
 First char = 'a'
+Req char = 'c'
 
 /(abc|a+z)/
 Identifying subpattern count = 1
 No options
 First char = 'a'
+No req char
 
 /^abc$/
 Identifying subpattern count = 0
 Options: anchored
 No first char
+Req char = 'c'
     abc
  0: abc
     *** Failers
@@ -108,16 +116,19 @@ Failed: unrecognized character after (? at offset 2
 Identifying subpattern count = 0
 No options
 First char at start or follows \n
+Req char = 'b'
 
 /.*?b/
 Identifying subpattern count = 0
 No options
 First char at start or follows \n
+Req char = 'b'
 
 /cat|dog|elephant/
 Identifying subpattern count = 0
 No options
 No first char
+No req char
     this sentence eventually mentions a cat
  0: cat
     this sentences rambles on and on for a while and then reaches elephant
@@ -127,6 +138,7 @@ No first char
 Identifying subpattern count = 0
 No options
 No first char
+No req char
 Starting character set: c d e 
     this sentence eventually mentions a cat
  0: cat
@@ -137,6 +149,7 @@ Starting character set: c d e
 Identifying subpattern count = 0
 Options: caseless
 No first char
+No req char
 Starting character set: C D E c d e 
     this sentence eventually mentions a CAT cat
  0: CAT
@@ -147,12 +160,14 @@ Starting character set: C D E c d e
 Identifying subpattern count = 0
 No options
 No first char
+No req char
 Starting character set: a b c d 
 
 /(a|[^\dZ])/S
 Identifying subpattern count = 1
 No options
 No first char
+No req char
 Starting character set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a 
   \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 
   \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / : ; < = > 
@@ -172,6 +187,7 @@ Starting character set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a
 Identifying subpattern count = 1
 No options
 No first char
+No req char
 Starting character set: \x09 \x0a \x0b \x0c \x0d \x20 a b 
 
 /(ab\2)/
@@ -184,6 +200,7 @@ Failed: nothing to repeat at offset 4
 Identifying subpattern count = 3
 No options
 First char = 'a'
+Req char = 'c'
     abcb
  0: abcb
  1: a
@@ -213,6 +230,7 @@ Matched, but too many substrings
 Identifying subpattern count = 3
 No options
 First char = 'a'
+No req char
     abc
  0: abc
  1: a
@@ -253,6 +271,7 @@ Matched, but too many substrings
 Identifying subpattern count = 0
 Options: dollar_endonly
 First char = 'a'
+Req char = 'c'
     abc
  0: abc
     *** Failers
@@ -269,6 +288,7 @@ Failed: back reference to non-existent subpattern at offset 17
 Identifying subpattern count = 0
 No options
 First char = 't'
+Req char = 'x'
     the quick brown fox
  0: the quick brown fox
     this is a line with the quick brown fox
@@ -278,6 +298,7 @@ First char = 't'
 Identifying subpattern count = 0
 Options: anchored
 No first char
+Req char = 'x'
     the quick brown fox
  0: the quick brown fox
     *** Failers
@@ -292,6 +313,7 @@ Failed: unrecognized character after (? at offset 4
 Identifying subpattern count = 0
 No options
 No first char
+No req char
     abcdef
  0: abc
     abcdef\B
@@ -301,6 +323,7 @@ No first char
 Identifying subpattern count = 3
 No options
 First char at start or follows \n
+No req char
     defabc
  0: defabc
  1: abc
@@ -376,6 +399,7 @@ Failed: missing terminating ] for character class at offset 4
 Identifying subpattern count = 0
 No options
 No first char
+No req char
     co-processors, and for 
  0: -pr
     
@@ -383,6 +407,7 @@ No first char
 Identifying subpattern count = 0
 No options
 First char = '<'
+Req char = '>'
     abc<def>ghi<klm>nop
  0: <def>ghi<klm>
 
@@ -390,6 +415,7 @@ First char = '<'
 Identifying subpattern count = 0
 No options
 First char = '<'
+Req char = '>'
     abc<def>ghi<klm>nop
  0: <def>
 
@@ -397,6 +423,7 @@ First char = '<'
 Identifying subpattern count = 0
 Options: ungreedy
 First char = '<'
+Req char = '>'
     abc<def>ghi<klm>nop
  0: <def>
     
@@ -404,6 +431,7 @@ First char = '<'
 Identifying subpattern count = 0
 Options: ungreedy
 First char = '<'
+Req char = '>'
     abc<def>ghi<klm>nop
  0: <def>
 
@@ -411,6 +439,7 @@ First char = '<'
 Identifying subpattern count = 0
 Options: ungreedy
 First char = '<'
+Req char = '>'
     abc<def>ghi<klm>nop
  0: <def>ghi<klm>
     
@@ -418,6 +447,7 @@ First char = '<'
 Identifying subpattern count = 0
 Options: ungreedy
 First char = '='
+Req char = '='
     abc========def
  0: ===
     
@@ -425,6 +455,7 @@ First char = '='
 Identifying subpattern count = 0
 Options: ungreedy
 First char = '='
+Req char = '='
     abc========def
  0: ========
     
@@ -432,6 +463,7 @@ First char = '='
 Identifying subpattern count = 0
 No options
 First char = 'f'
+Req char = 'o'
     foo
  0: foo
     catfoo 
@@ -456,54 +488,65 @@ Failed: lookbehind assertion is not fixed length at offset 12
 Identifying subpattern count = 0
 Options: caseless
 First char = 'a'
+Req char = 'c'
 
 /(a|(?m)a)/
 Identifying subpattern count = 1
 No options
 First char = 'a'
+No req char
 
 /(?i)^1234/
 Identifying subpattern count = 0
 Options: anchored caseless
 No first char
+Req char = '4'
 
 /(^b|(?i)^d)/
 Identifying subpattern count = 1
 Options: anchored
+Case state changes
 No first char
+No req char
 
 /(?s).*/
 Identifying subpattern count = 0
 Options: anchored dotall
 No first char
+No req char
 
 /[abcd]/S
 Identifying subpattern count = 0
 No options
 No first char
+No req char
 Starting character set: a b c d 
 
 /(?i)[abcd]/S
 Identifying subpattern count = 0
 Options: caseless
 No first char
+No req char
 Starting character set: A B C D a b c d 
 
 /(?m)[xy]|(b|c)/S
 Identifying subpattern count = 1
 Options: multiline
 No first char
+No req char
 Starting character set: b c x y 
 
 /(^a|^b)/m
 Identifying subpattern count = 1
 Options: multiline
 First char at start or follows \n
+No req char
 
 /(?i)(^a|^b)/m
 Identifying subpattern count = 1
 Options: caseless multiline
 First char at start or follows \n
+No req char
 
 /(a)(?(1)a|b|c)/
 Failed: conditional group contains more than two branches at offset 13
@@ -527,11 +570,14 @@ Failed: unrecognized character after (?< at offset 2
 Identifying subpattern count = 1
 No options
 First char = 'b'
+Req char = 'h'
 
 /((?i)blah)\s+\1/
 Identifying subpattern count = 1
 No options
+Case state changes
 No first char
+Req char = 'h'
 
 /((?i)b)/DS
 ------------------------------------------------------------------
@@ -546,19 +592,24 @@ No first char
 ------------------------------------------------------------------
 Identifying subpattern count = 1
 No options
+Case state changes
 No first char
+Req char = 'b'
 Starting character set: B b 
 
 /(a*b|(?i:c*(?-i)d))/S
 Identifying subpattern count = 1
 No options
+Case state changes
 No first char
+No req char
 Starting character set: C a b c d 
 
 /a$/
 Identifying subpattern count = 0
 No options
 First char = 'a'
+No req char
     a
  0: a
     a\n
@@ -574,6 +625,7 @@ No match
 Identifying subpattern count = 0
 Options: multiline
 First char = 'a'
+No req char
     a
  0: a
     a\n
@@ -589,16 +641,19 @@ No match
 Identifying subpattern count = 0
 Options: anchored multiline
 No first char
+Req char = 'c'
 
 /^abc/m 
 Identifying subpattern count = 0
 Options: multiline
 First char at start or follows \n
+Req char = 'c'
 
 /^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
 Identifying subpattern count = 5
 Options: anchored
 No first char
+Req char = 'a'
   aaaaabbbbbcccccdef
  0: aaaaabbbbbcccccdef
  1: aaaaabbbbbcccccdef
@@ -611,29 +666,34 @@ No first char
 Identifying subpattern count = 0
 No options
 No first char
+No req char
 Starting character set: a b 
 
 /(?<!foo)(alpha|omega)/S
 Identifying subpattern count = 1
 No options
 No first char
+Req char = 'a'
 Starting character set: a o 
 
 /(?!alphabet)[ab]/S
 Identifying subpattern count = 0
 No options
 No first char
+No req char
 Starting character set: a b 
 
 /(?<=foo\n)^bar/m
 Identifying subpattern count = 0
 Options: multiline
 First char at start or follows \n
+Req char = 'r'
 
 /(?>^abc)/m
 Identifying subpattern count = 0
 Options: multiline
 First char at start or follows \n
+Req char = 'c'
     abc
  0: abc
     def\nabc
@@ -656,11 +716,13 @@ Failed: lookbehind assertion is not fixed length at offset 13
 Identifying subpattern count = 0
 No options
 First char = 'T'
+Req char = 's'
 
 /(?<=bullock|donkey)-cart/
 Identifying subpattern count = 0
 No options
 First char = '-'
+Req char = 't'
     the bullock-cart
  0: -cart
     a donkey-cart race
@@ -675,12 +737,15 @@ No match
 /(?<=ab(?i)x|y|z)/
 Identifying subpattern count = 0
 No options
+Case state changes
 No first char
+No req char
 
 /(?>.*)(?<=(abcd)|(xyz))/
 Identifying subpattern count = 2
 No options
 First char at start or follows \n
+No req char
     alphabetabcd
  0: alphabetabcd
  1: abcd
@@ -692,7 +757,9 @@ First char at start or follows \n
 /(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/
 Identifying subpattern count = 0
 No options
+Case state changes
 First char = 'Z'
+Req char = 'Z'
     abxyZZ
  0: ZZ
     abXyZZ
@@ -720,6 +787,7 @@ No match
 Identifying subpattern count = 1
 No options
 First char = 'b'
+Req char = 'r'
     bar
  0: bar
     foobbar 
@@ -733,11 +801,13 @@ No match
 Identifying subpattern count = 0
 No options
 First char = 'T'
+Req char = 't'
 
 /^(a)?(?(1)a|b)+$/
 Identifying subpattern count = 1
 Options: anchored
 No first char
+No req char
     *** Failers
 No match
     a 
@@ -747,11 +817,13 @@ No match
 Identifying subpattern count = 0
 No options
 First char = 'T'
+Req char = 'g'
 
 /^(a\1?){4}$/
 Identifying subpattern count = 1
 Options: anchored
 No first char
+Req char = 'a'
     aaaaaa
  0: aaaaaa
  1: aa
@@ -760,6 +832,7 @@ No first char
 Identifying subpattern count = 0
 No options
 First char = 'T'
+Req char = '5'
 
 /a[b-a]/
 Failed: range out of order in character class at offset 4
@@ -873,6 +946,7 @@ Failed: \ at end of pattern at offset 4
 Identifying subpattern count = 2
 No options
 First char = 'a'
+Req char = 'd'
     abcd
  0: abcd
  1: a
@@ -892,6 +966,7 @@ copy substring 5 failed -7
 Identifying subpattern count = 1
 No options
 No first char
+No req char
     abcdefghijklmnopqrstuvwxyz
  0: abcdefghijklmnopqrst
  1: abcdefghijklmnopqrst
@@ -908,6 +983,7 @@ copy substring 1 failed -6
 Identifying subpattern count = 1
 No options
 No first char
+No req char
     abcdefghijklmnopqrstuvwxyz
  0: abcdefghijklmno
  1: abcdefghijklmno
@@ -921,6 +997,7 @@ No first char
 Identifying subpattern count = 1
 No options
 No first char
+No req char
     abcdefghijklmnopqrstuvwxyz
  0: abcdefghijklmnop
  1: abcdefghijklmnop
@@ -936,6 +1013,7 @@ copy substring 1 failed -6
 Identifying subpattern count = 3
 Options: anchored
 No first char
+Req char = 'f'
     adef\G1\G2\G3\G4\L 
  0: adef
  1: a
@@ -973,6 +1051,7 @@ get substring 4 failed -7
 Identifying subpattern count = 0
 Options: anchored
 No first char
+Req char = 'f'
     abc\00def\L\C0 
  0: abc\x00def
  0C abc (7)
@@ -981,10 +1060,11 @@ No first char
 /word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ 
 )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ 
 )?)?)?)?)?)?)?)?)?otherword/M
-Memory allocation request: 441 (code space 428)
+Memory allocation (code space): 428
 Identifying subpattern count = 8
 No options
 First char = 'w'
+Req char = 'd'
 
 /.*X/D
 ------------------------------------------------------------------
@@ -997,6 +1077,7 @@ First char = 'w'
 Identifying subpattern count = 0
 No options
 First char at start or follows \n
+Req char = 'X'
 
 /.*X/Ds
 ------------------------------------------------------------------
@@ -1009,6 +1090,7 @@ First char at start or follows \n
 Identifying subpattern count = 0
 Options: anchored dotall
 No first char
+Req char = 'X'
 
 /(.*X|^B)/D
 ------------------------------------------------------------------
@@ -1026,6 +1108,7 @@ No first char
 Identifying subpattern count = 1
 No options
 First char at start or follows \n
+No req char
 
 /(.*X|^B)/Ds
 ------------------------------------------------------------------
@@ -1043,6 +1126,7 @@ First char at start or follows \n
 Identifying subpattern count = 1
 Options: anchored dotall
 No first char
+No req char
     
 /(?s)(.*X|^B)/D
 ------------------------------------------------------------------
@@ -1060,6 +1144,7 @@ No first char
 Identifying subpattern count = 1
 Options: anchored dotall
 No first char
+No req char
 
 /(?s:.*X|^B)/D
 ------------------------------------------------------------------
@@ -1080,9 +1165,460 @@ No first char
 Identifying subpattern count = 0
 No options
 First char at start or follows \n
+No req char
+
+/\Biss\B/+
+Identifying subpattern count = 0
+No options
+First char = 'i'
+Req char = 's'
+    Mississippi
+ 0: iss
+ 0+ issippi
+
+/\Biss\B/+P
+    Mississippi
+ 0: iss
+ 0+ issippi
+
+/iss/G+
+Identifying subpattern count = 0
+No options
+First char = 'i'
+Req char = 's'
+    Mississippi
+ 0: iss
+ 0+ issippi
+ 0: iss
+ 0+ ippi
+
+/\Biss\B/G+
+Identifying subpattern count = 0
+No options
+First char = 'i'
+Req char = 's'
+    Mississippi
+ 0: iss
+ 0+ issippi
+
+/\Biss\B/g+
+Identifying subpattern count = 0
+No options
+First char = 'i'
+Req char = 's'
+    Mississippi
+ 0: iss
+ 0+ issippi
+ 0: iss
+ 0+ ippi
+    *** Failers
+No match
+    Mississippi\A
+No match
+
+/(?<=[Ms])iss/g+
+Identifying subpattern count = 0
+No options
+First char = 'i'
+Req char = 's'
+    Mississippi
+ 0: iss
+ 0+ issippi
+ 0: iss
+ 0+ ippi
+
+/(?<=[Ms])iss/G+
+Identifying subpattern count = 0
+No options
+First char = 'i'
+Req char = 's'
+    Mississippi
+ 0: iss
+ 0+ issippi
+
+/^iss/g+
+Identifying subpattern count = 0
+Options: anchored
+No first char
+Req char = 's'
+    ississippi
+ 0: iss
+ 0+ issippi
+    
+/.*iss/g+
+Identifying subpattern count = 0
+No options
+First char at start or follows \n
+Req char = 's'
+    abciss\nxyzisspqr 
+ 0: abciss
+ 0+ \x0axyzisspqr
+ 0: xyziss
+ 0+ pqr
+
+/.i./+g
+Identifying subpattern count = 0
+No options
+No first char
+Req char = 'i'
+    Mississippi
+ 0: Mis
+ 0+ sissippi
+ 0: sis
+ 0+ sippi
+ 0: sip
+ 0+ pi
+    Mississippi\A
+ 0: Mis
+ 0+ sissippi
+ 0: sis
+ 0+ sippi
+ 0: sip
+ 0+ pi
+    Missouri river
+ 0: Mis
+ 0+ souri river
+ 0: ri 
+ 0+ river
+ 0: riv
+ 0+ er
+    Missouri river\A  
+ 0: Mis
+ 0+ souri river
+
+/^.is/+g
+Identifying subpattern count = 0
+Options: anchored
+No first char
+Req char = 's'
+    Mississippi
+ 0: Mis
+ 0+ sissippi
+
+/^ab\n/g+
+Identifying subpattern count = 0
+Options: anchored
+No first char
+Req char = 10
+    ab\nab\ncd
+ 0: ab\x0a
+ 0+ ab\x0acd
+
+/^ab\n/mg+
+Identifying subpattern count = 0
+Options: multiline
+First char at start or follows \n
+Req char = 10
+    ab\nab\ncd
+ 0: ab\x0a
+ 0+ ab\x0acd
+ 0: ab\x0a
+ 0+ cd
+
+/abc/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'c'
+
+/abc|bac/
+Identifying subpattern count = 0
+No options
+No first char
+Req char = 'c'
+
+/(abc|bac)/
+Identifying subpattern count = 1
+No options
+No first char
+Req char = 'c'
+
+/(abc|(c|dc))/
+Identifying subpattern count = 2
+No options
+No first char
+Req char = 'c'
+
+/(abc|(d|de)c)/
+Identifying subpattern count = 2
+No options
+No first char
+Req char = 'c'
+
+/a*/
+Identifying subpattern count = 0
+No options
+No first char
+No req char
+
+/a+/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/(baa|a+)/
+Identifying subpattern count = 1
+No options
+No first char
+Req char = 'a'
+
+/a{0,3}/
+Identifying subpattern count = 0
+No options
+No first char
+No req char
+
+/baa{3,}/
+Identifying subpattern count = 0
+No options
+First char = 'b'
+Req char = 'a'
+
+/"([^\\"]+|\\.)*"/
+Identifying subpattern count = 1
+No options
+First char = '"'
+Req char = '"'
+
+/(abc|ab[cd])/
+Identifying subpattern count = 1
+No options
+First char = 'a'
+No req char
+
+/(a|.)/
+Identifying subpattern count = 1
+No options
+No first char
+No req char
+
+/a|ba|\w/
+Identifying subpattern count = 0
+No options
+No first char
+No req char
+
+/abc(?=pqr)/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'r'
+
+/...(?<=abc)/
+Identifying subpattern count = 0
+No options
+No first char
+No req char
+
+/abc(?!pqr)/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'c'
+
+/ab./
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'b'
+
+/ab[xyz]/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'b'
+
+/abc*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'b'
+
+/ab.c*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'b'
+
+/a.c*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/.c*/
+Identifying subpattern count = 0
+No options
+No first char
+No req char
+
+/ac*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/(a.c*|b.c*)/
+Identifying subpattern count = 1
+No options
+No first char
+No req char
+
+/a.c*|aba/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/.+a/
+Identifying subpattern count = 0
+No options
+No first char
+Req char = 'a'
+
+/(?=abcda)a.*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/(?=a)a.*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/a(b)*/
+Identifying subpattern count = 1
+No options
+First char = 'a'
+No req char
+
+/a\d*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/ab\d*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'b'
+
+/a(\d)*/
+Identifying subpattern count = 1
+No options
+First char = 'a'
+No req char
+
+/abcde{0,0}/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'd'
+
+/ab\d+/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'b'
+
+/a(?(1)b)/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/a(?(1)bag|big)/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'g'
+
+/a(?(1)bag|big)*/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+No req char
+
+/a(?(1)bag|big)+/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'g'
+
+/a(?(1)b..|b..)/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'b'
+
+/ab\d{0}e/
+Identifying subpattern count = 0
+No options
+First char = 'a'
+Req char = 'e'
+
+/a?b?/
+Identifying subpattern count = 0
+No options
+No first char
+No req char
+    a
+ 0: a
+    b
+ 0: b
+    ab
+ 0: ab
+    \
+ 0: 
+    *** Failers
+ 0: 
+    \N     
+No match
+    
+/|-/
+Identifying subpattern count = 0
+No options
+No first char
+No req char
+    abcd
+ 0: 
+    -abc
+ 0: 
+    \Nab-c
+ 0: -
+    *** Failers
+ 0: 
+    \Nabc     
+No match
+
+/.*?/g+
+Identifying subpattern count = 0
+No options
+First char at start or follows \n
+No req char
+  abc
+ 0: 
+ 0+ abc
+ 0: a
+ 0+ bc
+ 0: 
+ 0+ bc
+ 0: b
+ 0+ c
+ 0: 
+ 0+ c
+ 0: c
+ 0+ 
+ 0: 
+ 0+ 
 
 / End of test input /
 Identifying subpattern count = 0
 No options
 First char = ' '
+Req char = ' '
 
index 6d597cdb39162380fcb01b8a504da3f6eadd87fd..d9976598f216b34320419bf25f5449a2da9fe8a9 100644 (file)
@@ -1,4 +1,4 @@
-PCRE version 2.05 21-Apr-1999
+PCRE version 2.08 31-Aug-1999
 
 /(?<!bar)foo/
     foo
@@ -2828,5 +2828,102 @@ No match
     word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
 No match
 
+/(?<=\d{3}(?!999))foo/
+    999foo
+ 0: foo
+    123999foo 
+ 0: foo
+    *** Failers
+No match
+    123abcfoo
+No match
+    
+/(?<=(?!...999)\d{3})foo/
+    999foo
+ 0: foo
+    123999foo 
+ 0: foo
+    *** Failers
+No match
+    123abcfoo
+No match
+
+/(?<=\d{3}(?!999)...)foo/
+    123abcfoo
+ 0: foo
+    123456foo 
+ 0: foo
+    *** Failers
+No match
+    123999foo  
+No match
+    
+/(?<=\d{3}...)(?<!999)foo/
+    123abcfoo   
+ 0: foo
+    123456foo 
+ 0: foo
+    *** Failers
+No match
+    123999foo  
+No match
+
+/<a[\s]+href[\s]*=[\s]*          # find <a href=
+ ([\"\'])?                       # find single or double quote
+ (?(1) (.*?)\1 | ([^\s]+))       # if quote found, match up to next matching
+                                 # quote, otherwise match up to next space
+/isx
+    <a href=abcd xyz
+ 0: <a href=abcd
+ 1: <unset>
+ 2: <unset>
+ 3: abcd
+    <a href=\"abcd xyz pqr\" cats
+ 0: <a href="abcd xyz pqr"
+ 1: "
+ 2: abcd xyz pqr
+    <a href=\'abcd xyz pqr\' cats
+ 0: <a href='abcd xyz pqr'
+ 1: '
+ 2: abcd xyz pqr
+
+/<a\s+href\s*=\s*                # find <a href=
+ (["'])?                         # find single or double quote
+ (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
+                                 # quote, otherwise match up to next space
+/isx
+    <a href=abcd xyz
+ 0: <a href=abcd
+ 1: <unset>
+ 2: <unset>
+ 3: abcd
+    <a href=\"abcd xyz pqr\" cats
+ 0: <a href="abcd xyz pqr"
+ 1: "
+ 2: abcd xyz pqr
+    <a href       =       \'abcd xyz pqr\' cats
+ 0: <a href       =       'abcd xyz pqr'
+ 1: '
+ 2: abcd xyz pqr
+
+/<a\s+href(?>\s*)=(?>\s*)        # find <a href=
+ (["'])?                         # find single or double quote
+ (?(1) (.*?)\1 | (\S+))          # if quote found, match up to next matching
+                                 # quote, otherwise match up to next space
+/isx
+    <a href=abcd xyz
+ 0: <a href=abcd
+ 1: <unset>
+ 2: <unset>
+ 3: abcd
+    <a href=\"abcd xyz pqr\" cats
+ 0: <a href="abcd xyz pqr"
+ 1: "
+ 2: abcd xyz pqr
+    <a href       =       \'abcd xyz pqr\' cats
+ 0: <a href       =       'abcd xyz pqr'
+ 1: '
+ 2: abcd xyz pqr
+
 / End of test input /       
 
index 0e156c497f559ae7bf878d7d9f9ea25fa6b7741a..c8af6cf5c3c4786947687f1ec08586f82efb9e6b 100644 (file)
@@ -1,4 +1,4 @@
-PCRE version 2.05 21-Apr-1999
+PCRE version 2.08 31-Aug-1999
 
 /^[\w]+/
     *** Failers
@@ -84,6 +84,7 @@ No match
 Identifying subpattern count = 0
 No options
 No first char
+No req char
 Starting character set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
   Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
 
@@ -91,6 +92,7 @@ Starting character set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P
 Identifying subpattern count = 0
 No options
 No first char
+No req char
 Starting character set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
   Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
   À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å 
index 5b136428d484d845d3d614056f9ae3c7c692bfdd..d80c174ae3dfb14bc3f7d70edfa8d14040a3811b 100644 (file)
 
 /* $Id$ */
 
+/*
+       TODO:
+       - Allow user to set PCRE_NOTEMPTY, PCRE_ANCHORED at execution time
+       - Have an option for preg_split() to not return empty strings
+*/
+
 #include "php.h"
 #include "php_globals.h"
+#include "php_pcre.h"
 
-#if HAVE_PCRE
+#if HAVE_PCRE || HAVE_BUNDLED_PCRE
 
-#include "php_pcre.h"
 #include "ext/standard/php3_string.h"
 
 #define PREG_PATTERN_ORDER     0
@@ -307,13 +313,13 @@ static void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global)
        int                             *offsets;                       /* Array of subpattern offsets */
        int                              num_subpats;           /* Number of captured subpatterns */
        int                              size_offsets;          /* Size of the offsets array */
+       int                              start_offset;          /* Where the new search starts */
        int                              matched;                       /* Has anything matched */
        int                              i;
        int                              subpats_order_val = 0; /* Integer value of subpats_order */
+       int                              g_notempty = 0;        /* If the match should not be empty */
        const char         **stringlist;                /* Used to hold list of subpatterns */
-       char                    *match,                         /* The current match */
-                                       *piece,                         /* The current piece of subject */
-                                       *subject_end;           /* Points to the end of the subject */
+       char                    *match;                         /* The current match */
        
        
        /* Get function parameters and do error-checking. */
@@ -389,17 +395,15 @@ static void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global)
        }
 
        /* Start from the beginning of the string */
-       piece = subject->value.str.val;
-       subject_end = piece + subject->value.str.len;
+       start_offset = 0;
        match = NULL;
        matched = 0;
        
        do {
                /* Execute the regular expression. */
-               count = pcre_exec(re, extra, piece,
-                                                 subject_end-piece, subject->value.str.val,
-                                                 (piece==subject->value.str.val ? exoptions : exoptions|PCRE_NOTBOL),
-                                                 offsets, size_offsets, (piece == match));
+               count = pcre_exec(re, extra, subject->value.str.val,
+                                                 subject->value.str.len, start_offset,
+                                                 exoptions|g_notempty, offsets, size_offsets);
 
                /* Check for too many substrings condition. */  
                if (count == 0) {
@@ -410,12 +414,13 @@ static void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global)
                /* If something has matched */
                if (count >= 0) {
                        matched++;
-                       match = piece + offsets[0];
+                       match = subject->value.str.val + offsets[0];
 
                        /* If subpatters array has been passed, fill it in with values. */
                        if (subpats != NULL) {
                                /* Try to get the list of substrings and display a warning if failed. */
-                               if (pcre_get_substring_list(piece, offsets, count, &stringlist) < 0) {
+                               if (pcre_get_substring_list(subject->value.str.val,
+                                                                                       offsets, count, &stringlist) < 0) {
                                        efree(offsets);
                                        efree(re);
                                        zend_error(E_WARNING, "Get subpatterns list failed");
@@ -452,12 +457,29 @@ static void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global)
                                }
 
                                php_pcre_free((void *) stringlist);
-                               
-                               /* Advance to the position right after the last full match */
-                               piece += offsets[1];
                        }
                }
-       } while (global && count >= 0);
+               else { /* Failed to match */
+                       /* If we previously set PCRE_NOTEMPTY after a null match,
+                          this is not necessarily the end. We need to advance
+                          the start offset, and continue. Fudge the offset values
+                          to achieve this, unless we're already at the end of the string. */
+                       if (g_notempty != 0 && start_offset < subject->value.str.len) {
+                               offsets[0] = start_offset;
+                               offsets[1] = start_offset + 1;
+                       } else
+                               break;
+               }
+               
+               /* If we have matched an empty string, 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. */
+               g_notempty = (offsets[1] == offsets[0])? PCRE_NOTEMPTY : 0;
+               
+               /* Advance to the position right after the last full match */
+               start_offset = offsets[1];
+       } while (global);
 
        /* Add the match sets to the output array and clean up */
        if (global && subpats_order_val == PREG_PATTERN_ORDER) {
@@ -593,13 +615,14 @@ char *_php_pcre_replace(char *regex, char *subject, char *replace)
        int                              match_len;                     /* Length of the current match */
        int                              backref;                       /* Backreference number */
        int                              eval;                          /* If the replacement string should be eval'ed */
+       int                              start_offset;          /* Where the new search starts */
+       int                              g_notempty = 0;        /* If the match should not be empty */
        char                    *result,                        /* Result of replacement */
                                        *new_buf,                       /* Temporary buffer for re-allocation */
                                        *walkbuf,                       /* Location of current replacement in the result */
                                        *walk,                          /* Used to walk the replacement string */
                                        *match,                         /* The current match */
                                        *piece,                         /* The current piece of subject */
-                                       *subject_end,           /* Points to the end of the subject */
                                        *eval_result;           /* Result of eval */
 
        /* Compile regex or get it from cache. */
@@ -625,16 +648,13 @@ char *_php_pcre_replace(char *regex, char *subject, char *replace)
        /* Initialize */
        match = NULL;
        result[0] = '\0';
-       piece = subject;
-       subject_end = subject + subject_len;
+       start_offset = 0;
        eval = preg_options & PREG_REPLACE_EVAL;
        
-       while (count >= 0) {
+       while (1) {
                /* Execute the regular expression. */
-               count = pcre_exec(re, extra, piece,
-                                                       subject_end-piece, subject,
-                                                       (piece==subject ? exoptions : exoptions|PCRE_NOTBOL),
-                                                       offsets, size_offsets, (piece == match));
+               count = pcre_exec(re, extra, subject, subject_len, start_offset,
+                                                 exoptions|g_notempty, offsets, size_offsets);
                
                /* Check for too many substrings condition. */
                if (count == 0) {
@@ -642,11 +662,13 @@ char *_php_pcre_replace(char *regex, char *subject, char *replace)
                        count = size_offsets/3;
                }
 
+               piece = &subject[start_offset];
+
                if (count > 0) {
-                       /* Set the match location in piece */
-                       match = piece + offsets[0];
+                       /* Set the match location in subject */
+                       match = subject + offsets[0];
 
-                       new_len = strlen(result) + offsets[0]; /* part before the match */
+                       new_len = strlen(result) + offsets[0] - start_offset; /* part before the match */
                        
                        /* If evaluating, do it and add the return string's length */
                        if (eval) {
@@ -679,7 +701,7 @@ char *_php_pcre_replace(char *regex, char *subject, char *replace)
                        strncat(result, piece, match-piece);
 
                        /* copy replacement and backrefs */
-                       walkbuf = &result[result_len + offsets[0]];
+                       walkbuf = &result[result_len + offsets[0] - start_offset];
                        
                        /* If evaluating, copy result to the buffer and clean up */
                        if (eval) {
@@ -702,21 +724,39 @@ char *_php_pcre_replace(char *regex, char *subject, char *replace)
                                                *walkbuf++ = *walk++;
                        }
                        *walkbuf = '\0';
-
-                       /* Advance to the next piece */
-                       piece += offsets[1];
-               } else {
-                       new_len = strlen(result) + subject_end-piece;
-                       if (new_len + 1 > alloc_len) {
-                               alloc_len = new_len + 1; /* now we know exactly how long it is */
-                               new_buf = emalloc(alloc_len * sizeof(char));
-                               strcpy(new_buf, result);
-                               efree(result);
-                               result = new_buf;
+               } else { /* Failed to match */
+                       /* If we previously set PCRE_NOTEMPTY after a null match,
+                          this is not necessarily the end. We need to advance
+                          the start offset, and continue. Fudge the offset values
+                          to achieve this, unless we're already at the end of the string. */
+                       if (g_notempty != 0 && start_offset < subject_len) {
+                               offsets[0] = start_offset;
+                               offsets[1] = start_offset + 1;
+                               strncat(result, piece, 1);
+                       }
+                       else {
+                               new_len = strlen(result) + subject_len - start_offset;
+                               if (new_len + 1 > alloc_len) {
+                                       alloc_len = new_len + 1; /* now we know exactly how long it is */
+                                       new_buf = emalloc(alloc_len * sizeof(char));
+                                       strcpy(new_buf, result);
+                                       efree(result);
+                                       result = new_buf;
+                               }
+                               /* stick that last bit of string on our output */
+                               strcat(result, piece);
+                               break;
                        }
-                       /* stick that last bit of string on our output */
-                       strcat(result, piece);
                }
+                       
+               /* If we have matched an empty string, 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. */
+               g_notempty = (offsets[1] == offsets[0])? PCRE_NOTEMPTY : 0;
+               
+               /* Advance to the next piece */
+               start_offset = offsets[1];
        }
        
        efree(offsets);
@@ -862,9 +902,10 @@ PHP_FUNCTION(preg_split)
        int                              argc;                          /* Argument count */
        int                              limit_val;                     /* Integer value of limit */
        int                              count = 0;                     /* Count of matched subpatterns */
+       int                              start_offset;          /* Where the new search starts */
+       int                              g_notempty = 0;        /* If the match should not be empty */
        char                    *match,                         /* The current match */
-                                       *piece,                         /* The current piece of subject */
-                                       *subject_end;           /* Points to the end of subject string */
+                                       *last_match;            /* Location of last match */
 
        /* Get function parameters and do error checking */     
        argc = ARG_COUNT(ht);
@@ -896,45 +937,60 @@ PHP_FUNCTION(preg_split)
        offsets = (int *)emalloc(size_offsets * sizeof(int));
        
        /* Start at the beginning of the string */
-       piece = subject->value.str.val;
-       subject_end = piece + subject->value.str.len;
+       start_offset = 0;
+       last_match = subject->value.str.val;
        match = NULL;
        
        /* Get next piece if no limit or limit not yet reached and something matched*/
-       while ((limit_val == -1 || limit_val > 1) && count >= 0) {
-               count = pcre_exec(re, extra, piece,
-                                                 subject_end-piece, subject->value.str.val,
-                                                 (piece==subject->value.str.val ? exoptions : exoptions|PCRE_NOTBOL),
-                                                 offsets, size_offsets, (piece==match));
+       while ((limit_val == -1 || limit_val > 1)) {
+               count = pcre_exec(re, extra, subject->value.str.val,
+                                                 subject->value.str.len, start_offset,
+                                                 exoptions|g_notempty, offsets, size_offsets);
 
                /* Check for too many substrings condition. */
                if (count == 0) {
                        zend_error(E_NOTICE, "Matched, but too many substrings\n");
                        count = size_offsets/3;
                }
-
+                               
                /* If something matched */
                if (count > 0) {
-                       match = piece + offsets[0];
-                       
+                       match = subject->value.str.val + offsets[0];
+               
                        /* Add the piece to the return value */
-                       add_next_index_stringl(return_value,
-                                                                 piece,
-                                                                 offsets[0], 1);
+                       add_next_index_stringl(return_value, last_match,
+                                                                  &subject->value.str.val[offsets[0]]-last_match, 1);
                        
-                       /* Advance to next position */
-                       piece += offsets[1];
+                       last_match = &subject->value.str.val[offsets[1]];
                        
                        /* One less left to do */
                        if (limit_val != -1)
                                limit_val--;
+               } else { /* Failed to match */
+                       /* If we previously set PCRE_NOTEMPTY after a null match,
+                          this is not necessarily the end. We need to advance
+                          the start offset, and continue. Fudge the offset values
+                          to achieve this, unless we're already at the end of the string. */
+                       if (g_notempty != 0 && start_offset < subject->value.str.len) {
+                               offsets[0] = start_offset;
+                               offsets[1] = start_offset + 1;
+                       } else
+                               break;
                }
+
+               /* If we have matched an empty string, 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. */
+               g_notempty = (offsets[1] == offsets[0])? PCRE_NOTEMPTY : 0;
+               
+               /* Advance to the position right after the last full match */
+               start_offset = offsets[1];
        }
        
        /* Add the last piece to the return value */
-       add_next_index_stringl(return_value,
-                                                  piece,
-                                                  subject_end-piece, 1);
+       add_next_index_string(return_value,
+                                                 &subject->value.str.val[start_offset], 1);
        
        /* Clean up */
        efree(offsets);
@@ -1064,8 +1120,8 @@ PHP_FUNCTION(preg_grep)
                
                /* Perform the match */
                count = pcre_exec(re, extra, entry->value.str.val,
-                                                 entry->value.str.len, entry->value.str.val,
-                                                 0, offsets, size_offsets, 0);
+                                                 entry->value.str.len, 0,
+                                                 0, offsets, size_offsets);
 
                /* Check for too many substrings condition. */
                if (count == 0) {
@@ -1119,15 +1175,19 @@ function_entry pcre_functions[] = {
 };
 
 zend_module_entry pcre_module_entry = {
-   "PCRE", pcre_functions, PHP_MINIT(pcre), PHP_MSHUTDOWN(pcre),
-                  PHP_RINIT(pcre), NULL,
-                  PHP_MINFO(pcre), STANDARD_MODULE_PROPERTIES
+   "PCRE", pcre_functions,
+                  PHP_MINIT(pcre),
+                  PHP_MSHUTDOWN(pcre),
+                  PHP_RINIT(pcre),
+                  NULL,
+                  PHP_MINFO(pcre),
+                  STANDARD_MODULE_PROPERTIES
 };
 
 /* }}} */
 
 
-#endif /* HAVE_PCRE */
+#endif /* HAVE_PCRE || HAVE_BUNDLED_PCRE */
 
 /*
  * Local variables:
index 9ddd1f17551dfea74a5875e01cf2faf0f9ff1a9a..4809b32a2c5b00209509e281b7fd4548a63919da 100644 (file)
 #ifndef _PHP_PCRE_H
 #define _PHP_PCRE_H
 
-#if HAVE_PCRE
+#if HAVE_PCRE || HAVE_BUNDLED_PCRE
 
+#if HAVE_BUNDLED_PCRE
 #include "pcrelib/pcre.h"
+#else
+#include "pcre.h"
+#endif
+
 #if HAVE_LOCALE_H
 #include <locale.h>
 #endif
@@ -84,7 +89,7 @@ extern ZEND_API php_pcre_globals pcre_globals;
 
 #define pcre_module_ptr NULL
 
-#endif /* HAVE_PCRE */
+#endif /* HAVE_PCRE || HAVE_BUNDLED_PCRE */
 
 #define phpext_pcre_ptr pcre_module_ptr