1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 04:31:29 +00:00

Upgraded from libpcre 4.3 to 6.3 - not tested on Windows yet

This commit is contained in:
fyodor
2005-09-11 09:22:55 +00:00
parent ba9cc971d9
commit 79b43cfb96
45 changed files with 14164 additions and 17815 deletions

View File

@@ -1,6 +1,23 @@
Written by: Philip Hazel <ph10@cam.ac.uk> THE MAIN PCRE LIBRARY
---------------------
Written by: Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
University of Cambridge Computing Service, University of Cambridge Computing Service,
Cambridge, England. Phone: +44 1223 334714. Cambridge, England. Phone: +44 1223 334714.
Copyright (c) 1997-2001 University of Cambridge Copyright (c) 1997-2005 University of Cambridge
All rights reserved
THE C++ WRAPPER LIBRARY
-----------------------
Written by: Google Inc.
Copyright (c) 2005 Google Inc
All rights reserved
####

View File

@@ -1,54 +0,0 @@
PCRE LICENCE
------------
PCRE 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.
Written by: Philip Hazel <ph10@cam.ac.uk>
University of Cambridge Computing Service,
Cambridge, England. Phone: +44 1223 334714.
Copyright (c) 1997-2001 University of Cambridge
Permission is granted to anyone to use this software for any purpose on any
computer system, and to redistribute it freely, subject to the following
restrictions:
1. This software is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by
explicit claim or by omission. In practice, this means that if you use
PCRE in software that you distribute to others, commercially or
otherwise, you must put a sentence like this
Regular expression support is provided by the PCRE library package,
which is open source software, written by Philip Hazel, and copyright
by the University of Cambridge, England.
somewhere reasonably visible in your documentation and in any relevant
files or online help data or similar. A reference to the ftp site for
the source, that is, to
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
should also be given in the documentation. However, this condition is not
intended to apply to whole chains of software. If package A includes PCRE,
it must acknowledge it, but if package B is software that includes package
A, the condition is not imposed on package B (unless it uses PCRE
independently).
3. Altered versions must be plainly marked as such, and must not be
misrepresented as being the original software.
4. If PCRE is embedded in any software that is released under the GNU
General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL),
then the terms of that licence shall supersede any condition above with
which it is incompatible.
The documentation for PCRE, supplied in the "doc" directory, is distributed
under the same terms as the software itself.
End

View File

@@ -4,51 +4,65 @@ PCRE LICENCE
PCRE is a library of functions to support regular expressions whose syntax PCRE 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. and semantics are as close as possible to those of the Perl 5 language.
Written by: Philip Hazel <ph10@cam.ac.uk> Release 6 of PCRE is distributed under the terms of the "BSD" licence, as
specified below. The documentation for PCRE, supplied in the "doc"
directory, is distributed under the same terms as the software itself.
The basic library functions are written in C and are freestanding. Also
included in the distribution is a set of C++ wrapper functions.
THE BASIC LIBRARY FUNCTIONS
---------------------------
Written by: Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
University of Cambridge Computing Service, University of Cambridge Computing Service,
Cambridge, England. Phone: +44 1223 334714. Cambridge, England. Phone: +44 1223 334714.
Copyright (c) 1997-2001 University of Cambridge Copyright (c) 1997-2005 University of Cambridge
All rights reserved.
Permission is granted to anyone to use this software for any purpose on any
computer system, and to redistribute it freely, subject to the following
restrictions:
1. This software is distributed in the hope that it will be useful, THE C++ WRAPPER FUNCTIONS
but WITHOUT ANY WARRANTY; without even the implied warranty of -------------------------
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by Contributed by: Google Inc.
explicit claim or by omission. In practice, this means that if you use
PCRE in software that you distribute to others, commercially or
otherwise, you must put a sentence like this
Regular expression support is provided by the PCRE library package, Copyright (c) 2005, Google Inc.
which is open source software, written by Philip Hazel, and copyright All rights reserved.
by the University of Cambridge, England.
somewhere reasonably visible in your documentation and in any relevant
files or online help data or similar. A reference to the ftp site for
the source, that is, to
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ THE "BSD" LICENCE
-----------------
should also be given in the documentation. However, this condition is not Redistribution and use in source and binary forms, with or without
intended to apply to whole chains of software. If package A includes PCRE, modification, are permitted provided that the following conditions are met:
it must acknowledge it, but if package B is software that includes package
A, the condition is not imposed on package B (unless it uses PCRE
independently).
3. Altered versions must be plainly marked as such, and must not be * Redistributions of source code must retain the above copyright notice,
misrepresented as being the original software. this list of conditions and the following disclaimer.
4. If PCRE is embedded in any software that is released under the GNU * Redistributions in binary form must reproduce the above copyright
General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL), notice, this list of conditions and the following disclaimer in the
then the terms of that licence shall supersede any condition above with documentation and/or other materials provided with the distribution.
which it is incompatible.
The documentation for PCRE, supplied in the "doc" directory, is distributed * Neither the name of the University of Cambridge nor the name of Google
under the same terms as the software itself. Inc. nor the names of their contributors may be used to endorse or
promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
End End

View File

@@ -1,14 +1,33 @@
# Makefile.in for PCRE (Perl-Compatible Regular Expression) library. # Makefile.in for PCRE (Perl-Compatible Regular Expression) library.
# Edited substantially by fyodor@insecure.org to remove libtool dependency # Edited substantially by fyodor@insecure.org to remove libtool dependency
# and strip it to just building the library. # and strip it to just building the library.
#############################################################################
# PCRE is developed on a Unix system. I do not use Windows or Macs, and know
# nothing about building software on them. Although the code of PCRE should
# be very portable, the building system in this Makefile is designed for Unix
# systems. However, there are features that have been supplied to me by various
# people that should make it work on MinGW and Cygwin systems.
# This setting enables Unix-style directory scanning in pcregrep, triggered # This setting enables Unix-style directory scanning in pcregrep, triggered
# by the -f option. Maybe one day someone will add code for other systems. # by the -f option. Maybe one day someone will add code for other systems.
PCREGREP_OSTYPE=-DIS_UNIX PCREGREP_OSTYPE=-DIS_UNIX
#############################################################################
# Libtool places .o files in the .libs directory; this can mean that "make"
# thinks is it not up-to-date when in fact it is. This setting helps when
# GNU "make" is being used. It presumably does no harm in other cases.
VPATH=.libs
#---------------------------------------------------------------------------# #---------------------------------------------------------------------------#
# The following lines are modified by "configure" to insert data that it is # # The following lines are modified by "configure" to insert data that it is #
# given in its arguments, or which it finds out for itself. # # given in its arguments, or which it finds out for itself. #
@@ -49,19 +68,36 @@ OBJEXT = @OBJEXT@
BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_EXEEXT = @BUILD_EXEEXT@
BUILD_OBJEXT = @BUILD_OBJEXT@ BUILD_OBJEXT = @BUILD_OBJEXT@
# POSIX_OBJ and POSIX_LOBJ are either set empty, or to the names of the
# POSIX object files.
POSIX_OBJ = @POSIX_OBJ@
POSIX_LOBJ = @POSIX_LOBJ@
# The compiler, C flags, preprocessor flags, etc # The compiler, C flags, preprocessor flags, etc
CC = @CC@ CC = @CC@
AR = ar AR = ar
RANLIB = @RANLIB@ RANLIB = @RANLIB@
CXX = @CXX@
CFLAGS = @CFLAGS@ CFLAGS = @CFLAGS@
CXXFLAGS = @CXXFLAGS@
LDFLAGS = @LDFLAGS@
CC_FOR_BUILD = @CC_FOR_BUILD@ CC_FOR_BUILD = @CC_FOR_BUILD@
CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
UTF8 = @UTF8@ CXX_FOR_BUILD = @CXX_FOR_BUILD@
CXXFLAGS_FOR_BUILD = @CXXFLAGS_FOR_BUILD@
LDFLAGS_FOR_BUILD = $(LDFLAGS)
UCP = @UCP@
NEWLINE = @NEWLINE@ NEWLINE = @NEWLINE@
POSIX_MALLOC_THRESHOLD = @POSIX_MALLOC_THRESHOLD@ POSIX_MALLOC_THRESHOLD = @POSIX_MALLOC_THRESHOLD@
LINK_SIZE = @LINK_SIZE@ LINK_SIZE = @LINK_SIZE@
MATCH_LIMIT= @MATCH_LIMIT@ MATCH_LIMIT = @MATCH_LIMIT@
NO_RECURSE = @NO_RECURSE@
EBCDIC = @EBCDIC@
INCLS = -I. -I$(top_srcdir) INCLS = -I. -I$(top_srcdir)
DEFS = $(NEWLINE) $(LINK_SIZE) $(MATCH_LIMIT) DEFS = $(NEWLINE) $(LINK_SIZE) $(MATCH_LIMIT)
TARGET=libpcre.a TARGET=libpcre.a
@@ -75,58 +111,150 @@ PCREPOSIXLIBVERSION = @PCRE_POSIXLIB_VERSION@
############################################################################## ##############################################################################
OBJ = maketables.@OBJEXT@ get.@OBJEXT@ study.@OBJEXT@ pcre.@OBJEXT@ @POSIX_OBJ@
$(TARGET): $(OBJ) OBJ = pcre_chartables.@OBJEXT@ \
-rm -f libpcre.a pcre_compile.@OBJEXT@ \
$(AR) cr $@ $(OBJ) pcre_config.@OBJEXT@ \
$(RANLIB) $@ pcre_dfa_exec.@OBJEXT@ \
pcre_exec.@OBJEXT@ \
pcre_fullinfo.@OBJEXT@ \
pcre_get.@OBJEXT@ \
pcre_globals.@OBJEXT@ \
pcre_info.@OBJEXT@ \
pcre_maketables.@OBJEXT@ \
pcre_printint.@OBJEXT@ \
pcre_refcount.@OBJEXT@ \
pcre_study.@OBJEXT@ \
pcre_tables.@OBJEXT@ \
pcre_try_flipped.@OBJEXT@ \
pcre_version.@OBJEXT@ \
pcre_xclass.@OBJEXT@ \
$(POSIX_OBJ)
all: $(TARGET) all: $(TARGET)
pcre.@OBJEXT@: $(top_srcdir)/chartables.c $(top_srcdir)/pcre.c \ # Note that files generated by ./configure and by dftables are in the current
$(top_srcdir)/internal.h $(top_srcdir)/printint.c \ # directory, not the source directory.
pcre_chartables.@OBJEXT@: pcre_chartables.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) \
$(POSIX_MALLOC_THRESHOLD) pcre_chartables.c
pcre_compile.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_compile.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_compile.c
pcre_config.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_config.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_config.c
pcre_dfa_exec.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_dfa_exec.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_dfa_exec.c
pcre_exec.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_exec.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_exec.c
pcre_fullinfo.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_fullinfo.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_fullinfo.c
pcre_get.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_get.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_get.c
pcre_globals.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_globals.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_globals.c
pcre_info.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_info.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_info.c
pcre_maketables.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_maketables.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_maketables.c
pcre_printint.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_printint.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_printint.c
pcre_refcount.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_refcount.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_refcount.c
pcre_study.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_study.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_study.c
pcre_tables.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_tables.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_tables.c
pcre_try_flipped.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_try_flipped.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_try_flipped.c
pcre_version.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_version.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_version.c
pcre_xclass.@OBJEXT@: Makefile config.h pcre.h \
$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_xclass.c
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) \
$(top_srcdir)/pcre_xclass.c
pcreposix.@OBJEXT@: $(top_srcdir)/pcreposix.c $(top_srcdir)/pcreposix.h \
$(top_srcdir)/pcre_internal.h pcre.h config.h Makefile
@$(LTCOMPILE) $(POSIX_MALLOC_THRESHOLD) $(top_srcdir)/pcreposix.c
$(TARGET): $(OBJ)
-rm -f libpcre.a
$(AR) cr $@ $(OBJ)
$(RANLIB) $@
# An auxiliary program makes the default character table source. This is put
# in the current directory, NOT the $top_srcdir directory.
pcre_chartables.c: dftables@BUILD_EXEEXT@
./dftables@BUILD_EXEEXT@ pcre_chartables.c
dftables.@BUILD_OBJEXT@: $(top_srcdir)/dftables.c \
$(top_srcdir)/pcre_maketables.c $(top_srcdir)/pcre_internal.h \
pcre.h config.h Makefile pcre.h config.h Makefile
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(UTF8) $(POSIX_MALLOC_THRESHOLD) $(top_srcdir)/pcre.c
pcreposix.@OBJEXT@: $(top_srcdir)/pcreposix.c $(top_srcdir)/pcreposix.h \
$(top_srcdir)/internal.h pcre.h config.h Makefile
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(POSIX_MALLOC_THRESHOLD) $(top_srcdir)/pcreposix.c
maketables.@OBJEXT@: $(top_srcdir)/maketables.c $(top_srcdir)/internal.h \
pcre.h config.h Makefile
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(top_srcdir)/maketables.c
get.@OBJEXT@: $(top_srcdir)/get.c $(top_srcdir)/internal.h \
pcre.h config.h Makefile
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(top_srcdir)/get.c
study.@OBJEXT@: $(top_srcdir)/study.c $(top_srcdir)/internal.h \
pcre.h config.h Makefile
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) $(UTF8) $(top_srcdir)/study.c
# An auxiliary program makes the default character table source
$(top_srcdir)/chartables.c: dftables
./dftables >$(top_srcdir)/chartables.c
dftables.@BUILD_OBJEXT@: $(top_srcdir)/dftables.c $(top_srcdir)/maketables.c \
$(top_srcdir)/internal.h pcre.h config.h Makefile
$(CC) -c $(CFLAGS) $(INCLS) $(DEFS) -I. $(top_srcdir)/dftables.c $(CC) -c $(CFLAGS) $(INCLS) $(DEFS) -I. $(top_srcdir)/dftables.c
dftables: dftables.@BUILD_OBJEXT@ dftables@BUILD_EXEEXT@: dftables.@BUILD_OBJEXT@
$(CC) $(CFLAGS) -o dftables dftables.@OBJEXT@ $(CC) $(CFLAGS) -o dftables dftables.@OBJEXT@
# We deliberately omit dftables and chartables.c from 'make clean'; once made # We deliberately omit dftables and pcre_chartables.c from 'make clean'; once
# chartables.c shouldn't change, and if people have edited the tables by hand, # made pcre_chartables.c shouldn't change, and if people have edited the tables
# you don't want to throw them away. # by hand, you don't want to throw them away.
clean:; -rm -rf *.@OBJEXT@ *.lo *.a *.la .libs pcretest@EXEEXT@ pcregrep@EXEEXT@ testtry clean:; -rm -rf *.@OBJEXT@ *.lo *.a *.la .libs pcretest@EXEEXT@ pcre_stringpiece_unittest@EXEEXT@ pcrecpp_unittest@EXEEXT@ pcre_scanner_unittest@EXEEXT@ pcregrep@EXEEXT@ testtry
# But "make distclean" should get back to a virgin distribution # But "make distclean" should get back to a virgin distribution
distclean: clean distclean: clean
-rm -f chartables.c libtool pcre-config pcre.h \ -rm -f pcre_chartables.c libtool pcre-config libpcre.pc \
pcre.h pcre_stringpiece.h pcrecpp.h \
dftables@EXEEXT@ RunGrepTest RunTest \
Makefile config.h config.status config.log config.cache Makefile config.h config.status config.log config.cache
# End # End

View File

@@ -1,123 +0,0 @@
News about PCRE releases
------------------------
Release 4.0 17-Feb-03
---------------------
There have been a lot of changes for the 4.0 release, adding additional
functionality and mending bugs. Below is a list of the highlights of the new
functionality. For full details of these features, please consult the
documentation. For a complete list of changes, see the ChangeLog file.
1. Support for Perl's \Q...\E escapes.
2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java
package. They provide some syntactic sugar for simple cases of "atomic
grouping".
3. Support for the \G assertion. It is true when the current matching position
is at the start point of the match.
4. A new feature that provides some of the functionality that Perl provides
with (?{...}). The facility is termed a "callout". The way it is done in PCRE
is for the caller to provide an optional function, by setting pcre_callout to
its entry point. To get the function called, the regex must include (?C) at
appropriate points.
5. Support for recursive calls to individual subpatterns. This makes it really
easy to get totally confused.
6. Support for named subpatterns. The Python syntax (?P<name>...) is used to
name a group.
7. Several extensions to UTF-8 support; it is now fairly complete. There is an
option for pcregrep to make it operate in UTF-8 mode.
8. The single man page has been split into a number of separate man pages.
These also give rise to individual HTML pages which are put in a separate
directory. There is an index.html page that lists them all. Some hyperlinking
between the pages has been installed.
Release 3.5 15-Aug-01
---------------------
1. The configuring system has been upgraded to use later versions of autoconf
and libtool. By default it builds both a shared and a static library if the OS
supports it. You can use --disable-shared or --disable-static on the configure
command if you want only one of them.
2. The pcretest utility is now installed along with pcregrep because it is
useful for users (to test regexs) and by doing this, it automatically gets
relinked by libtool. The documentation has been turned into a man page, so
there are now .1, .txt, and .html versions in /doc.
3. Upgrades to pcregrep:
(i) Added long-form option names like gnu grep.
(ii) Added --help to list all options with an explanatory phrase.
(iii) Added -r, --recursive to recurse into sub-directories.
(iv) Added -f, --file to read patterns from a file.
4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
script, to force use of CR or LF instead of \n in the source. On non-Unix
systems, the value can be set in config.h.
5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
absolute limit. Changed the text of the error message to make this clear, and
likewise updated the man page.
6. The limit of 99 on the number of capturing subpatterns has been removed.
The new limit is 65535, which I hope will not be a "real" limit.
Release 3.3 01-Aug-00
---------------------
There is some support for UTF-8 character strings. This is incomplete and
experimental. The documentation describes what is and what is not implemented.
Otherwise, this is just a bug-fixing release.
Release 3.0 01-Feb-00
---------------------
1. A "configure" script is now used to configure PCRE for Unix systems. It
builds a Makefile, a config.h file, and the pcre-config script.
2. PCRE is built as a shared library by default.
3. There is support for POSIX classes such as [:alpha:].
5. There is an experimental recursion feature.
----------------------------------------------------------------------------
IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00
Please note that there has been a change in the API such that a larger
ovector is required at matching time, to provide some additional workspace.
The new man page has details. This change was necessary in order to support
some of the new functionality in Perl 5.005.
IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00
Another (I hope this is the last!) change has been made to the API for the
pcre_compile() function. An additional argument has been added to make it
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)
****

View File

@@ -7,7 +7,7 @@ o rm -rf doc testdata pcretest.c pcregrep.c pcredemo.c ChangeLog
o Renamed configure.in to configure.ac o Renamed configure.in to configure.ac
o Removed Runtest, Runtest.in o Removed RunGrepTest.in, Runtest.in
o Removed pcretest and pcregrep from the Makefile.in all target: o Removed pcretest and pcregrep from the Makefile.in all target:
@@ -29,5 +29,16 @@ o Stripped down Makefile and configure.ac substantially to remove
worries about building libpcre.a (which is now build in the libpcre worries about building libpcre.a (which is now build in the libpcre
directory rather than in libpcre/.libs ). directory rather than in libpcre/.libs ).
o removed libpcre.pc.in
o Regenerated configure script by running 'aclocal; autoconf' o Regenerated configure script by running 'aclocal; autoconf'
o Get rid of C++ wrapper, which included this step:
rm -f pcrecpp.cc pcrecpp_unittest.cc pcre_scanner.cc pcre_scanner_unittest.cc pcre_stringpiece.cc pcre_stringpiece_unittest.cc pcrecpp.h pcrecpp.h.in pcre_scanner.h pcre_stringpiece.h pcre_stringpiece.h.in
o Removed COPYING file as there is already a LICENSE file with exactly
the same contents.
o Removed pcre_ucp_findchar.c and ucptable.c
o Added this NMAP_MODIFICATIONS file

View File

@@ -1,12 +1,25 @@
Compiling PCRE on non-Unix systems Compiling PCRE on non-Unix systems
---------------------------------- ----------------------------------
See below for comments on Cygwin or MinGW usage. See below for comments on Cygwin or MinGW and OpenVMS usage. I (Philip Hazel)
have no knowledge of Windows or VMS sytems and how their libraries work. The
items in the PCRE Makefile that relate to anything other than Unix-like systems
have been contributed by PCRE users. There are some other comments and files in
the Contrib directory on the ftp site that you may find useful. See
If you want to compile PCRE for a non-Unix system, note that it consists ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
entirely of code written in Standard C, and so should compile successfully
on any machine with a Standard C compiler and library, using normal compiling If you want to compile PCRE for a non-Unix system (or perhaps, more strictly,
commands to do the following: for a system that does not support "configure" and "make" files), note that
PCRE consists entirely of code written in Standard C, and so should compile
successfully on any system that has a Standard C compiler and library.
GENERIC INSTRUCTIONS FOR THE C LIBRARY
The following are generic comments about building PCRE. The interspersed
indented commands are suggestions from Mark Tetrode as to which commands you
might use on a Windows system to build a static library.
(1) Copy or rename the file config.in as config.h, and change the macros that (1) Copy or rename the file config.in as config.h, and change the macros that
define HAVE_STRERROR and HAVE_MEMMOVE to define them as 1 rather than 0. define HAVE_STRERROR and HAVE_MEMMOVE to define them as 1 rather than 0.
@@ -16,30 +29,116 @@ particular, if you want to force a specific value for newline, you can define
the NEWLINE macro. The default is to use '\n', thereby using whatever value the NEWLINE macro. The default is to use '\n', thereby using whatever value
your compiler gives to '\n'. your compiler gives to '\n'.
rem Mark Tetrode's commands
copy config.in config.h
rem Use write, because notepad cannot handle UNIX files. Change values.
write config.h
(2) Copy or rename the file pcre.in as pcre.h, and change the macro definitions (2) Copy or rename the file pcre.in as pcre.h, and change the macro definitions
for PCRE_MAJOR, PCRE_MINOR, and PCRE_DATE near its start to the values set in for PCRE_MAJOR, PCRE_MINOR, and PCRE_DATE near its start to the values set in
configure.in. configure.in.
rem Mark Tetrode's commands
copy pcre.in pcre.h
rem Read values from configure.in
write configure.in
rem Change values
write pcre.h
(3) Compile dftables.c as a stand-alone program, and then run it with (3) Compile dftables.c as a stand-alone program, and then run it with
the standard output sent to chartables.c. This generates a set of standard the single argument "chartables.c". This generates a set of standard
character tables. character tables and writes them to that file.
(4) Compile maketables.c, get.c, study.c and pcre.c and link them all rem Mark Tetrode's commands
together into an object library in whichever form your system keeps such rem Compile & run
libraries. This is the pcre library (chartables.c is included by means of an cl -DSUPPORT_UTF8 -DSUPPORT_UCP dftables.c
#include directive). dftables.exe chartables.c
(5) Similarly, compile pcreposix.c and link it as the pcreposix library. (4) Compile the following source files:
pcre_chartables.c
pcre_compile.c
pcre_config.c
pcre_dfa_exec.c
pcre_exec.c
pcre_fullinfo.c
pcre_get.c
pcre_globals.c
pcre_info.c
pcre_maketables.c
pcre_ord2utf8.c
pcre_printint.c
pcre_refcount.c
pcre_study.c
pcre_tables.c
pcre_try_flipped.c
pcre_ucp_findchar.c
pcre_valid_utf8.c
pcre_version.c
pcre_xclass.c
and link them all together into an object library in whichever form your system
keeps such libraries. This is the pcre C library. If your system has static and
shared libraries, you may have to do this once for each type.
rem These comments are out-of-date, referring to a previous release which
rem had fewer source files. Replace with the file names from above.
rem Mark Tetrode's commands, for a static library
rem Compile & lib
cl -DSUPPORT_UTF8 -DSUPPORT_UCP -DPOSIX_MALLOC_THRESHOLD=10 /c maketables.c get.c study.c pcre.c
lib /OUT:pcre.lib maketables.obj get.obj study.obj pcre.obj
(5) Similarly, compile pcreposix.c and link it (on its own) as the pcreposix
library.
rem Mark Tetrode's commands, for a static library
rem Compile & lib
cl -DSUPPORT_UTF8 -DSUPPORT_UCP -DPOSIX_MALLOC_THRESHOLD=10 /c pcreposix.c
lib /OUT:pcreposix.lib pcreposix.obj
(6) Compile the test program pcretest.c. This needs the functions in the (6) Compile the test program pcretest.c. This needs the functions in the
pcre and pcreposix libraries when linking. pcre and pcreposix libraries when linking.
rem Mark Tetrode's commands
rem compile & link
cl /F0x400000 pcretest.c pcre.lib pcreposix.lib
(7) Run pcretest on the testinput files in the testdata directory, and check (7) Run pcretest on the testinput files in the testdata directory, and check
that the output matches the corresponding testoutput files. You must use the that the output matches the corresponding testoutput files. You must use the
-i option when checking testinput2. Note that the supplied files are in Unix -i option when checking testinput2. Note that the supplied files are in Unix
format, with just LF characters as line terminators. You may need to edit them format, with just LF characters as line terminators. You may need to edit them
to change this if your system uses a different convention. to change this if your system uses a different convention.
rem Mark Tetrode's commands
pcretest testdata\testinput1 testdata\myoutput1
windiff testdata\testoutput1 testdata\myoutput1
pcretest -i testdata\testinput2 testdata\myoutput2
windiff testdata\testoutput2 testdata\myoutput2
pcretest testdata\testinput3 testdata\myoutput3
windiff testdata\testoutput3 testdata\myoutput3
pcretest testdata\testinput4 testdata\myoutput4
windiff testdata\testoutput4 testdata\myoutput4
pcretest testdata\testinput5 testdata\myoutput5
windiff testdata\testoutput5 testdata\myoutput5
pcretest testdata\testinput6 testdata\myoutput6
windiff testdata\testoutput6 testdata\myoutput6
Note that there are now three more tests (7, 8, 9) that did not exist when Mark
wrote those comments. The test the new pcre_dfa_exec() function.
THE C++ WRAPPER FUNCTIONS
The PCRE distribution now contains some C++ wrapper functions and tests,
contributed by Google Inc. On a system that can use "configure" and "make",
the functions are automatically built into a library called pcrecpp. It should
be straightforward to compile the .cc files manually on other systems. The
files called xxx_unittest.cc are test programs for each of the corresponding
xxx.cc files.
FURTHER REMARKS
If you have a system without "configure" but where you can use a Makefile, edit If you have a system without "configure" but where you can use a Makefile, edit
Makefile.in to create Makefile, substituting suitable values for the variables Makefile.in to create Makefile, substituting suitable values for the variables
at the head of the file. at the head of the file.
@@ -79,7 +178,7 @@ These are some further comments about Win32 builds from Mark Evans. They
were contributed before Fred Cox's changes were made, so it is possible that were contributed before Fred Cox's changes were made, so it is possible that
they may no longer be relevant. they may no longer be relevant.
The documentation for Win32 builds is a bit shy. Under MSVC6 I "The documentation for Win32 builds is a bit shy. Under MSVC6 I
followed their instructions to the letter, but there were still followed their instructions to the letter, but there were still
some things missing. some things missing.
@@ -89,7 +188,7 @@ some things missing.
(2) Missing some #ifdefs relating to the function pointers (2) Missing some #ifdefs relating to the function pointers
pcre_malloc and pcre_free. See my solution below. (The stubs pcre_malloc and pcre_free. See my solution below. (The stubs
may not be mandatory but they made me feel better.) may not be mandatory but they made me feel better.)"
========================= =========================
#ifdef _WIN32 #ifdef _WIN32
@@ -110,4 +209,69 @@ void (*pcre_free)(void *) = free;
#endif #endif
========================= =========================
BUILDING PCRE ON OPENVMS
Dan Mooney sent the following comments about building PCRE on OpenVMS. They
relate to an older version of PCRE that used fewer source files, so the exact
commands will need changing. See the current list of source files above.
"It was quite easy to compile and link the library. I don't have a formal
make file but the attached file [reproduced below] contains the OpenVMS DCL
commands I used to build the library. I had to add #define
POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere.
The library was built on:
O/S: HP OpenVMS v7.3-1
Compiler: Compaq C v6.5-001-48BCD
Linker: vA13-01
The test results did not match 100% due to the issues you mention in your
documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I
modified some of the character tables temporarily and was able to get the
results to match. Tests using the fr locale did not match since I don't have
that locale loaded. The study size was always reported to be 3 less than the
value in the standard test output files."
=========================
$! This DCL procedure builds PCRE on OpenVMS
$!
$! I followed the instructions in the non-unix-use file in the distribution.
$!
$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES
$ COMPILE DFTABLES.C
$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ
$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C
$ COMPILE MAKETABLES.C
$ COMPILE GET.C
$ COMPILE STUDY.C
$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol
$! did not seem to be defined anywhere.
$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support.
$ COMPILE PCRE.C
$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ
$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol
$! did not seem to be defined anywhere.
$ COMPILE PCREPOSIX.C
$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ
$ COMPILE PCRETEST.C
$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB
$! C programs that want access to command line arguments must be
$! defined as a symbol
$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE"
$! Arguments must be enclosed in quotes.
$ PCRETEST "-C"
$! Test results:
$!
$! The test results did not match 100%. The functions isprint(), iscntrl(),
$! isgraph() and ispunct() on OpenVMS must not produce the same results
$! as the system that built the test output files provided with the
$! distribution.
$!
$! The study size did not match and was always 3 less on OpenVMS.
$!
$! Locale could not be set to fr
$!
=========================
**** ****

View File

@@ -7,14 +7,49 @@ The latest release of PCRE is always available from
Please read the NEWS file if you are upgrading from a previous release. Please read the NEWS file if you are upgrading from a previous release.
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. Note that this The PCRE APIs
just provides a POSIX calling interface to PCRE: the regular expressions -------------
themselves still follow Perl syntax and semantics. The header file
for the POSIX-style functions is called pcreposix.h. The official POSIX name is PCRE is written in C, and it has its own API. The distribution now includes a
regex.h, but I didn't want to risk possible problems with existing files of set of C++ wrapper functions, courtesy of Google Inc. (see the pcrecpp man page
that name by distributing it that way. To use it with an existing program that for details).
uses the POSIX API, it will have to be renamed or pointed at by a link.
Also included are a set of C wrapper functions that are based on the POSIX
API. These end up in the library called libpcreposix. Note that this just
provides a POSIX calling interface to PCRE: the regular expressions themselves
still follow Perl syntax and semantics. The header file for the POSIX-style
functions is called pcreposix.h. The official POSIX name is regex.h, but I
didn't want to risk possible problems with existing files of that name by
distributing it that way. To use it with an existing program that uses the
POSIX API, it will have to be renamed or pointed at by a link.
If you are using the POSIX interface to PCRE and there is already a POSIX regex
library installed on your system, you must take care when linking programs to
ensure that they link with PCRE's libpcreposix library. Otherwise they may pick
up the "real" POSIX functions of the same name.
Documentation for PCRE
----------------------
If you install PCRE in the normal way, you will end up with an installed set of
man pages whose names all start with "pcre". The one that is called "pcre"
lists all the others. In addition to these man pages, the PCRE documentation is
supplied in two other forms; however, as there is no standard place to install
them, they are left in the doc directory of the unpacked source distribution.
These forms are:
1. Files called doc/pcre.txt, doc/pcregrep.txt, and doc/pcretest.txt. The
first of these is a concatenation of the text forms of all the section 3
man pages except those that summarize individual functions. The other two
are the text forms of the section 1 man pages for the pcregrep and
pcretest commands. Text forms are provided for ease of scanning with text
editors or similar tools.
2. A subdirectory called doc/html contains all the documentation in HTML
form, hyperlinked in various ways, and rooted in a file called
doc/index.html.
Contributions by users of PCRE Contributions by users of PCRE
@@ -41,7 +76,7 @@ INSTALL.
Most commonly, people build PCRE within its own distribution directory, and in Most commonly, people build PCRE within its own distribution directory, and in
this case, on many systems, just running "./configure" is sufficient, but the this case, on many systems, just running "./configure" is sufficient, but the
usual methods of changing standard defaults are available. For example, usual methods of changing standard defaults are available. For example:
CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
@@ -59,11 +94,23 @@ cd /build/pcre/pcre-xxx
There are some optional features that can be included or omitted from the PCRE There are some optional features that can be included or omitted from the PCRE
library. You can read more about them in the pcrebuild man page. library. You can read more about them in the pcrebuild man page.
. If you want to suppress the building of the C++ wrapper library, you can add
--disable-cpp to the "configure" command. Otherwise, when "configure" is run,
will try to find a C++ compiler and C++ header files, and if it succeeds, it
will try to build the C++ wrapper.
. If you want to make use of the support for UTF-8 character strings in PCRE, . If you want to make use of the support for UTF-8 character strings in PCRE,
you must add --enable-utf8 to the "configure" command. Without it, the code you must add --enable-utf8 to the "configure" command. Without it, the code
for handling UTF-8 is not included in the library. (Even when included, it for handling UTF-8 is not included in the library. (Even when included, it
still has to be enabled by an option at run time.) still has to be enabled by an option at run time.)
. If, in addition to support for UTF-8 character strings, you want to include
support for the \P, \p, and \X sequences that recognize Unicode character
properties, you must add --enable-unicode-properties to the "configure"
command. This adds about 90K to the size of the library (in the form of a
property table); only the basic two-letter properties such as Lu are
supported.
. You can build PCRE to recognized CR or NL as the newline character, instead . You can build PCRE to recognized CR or NL as the newline character, instead
of whatever your compiler uses for "\n", by adding --newline-is-cr or of whatever your compiler uses for "\n", by adding --newline-is-cr or
--newline-is-nl to the "configure" command, respectively. Only do this if you --newline-is-nl to the "configure" command, respectively. Only do this if you
@@ -78,7 +125,7 @@ library. You can read more about them in the pcrebuild man page.
on the "configure" command. on the "configure" command.
. PCRE has a counter which can be set to limit the amount of resources it uses. . PCRE has a counter that can be set to limit the amount of resources it uses.
If the limit is exceeded during a match, the match fails. The default is ten If the limit is exceeded during a match, the match fails. The default is ten
million. You can change the default by setting, for example, million. You can change the default by setting, for example,
@@ -96,51 +143,91 @@ library. You can read more about them in the pcrebuild man page.
is a representation of the compiled pattern, and this changes with the link is a representation of the compiled pattern, and this changes with the link
size. size.
The "configure" script builds five files: . You can build PCRE so that its internal match() function that is called from
pcre_exec() does not call itself recursively. Instead, it uses blocks of data
from the heap via special functions pcre_stack_malloc() and pcre_stack_free()
to save data that would otherwise be saved on the stack. To build PCRE like
this, use
--disable-stack-for-recursion
on the "configure" command. PCRE runs more slowly in this mode, but it may be
necessary in environments with limited stack sizes. This applies only to the
pcre_exec() function; it does not apply to pcre_dfa_exec(), which does not
use deeply nested recursion.
The "configure" script builds eight files for the basic C library:
. pcre.h is the header file for C programs that call PCRE
. Makefile is the makefile that builds the library
. config.h contains build-time configuration options for the library
. pcre-config is a script that shows the settings of "configure" options
. libpcre.pc is data for the pkg-config command
. libtool is a script that builds shared and/or static libraries . libtool is a script that builds shared and/or static libraries
. Makefile is built by copying Makefile.in and making substitutions. . RunTest is a script for running tests on the library
. config.h is built by copying config.in and making substitutions. . RunGrepTest is a script for running tests on the pcregrep command
. pcre-config is built by copying pcre-config.in and making substitutions.
. RunTest is a script for running tests
Once "configure" has run, you can run "make". It builds two libraries called In addition, if a C++ compiler is found, the following are also built:
. pcrecpp.h is the header file for programs that call PCRE via the C++ wrapper
. pcre_stringpiece.h is the header for the C++ "stringpiece" functions
The "configure" script also creates config.status, which is an executable
script that can be run to recreate the configuration, and config.log, which
contains compiler output from tests that "configure" runs.
Once "configure" has run, you can run "make". It builds two libraries, called
libpcre and libpcreposix, a test program called pcretest, and the pcregrep libpcre and libpcreposix, a test program called pcretest, and the pcregrep
command. You can use "make install" to copy these, the public header files command. If a C++ compiler was found on your system, it also builds the C++
pcre.h and pcreposix.h, and the man pages to appropriate live directories on wrapper library, which is called libpcrecpp, and some test programs called
your system, in the normal way. pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest.
The command "make test" runs all the appropriate tests. Details of the PCRE
tests are given in a separate section of this document, below.
You can use "make install" to copy the libraries, the public header files
pcre.h, pcreposix.h, pcrecpp.h, and pcre_stringpiece.h (the last two only if
the C++ wrapper was built), and the man pages to appropriate live directories
on your system, in the normal way.
If you want to remove PCRE from your system, you can run "make uninstall".
This removes all the files that "make install" installed. However, it does not
remove any directories, because these are often shared with other programs.
Retrieving configuration information on Unix-like systems
---------------------------------------------------------
Running "make install" also installs the command pcre-config, which can be used Running "make install" also installs the command pcre-config, which can be used
to recall information about the PCRE configuration and installation. For to recall information about the PCRE configuration and installation. For
example, example:
pcre-config --version pcre-config --version
prints the version number, and prints the version number, and
pcre-config --libs pcre-config --libs
outputs information about where the library is installed. This command can be outputs information about where the library is installed. This command can be
included in makefiles for programs that use PCRE, saving the programmer from included in makefiles for programs that use PCRE, saving the programmer from
having to remember too many details. having to remember too many details.
The pkg-config command is another system for saving and retrieving information
about installed libraries. Instead of separate commands for each library, a
single command is used. For example:
Cross-compiling PCRE on a Unix-like system pkg-config --cflags pcre
------------------------------------------
PCRE needs to compile and run an auxiliary program as part of the building The data is held in *.pc files that are installed in a directory called
process. Obviously, if the real compilation is for some other system, it can't pkgconfig.
use the same CC and CFLAGS values when it is doing this. For cross compilation,
therefore, you must set CC_FOR_BUILD to the local host's compiler, and you can
set flags in CFLAGS_FOR_BUILD if you need to.
Shared libraries on Unix-like systems Shared libraries on Unix-like systems
------------------------------------- -------------------------------------
The default distribution builds PCRE as two shared libraries and two static The default distribution builds PCRE as shared libraries and static libraries,
libraries, as long as the operating system supports shared libraries. Shared as long as the operating system supports shared libraries. Shared library
library support relies on the "libtool" script which is built as part of the support relies on the "libtool" script which is built as part of the
"configure" process. "configure" process.
The libtool script is used to compile and link both shared and static The libtool script is used to compile and link both shared and static
@@ -153,7 +240,7 @@ installed themselves. However, the versions left in the source directory still
use the uninstalled libraries. use the uninstalled libraries.
To build PCRE using static libraries only you must use --disable-shared when To build PCRE using static libraries only you must use --disable-shared when
configuring it. For example configuring it. For example:
./configure --prefix=/usr/gnu --disable-shared ./configure --prefix=/usr/gnu --disable-shared
@@ -169,17 +256,21 @@ order to cross-compile PCRE for some other host. However, during the building
process, the dftables.c source file is compiled *and run* on the local host, in process, the dftables.c source file is compiled *and run* on the local host, in
order to generate the default character tables (the chartables.c file). It order to generate the default character tables (the chartables.c file). It
therefore needs to be compiled with the local compiler, not the cross compiler. therefore needs to be compiled with the local compiler, not the cross compiler.
You can do this by specifying HOST_CC (and if necessary HOST_CFLAGS) when You can do this by specifying CC_FOR_BUILD (and if necessary CFLAGS_FOR_BUILD;
calling the "configure" command. If they are not specified, they default to the there are also CXX_FOR_BUILD and CXXFLAGS_FOR_BUILD for the C++ wrapper)
values of CC and CFLAGS. when calling the "configure" command. If they are not specified, they default
to the values of CC and CFLAGS.
Building on non-Unix systems Building on non-Unix systems
---------------------------- ----------------------------
For a non-Unix system, read the comments in the file NON-UNIX-USE. PCRE has For a non-Unix system, read the comments in the file NON-UNIX-USE, though if
been compiled on Windows systems and on Macintoshes, but I don't know the the system supports the use of "configure" and "make" you may be able to build
details because I don't use those systems. It should be straightforward to PCRE in the same way as for Unix systems.
PCRE has been compiled on Windows systems and on Macintoshes, but I don't know
the details because I don't use those systems. It should be straightforward to
build PCRE on any system that has a Standard C compiler, because it uses only build PCRE on any system that has a Standard C compiler, because it uses only
Standard C functions. Standard C functions.
@@ -188,15 +279,21 @@ Testing PCRE
------------ ------------
To test PCRE on a Unix system, run the RunTest script that is created by the To test PCRE on a Unix system, run the RunTest script that is created by the
configuring process. (This can also be run by "make runtest", "make check", or configuring process. There is also a script called RunGrepTest that tests the
"make test".) For other systems, see the instruction in NON-UNIX-USE. options of the pcregrep command. If the C++ wrapper library is build, three
test programs called pcrecpp_unittest, pcre_scanner_unittest, and
pcre_stringpiece_unittest are provided.
The script runs the pcretest test program (which is documented in its own man Both the scripts and all the program tests are run if you obey "make runtest",
page) on each of the testinput files (in the testdata directory) in turn, "make check", or "make test". For other systems, see the instructions in
and compares the output with the contents of the corresponding testoutput file. NON-UNIX-USE.
A file called testtry is used to hold the output from pcretest. To run pcretest
on just one of the test files, give its number as an argument to RunTest, for The RunTest script runs the pcretest test program (which is documented in its
example: own man page) on each of the testinput files (in the testdata directory) in
turn, and compares the output with the contents of the corresponding testoutput
file. A file called testtry is used to hold the main output from pcretest
(testsavedregex is also used as a working file). To run pcretest on just one of
the test files, give its number as an argument to RunTest, for example:
RunTest 2 RunTest 2
@@ -222,13 +319,13 @@ bug in PCRE.
The third set of tests checks pcre_maketables(), the facility for building a The third set of tests checks pcre_maketables(), the facility for building a
set of character tables for a specific locale and using them instead of the set of character tables for a specific locale and using them instead of the
default tables. The tests make use of the "fr" (French) locale. Before running default tables. The tests make use of the "fr_FR" (French) locale. Before
the test, the script checks for the presence of this locale by running the running the test, the script checks for the presence of this locale by running
"locale" command. If that command fails, or if it doesn't include "fr" in the the "locale" command. If that command fails, or if it doesn't include "fr_FR"
list of available locales, the third test cannot be run, and a comment is in the list of available locales, the third test cannot be run, and a comment
output to say why. If running this test produces instances of the error is output to say why. If running this test produces instances of the error
** Failed to set locale "fr" ** Failed to set locale "fr_FR"
in the comparison output, it means that locale is not available on your system, 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. despite being listed by "locale". This does not mean that PCRE is broken.
@@ -239,19 +336,28 @@ running "configure". This file can be also fed directly to the perltest script,
provided you are running Perl 5.8 or higher. (For Perl 5.6, a small patch, provided you are running Perl 5.8 or higher. (For Perl 5.6, a small patch,
commented in the script, can be be used.) commented in the script, can be be used.)
The fifth and final file tests error handling with UTF-8 encoding, and internal The fifth test checks error handling with UTF-8 encoding, and internal UTF-8
UTF-8 features of PCRE that are not relevant to Perl. features of PCRE that are not relevant to Perl.
The sixth and test checks the support for Unicode character properties. It it
not run automatically unless PCRE is built with Unicode property support. To to
this you must set --enable-unicode-properties when running "configure".
The seventh, eighth, and ninth tests check the pcre_dfa_exec() alternative
matching function, in non-UTF-8 mode, UTF-8 mode, and UTF-8 mode with Unicode
property support, respectively. The eighth and ninth tests are not run
automatically unless PCRE is build with the relevant support.
Character tables Character tables
---------------- ----------------
PCRE uses four tables for manipulating and identifying characters. The final PCRE uses four tables for manipulating and identifying characters whose values
argument of the pcre_compile() function is a pointer to a block of memory are less than 256. The final argument of the pcre_compile() function is a
containing the concatenated tables. A call to pcre_maketables() can be used to pointer to a block of memory containing the concatenated tables. A call to
generate a set of tables in the current locale. If the final argument for pcre_maketables() can be used to generate a set of tables in the current
pcre_compile() is passed as NULL, a set of default tables that is built into locale. If the final argument for pcre_compile() is passed as NULL, a set of
the binary is used. default tables that is built into the binary is used.
The source file called chartables.c contains the default set of tables. This is 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 not supplied in the distribution, but is built by the program dftables
@@ -291,18 +397,47 @@ The distribution should contain the following files:
headers: headers:
dftables.c auxiliary program for building chartables.c dftables.c auxiliary program for building chartables.c
get.c )
maketables.c )
study.c ) source of
pcre.c ) the functions
pcreposix.c ) pcreposix.c )
printint.c ) pcre_compile.c )
pcre_config.c )
pcre_dfa_exec.c )
pcre_exec.c )
pcre_fullinfo.c )
pcre_get.c ) sources for the functions in the library,
pcre_globals.c ) and some internal functions that they use
pcre_info.c )
pcre_maketables.c )
pcre_ord2utf8.c )
pcre_printint.c )
pcre_study.c )
pcre_tables.c )
pcre_try_flipped.c )
pcre_ucp_findchar.c )
pcre_valid_utf8.c )
pcre_version.c )
pcre_xclass.c )
ucp_findchar.c )
ucp.h ) source for the code that is used for
ucpinternal.h ) Unicode property handling
ucptable.c )
ucptypetable.c )
pcre.in "source" for the header for the external API; pcre.h pcre.in "source" for the header for the external API; pcre.h
is built from this by "configure" is built from this by "configure"
pcreposix.h header for the external POSIX wrapper API pcreposix.h header for the external POSIX wrapper API
internal.h header for internal use pcre_internal.h header for internal use
config.in template for config.h, which is built by configure config.in template for config.h, which is built by configure
pcrecpp.h.in "source" for the header file for the C++ wrapper
pcrecpp.cc )
pcre_scanner.cc ) source for the C++ wrapper library
pcre_stringpiece.h.in "source" for pcre_stringpiece.h, the header for the
C++ stringpiece functions
pcre_stringpiece.cc source for the C++ stringpiece functions
(B) Auxiliary files: (B) Auxiliary files:
AUTHORS information about the author of PCRE AUTHORS information about the author of PCRE
@@ -315,6 +450,7 @@ The distribution should contain the following files:
NON-UNIX-USE notes on building PCRE on non-Unix systems NON-UNIX-USE notes on building PCRE on non-Unix systems
README this file README this file
RunTest.in template for a Unix shell script for running tests RunTest.in template for a Unix shell script for running tests
RunGrepTest.in template for a Unix shell script for pcregrep tests
config.guess ) files used by libtool, config.guess ) files used by libtool,
config.sub ) used only when building a shared library config.sub ) used only when building a shared library
configure a configuring shell script (built by autoconf) configure a configuring shell script (built by autoconf)
@@ -327,31 +463,32 @@ The distribution should contain the following files:
doc/pcretest.txt plain text documentation of test program doc/pcretest.txt plain text documentation of test program
doc/perltest.txt plain text documentation of Perl test program doc/perltest.txt plain text documentation of Perl test program
install-sh a shell script for installing files install-sh a shell script for installing files
libpcre.pc.in "source" for libpcre.pc for pkg-config
ltmain.sh file used to build a libtool script ltmain.sh file used to build a libtool script
mkinstalldirs script for making install directories
pcretest.c comprehensive test program pcretest.c comprehensive test program
pcredemo.c simple demonstration of coding calls to PCRE pcredemo.c simple demonstration of coding calls to PCRE
perltest Perl test program perltest Perl test program
pcregrep.c source of a grep utility that uses PCRE pcregrep.c source of a grep utility that uses PCRE
pcre-config.in source of script which retains PCRE information pcre-config.in source of script which retains PCRE information
testdata/testinput1 test data, compatible with Perl pcrecpp_unittest.c )
testdata/testinput2 test data for error messages and non-Perl things pcre_scanner_unittest.c ) test programs for the C++ wrapper
testdata/testinput3 test data for locale-specific tests pcre_stringpiece_unittest.c )
testdata/testinput4 test data for UTF-8 tests compatible with Perl testdata/testinput* test data for main library tests
testdata/testinput5 test data for other UTF-8 tests testdata/testoutput* expected test results
testdata/testoutput1 test results corresponding to testinput1 testdata/grep* input and output for pcregrep tests
testdata/testoutput2 test results corresponding to testinput2
testdata/testoutput3 test results corresponding to testinput3
testdata/testoutput4 test results corresponding to testinput4
testdata/testoutput5 test results corresponding to testinput5
(C) Auxiliary files for Win32 DLL (C) Auxiliary files for Win32 DLL
dll.mk libpcre.def
libpcreposix.def
pcre.def pcre.def
(D) Auxiliary file for VPASCAL (D) Auxiliary file for VPASCAL
makevp.bat makevp.bat
Philip Hazel <ph10@cam.ac.uk> Philip Hazel
February 2003 Email local part: ph10
Email domain: cam.ac.uk
August 2005

View File

@@ -1,135 +0,0 @@
#! /bin/sh
# This file is generated by configure from RunTest.in. Make any changes
# to that file.
# Run PCRE tests
cf=diff
testdata=@top_srcdir@/testdata
# Select which tests to run; if no selection, run all
do1=no
do2=no
do3=no
do4=no
do5=no
while [ $# -gt 0 ] ; do
case $1 in
1) do1=yes;;
2) do2=yes;;
3) do3=yes;;
4) do4=yes;;
5) do5=yes;;
*) echo "Unknown test number $1"; exit 1;;
esac
shift
done
if [ "@UTF8@" = "" ] ; then
if [ $do4 = yes ] ; then
echo "Can't run test 4 because UFT8 support is not configured"
exit 1
fi
if [ $do5 = yes ] ; then
echo "Can't run test 5 because UFT8 support is not configured"
exit 1
fi
fi
if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a\
$do5 = no ] ; then
do1=yes
do2=yes
do3=yes
if [ "@UTF8@" != "" ] ; then do4=yes; fi
if [ "@UTF8@" != "" ] ; then do5=yes; fi
fi
# Primary test, Perl-compatible
if [ $do1 = yes ] ; then
echo "Testing main functionality (Perl compatible)"
./pcretest $testdata/testinput1 testtry
if [ $? = 0 ] ; then
$cf testtry $testdata/testoutput1
if [ $? != 0 ] ; then exit 1; fi
echo " "
else exit 1
fi
fi
# PCRE tests that are not Perl-compatible - API & error tests, mostly
if [ $do2 = yes ] ; then
echo "Testing API and error handling (not Perl compatible)"
./pcretest -i $testdata/testinput2 testtry
if [ $? = 0 ] ; then
$cf testtry $testdata/testoutput2
if [ $? != 0 ] ; then exit 1; fi
else exit 1
fi
fi
if [ $do1 = yes -a $do2 = yes ] ; then
echo " "
echo "The two main tests ran OK"
echo " "
fi
# Locale-specific tests, provided the "fr" locale is available
if [ $do3 = yes ] ; then
locale -a | grep '^fr$' >/dev/null
if [ $? -eq 0 ] ; then
echo "Testing locale-specific features (using 'fr' locale)"
./pcretest $testdata/testinput3 testtry
if [ $? = 0 ] ; then
$cf testtry $testdata/testoutput3
if [ $? != 0 ] ; then
echo " "
echo "Locale test did not run entirely successfully."
echo "This usually means that there is a problem with the locale"
echo "settings rather than a bug in PCRE."
else
echo "Locale test ran OK"
fi
echo " "
else exit 1
fi
else
echo "Cannot test locale-specific features - 'fr' locale not found,"
echo "or the \"locale\" command is not available to check for it."
echo " "
fi
fi
# Additional tests for UTF8 support
if [ $do4 = yes ] ; then
echo "Testing UTF-8 support (Perl compatible)"
./pcretest $testdata/testinput4 testtry
if [ $? = 0 ] ; then
$cf testtry $testdata/testoutput4
if [ $? != 0 ] ; then exit 1; fi
else exit 1
fi
echo "UTF8 test ran OK"
echo " "
fi
if [ $do5 = yes ] ; then
echo "Testing API and internals for UTF-8 support (not Perl compatible)"
./pcretest $testdata/testinput5 testtry
if [ $? = 0 ] ; then
$cf testtry $testdata/testoutput5
if [ $? != 0 ] ; then exit 1; fi
else exit 1
fi
echo "UTF8 internals test ran OK"
echo " "
fi
# End

3337
libpcre/aclocal.m4 vendored

File diff suppressed because it is too large Load Diff

197
libpcre/config.guess vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh #! /bin/sh
# Attempt to guess a canonical system name. # Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
timestamp='2003-10-03' timestamp='2005-03-24'
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@ version="\
GNU config.guess ($timestamp) GNU config.guess ($timestamp)
Originally written by Per Bothner. Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc. Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
@@ -136,6 +136,23 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
if [ "${UNAME_SYSTEM}" = "Linux" ] ; then
eval $set_cc_for_build
cat << EOF > $dummy.c
#include <features.h>
#ifdef __UCLIBC__
# ifdef __UCLIBC_CONFIG_VERSION__
LIBC=uclibc __UCLIBC_CONFIG_VERSION__
# else
LIBC=uclibc
# endif
#else
LIBC=gnu
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'`
fi
# Note: order is significant - the case branches are not exclusive. # Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
@@ -197,15 +214,21 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
echo "${machine}-${os}${release}" echo "${machine}-${os}${release}"
exit 0 ;; exit 0 ;;
amd64:OpenBSD:*:*)
echo x86_64-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
amiga:OpenBSD:*:*) amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
arc:OpenBSD:*:*) cats:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE} echo arm-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
hp300:OpenBSD:*:*) hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
luna88k:OpenBSD:*:*)
echo m88k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:OpenBSD:*:*) mac68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -221,25 +244,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
mvmeppc:OpenBSD:*:*) mvmeppc:OpenBSD:*:*)
echo powerpc-unknown-openbsd${UNAME_RELEASE} echo powerpc-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
pmax:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sgi:OpenBSD:*:*) sgi:OpenBSD:*:*)
echo mipseb-unknown-openbsd${UNAME_RELEASE} echo mips64-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
sun3:OpenBSD:*:*) sun3:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
wgrisc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
*:OpenBSD:*:*) *:OpenBSD:*:*)
echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:ekkoBSD:*:*)
echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
exit 0 ;;
macppc:MirBSD:*:*)
echo powerppc-unknown-mirbsd${UNAME_RELEASE}
exit 0 ;;
*:MirBSD:*:*)
echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
exit 0 ;;
alpha:OSF1:*:*) alpha:OSF1:*:*)
if test $UNAME_RELEASE = "V4.0"; then case $UNAME_RELEASE in
*4.0)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
fi ;;
*5.*)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
;;
esac
# According to Compaq, /usr/sbin/psrinfo has been available on # According to Compaq, /usr/sbin/psrinfo has been available on
# OSF/1 and Tru64 systems produced since 1995. I hope that # OSF/1 and Tru64 systems produced since 1995. I hope that
# covers most systems running today. This code pipes the CPU # covers most systems running today. This code pipes the CPU
@@ -277,14 +308,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
"EV7.9 (21364A)") "EV7.9 (21364A)")
UNAME_MACHINE="alphaev79" ;; UNAME_MACHINE="alphaev79" ;;
esac esac
# A Pn.n version is a patched version.
# A Vn.n version is a released version. # A Vn.n version is a released version.
# A Tn.n version is a released field test version. # A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel. # A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r. # 1.2 uses "1.2" for uname -r.
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
exit 0 ;;
Alpha*:OpenVMS:*:*)
echo alpha-hp-vms
exit 0 ;; exit 0 ;;
Alpha\ *:Windows_NT*:*) Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem? # How do we know it's Interix rather than the generic POSIX subsystem?
@@ -307,6 +336,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:OS/390:*:*) *:OS/390:*:*)
echo i370-ibm-openedition echo i370-ibm-openedition
exit 0 ;; exit 0 ;;
*:z/VM:*:*)
echo s390-ibm-zvmoe
exit 0 ;;
*:OS400:*:*)
echo powerpc-ibm-os400
exit 0 ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE} echo arm-acorn-riscix${UNAME_RELEASE}
exit 0;; exit 0;;
@@ -327,7 +362,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
DRS?6000:unix:4.0:6*) DRS?6000:unix:4.0:6*)
echo sparc-icl-nx6 echo sparc-icl-nx6
exit 0 ;; exit 0 ;;
DRS?6000:UNIX_SV:4.2*:7*) DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
case `/usr/bin/uname -p` in case `/usr/bin/uname -p` in
sparc) echo sparc-icl-nx7 && exit 0 ;; sparc) echo sparc-icl-nx7 && exit 0 ;;
esac ;; esac ;;
@@ -399,6 +434,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE} echo m68k-unknown-mint${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
m68k:machten:*:*)
echo m68k-apple-machten${UNAME_RELEASE}
exit 0 ;;
powerpc:machten:*:*) powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE} echo powerpc-apple-machten${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -734,7 +772,7 @@ EOF
echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;; exit 0 ;;
*:UNICOS/mp:*:*) *:UNICOS/mp:*:*)
echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;; exit 0 ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
@@ -742,6 +780,11 @@ EOF
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;; exit 0 ;;
5000:UNIX_System_V:4.*:*)
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -751,22 +794,8 @@ EOF
*:BSD/OS:*:*) *:BSD/OS:*:*)
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:FreeBSD:*:*|*:GNU/FreeBSD:*:*) *:FreeBSD:*:*)
# Determine whether the default compiler uses glibc. echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#include <features.h>
#if __GLIBC__ >= 2
LIBC=gnu
#else
LIBC=
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
# GNU/FreeBSD systems have a "k" prefix to indicate we are using
# FreeBSD's kernel, but not the complete OS.
case ${LIBC} in gnu) kernel_only='k' ;; esac
echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
exit 0 ;; exit 0 ;;
i*:CYGWIN*:*) i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin echo ${UNAME_MACHINE}-pc-cygwin
@@ -792,6 +821,9 @@ EOF
i*:UWIN*:*) i*:UWIN*:*)
echo ${UNAME_MACHINE}-pc-uwin echo ${UNAME_MACHINE}-pc-uwin
exit 0 ;; exit 0 ;;
amd64:CYGWIN*:*:*)
echo x86_64-unknown-cygwin
exit 0 ;;
p*:CYGWIN*:*) p*:CYGWIN*:*)
echo powerpcle-unknown-cygwin echo powerpcle-unknown-cygwin
exit 0 ;; exit 0 ;;
@@ -799,22 +831,36 @@ EOF
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;; exit 0 ;;
*:GNU:*:*) *:GNU:*:*)
# the GNU system
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit 0 ;; exit 0 ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
exit 0 ;;
i*86:Minix:*:*) i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix echo ${UNAME_MACHINE}-pc-minix
exit 0 ;; exit 0 ;;
arm*:Linux:*:*) arm*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
cris:Linux:*:*) cris:Linux:*:*)
echo cris-axis-linux-gnu echo cris-axis-linux-${LIBC}
exit 0 ;;
crisv32:Linux:*:*)
echo crisv32-axis-linux-${LIBC}
exit 0 ;;
frv:Linux:*:*)
echo frv-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
ia64:Linux:*:*) ia64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;;
m32r*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
m68*:Linux:*:*) m68*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
mips:Linux:*:*) mips:Linux:*:*)
eval $set_cc_for_build eval $set_cc_for_build
@@ -833,7 +879,7 @@ EOF
#endif #endif
EOF EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 test x"${CPU}" != x && echo "${CPU}-unknown-linux-${LIBC}" && exit 0
;; ;;
mips64:Linux:*:*) mips64:Linux:*:*)
eval $set_cc_for_build eval $set_cc_for_build
@@ -852,13 +898,13 @@ EOF
#endif #endif
EOF EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 test x"${CPU}" != x && echo "${CPU}-unknown-linux-${LIBC}" && exit 0
;; ;;
ppc:Linux:*:*) ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu echo powerpc-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
ppc64:Linux:*:*) ppc64:Linux:*:*)
echo powerpc64-unknown-linux-gnu echo powerpc64-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
alpha:Linux:*:*) alpha:Linux:*:*)
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
@@ -871,34 +917,34 @@ EOF
EV68*) UNAME_MACHINE=alphaev68 ;; EV68*) UNAME_MACHINE=alphaev68 ;;
esac esac
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
parisc:Linux:*:* | hppa:Linux:*:*) parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level # Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
PA7*) echo hppa1.1-unknown-linux-gnu ;; PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
PA8*) echo hppa2.0-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
*) echo hppa-unknown-linux-gnu ;; *) echo hppa-unknown-linux-${LIBC} ;;
esac esac
exit 0 ;; exit 0 ;;
parisc64:Linux:*:* | hppa64:Linux:*:*) parisc64:Linux:*:* | hppa64:Linux:*:*)
echo hppa64-unknown-linux-gnu echo hppa64-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
s390:Linux:*:* | s390x:Linux:*:*) s390:Linux:*:* | s390x:Linux:*:*)
echo ${UNAME_MACHINE}-ibm-linux echo ${UNAME_MACHINE}-ibm-linux
exit 0 ;; exit 0 ;;
sh64*:Linux:*:*) sh64*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
sh*:Linux:*:*) sh*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
sparc:Linux:*:* | sparc64:Linux:*:*) sparc:Linux:*:* | sparc64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
x86_64:Linux:*:*) x86_64:Linux:*:*)
echo x86_64-unknown-linux-gnu echo x86_64-unknown-linux-${LIBC}
exit 0 ;; exit 0 ;;
i*86:Linux:*:*) i*86:Linux:*:*)
# The BFD linker knows what the default object file format is, so # The BFD linker knows what the default object file format is, so
@@ -913,20 +959,21 @@ EOF
p'` p'`
case "$ld_supported_targets" in case "$ld_supported_targets" in
elf32-i386) elf32-i386)
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}"
;; ;;
a.out-i386-linux) a.out-i386-linux)
echo "${UNAME_MACHINE}-pc-linux-gnuaout" echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout"
exit 0 ;; exit 0 ;;
coff-i386) coff-i386)
echo "${UNAME_MACHINE}-pc-linux-gnucoff" echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff"
exit 0 ;; exit 0 ;;
"") "")
# Either a pre-BFD a.out linker (linux-gnuoldld) or # Either a pre-BFD a.out linker (linux-gnuoldld) or
# one that does not give us useful --help. # one that does not give us useful --help.
echo "${UNAME_MACHINE}-pc-linux-gnuoldld" echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld"
exit 0 ;; exit 0 ;;
esac esac
if [ "`echo $LIBC | sed -e 's:uclibc::'`" != "$LIBC" ] ; then echo "$TENTATIVE" && exit 0 ; fi
# Determine whether the default compiler is a.out or elf # Determine whether the default compiler is a.out or elf
eval $set_cc_for_build eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c sed 's/^ //' << EOF >$dummy.c
@@ -981,6 +1028,9 @@ EOF
i*86:atheos:*:*) i*86:atheos:*:*)
echo ${UNAME_MACHINE}-unknown-atheos echo ${UNAME_MACHINE}-unknown-atheos
exit 0 ;; exit 0 ;;
i*86:syllable:*:*)
echo ${UNAME_MACHINE}-pc-syllable
exit 0 ;;
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
echo i386-unknown-lynxos${UNAME_RELEASE} echo i386-unknown-lynxos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -1050,9 +1100,9 @@ EOF
M680?0:D-NIX:5.3:*) M680?0:D-NIX:5.3:*)
echo m68k-diab-dnix echo m68k-diab-dnix
exit 0 ;; exit 0 ;;
M68*:*:R3V[567]*:*) M68*:*:R3V[5678]*:*)
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
OS_REL='' OS_REL=''
test -r /etc/.relid \ test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
@@ -1150,9 +1200,10 @@ EOF
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:Darwin:*:*) *:Darwin:*:*)
case `uname -p` in UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
case $UNAME_PROCESSOR in
*86) UNAME_PROCESSOR=i686 ;; *86) UNAME_PROCESSOR=i686 ;;
powerpc) UNAME_PROCESSOR=powerpc ;; unknown) UNAME_PROCESSOR=powerpc ;;
esac esac
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -1167,7 +1218,10 @@ EOF
*:QNX:*:4*) *:QNX:*:4*)
echo i386-pc-qnx echo i386-pc-qnx
exit 0 ;; exit 0 ;;
NSR-[DGKLNPTVWY]:NONSTOP_KERNEL:*:*) NSE-?:NONSTOP_KERNEL:*:*)
echo nse-tandem-nsk${UNAME_RELEASE}
exit 0 ;;
NSR-?:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE} echo nsr-tandem-nsk${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:NonStop-UX:*:*) *:NonStop-UX:*:*)
@@ -1211,6 +1265,19 @@ EOF
SEI:*:*:SEIUX) SEI:*:*:SEIUX)
echo mips-sei-seiux${UNAME_RELEASE} echo mips-sei-seiux${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:DragonFly:*:*)
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit 0 ;;
*:*VMS:*:*)
UNAME_MACHINE=`(uname -p) 2>/dev/null`
case "${UNAME_MACHINE}" in
A*) echo alpha-dec-vms && exit 0 ;;
I*) echo ia64-dec-vms && exit 0 ;;
V*) echo vax-dec-vms && exit 0 ;;
esac ;;
*:XENIX:*:SysV)
echo i386-pc-xenix
exit 0 ;;
esac esac
#echo '(No uname command or uname output not recognized.)' 1>&2 #echo '(No uname command or uname output not recognized.)' 1>&2
@@ -1370,7 +1437,9 @@ This script, last modified $timestamp, has failed to recognize
the operating system you are using. It is advised that you the operating system you are using. It is advised that you
download the most up to date version of the config scripts from download the most up to date version of the config scripts from
ftp://ftp.gnu.org/pub/gnu/config/ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
and
http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
If the version you run ($0) is already up to date, please If the version you run ($0) is already up to date, please
send the following data and any information you think might be send the following data and any information you think might be

View File

@@ -11,11 +11,25 @@ memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your
system has neither bcopy() nor memmove(), leave them both as 0; an emulation system has neither bcopy() nor memmove(), leave them both as 0; an emulation
function will be used. */ function will be used. */
/* Define to empty if the keyword does not work. */ /* If you are compiling for a system that uses EBCDIC instead of ASCII
character codes, define this macro as 1. On systems that can use "configure",
this can be done via --enable-ebcdic. */
#ifndef EBCDIC
#define EBCDIC 0
#endif
/* If you are compiling for a system that needs some magic to be inserted
before the definition of an exported function, define this macro to contain the
relevant magic. It apears at the start of every exported function. */
#define EXPORT
/* Define to empty if the "const" keyword does not work. */
#undef const #undef const
/* Define to `unsigned' if <stddef.h> doesn't define size_t. */ /* Define to "unsigned" if <stddef.h> doesn't define size_t. */
#undef size_t #undef size_t
@@ -67,4 +81,27 @@ default default. */
#define MATCH_LIMIT 10000000 #define MATCH_LIMIT 10000000
#endif #endif
/* When calling PCRE via the POSIX interface, additional working storage is
required for holding the pointers to capturing substrings because PCRE requires
three integers per substring, whereas the POSIX interface provides only two. If
the number of expected substrings is small, the wrapper function uses space on
the stack, because this is faster than using malloc() for each call. The
threshold above which the stack is no longer use is defined by POSIX_MALLOC_
THRESHOLD. On Unix systems, "configure" can be used to override this default.
*/
#ifndef POSIX_MALLOC_THRESHOLD
#define POSIX_MALLOC_THRESHOLD 10
#endif
/* PCRE uses recursive function calls to handle backtracking while matching.
This can sometimes be a problem on systems that have stacks of limited size.
Define NO_RECURSE to get a version that doesn't use recursion in the match()
function; instead it creates its own stack by steam using pcre_recurse_malloc
to get memory. For more detail, see comments and other stuff just above the
match() function. On Unix systems, "configure" can be used to set this in the
Makefile (use --disable-stack-for-recursion). */
/* #define NO_RECURSE */
/* End */ /* End */

134
libpcre/config.sub vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh #! /bin/sh
# Configuration validation subroutine script. # Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
timestamp='2003-08-18' timestamp='2005-02-10'
# This file is (in principle) common to ALL GNU software. # This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software # The presence of a machine in this file suggests that SOME GNU software
@@ -70,7 +70,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\ version="\
GNU config.sub ($timestamp) GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc. Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
@@ -118,7 +118,8 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations. # Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in case $maybe_os in
nto-qnx* | linux-gnu* | linux-dietlibc | kfreebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;; ;;
@@ -144,7 +145,7 @@ case $os in
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple | -axis) -apple | -axis | -knuth | -cray)
os= os=
basic_machine=$1 basic_machine=$1
;; ;;
@@ -236,7 +237,7 @@ case $basic_machine in
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \ | i370 | i860 | i960 | ia64 \
| ip2k | iq2000 \ | ip2k | iq2000 \
| m32r | m68000 | m68k | m88k | mcore \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
| mips | mipsbe | mipseb | mipsel | mipsle \ | mips | mipsbe | mipseb | mipsel | mipsle \
| mips16 \ | mips16 \
| mips64 | mips64el \ | mips64 | mips64el \
@@ -252,6 +253,7 @@ case $basic_machine in
| mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \ | mipsisa64sr71k | mipsisa64sr71kel \
| mipstx39 | mipstx39el \ | mipstx39 | mipstx39el \
| mips64r5900 | mips64r5900el \
| mn10200 | mn10300 \ | mn10200 | mn10300 \
| msp430 \ | msp430 \
| ns16k | ns32k \ | ns16k | ns32k \
@@ -261,12 +263,12 @@ case $basic_machine in
| pyramid \ | pyramid \
| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \ | sh64 | sh64le \
| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
| strongarm \ | strongarm \
| tahoe | thumb | tic4x | tic80 | tron \ | tahoe | dvp | thumb | tic4x | tic80 | tron \
| v850 | v850e \ | v850 | v850e \
| we32k \ | we32k \
| x86 | xscale | xstormy16 | xtensa \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
| z8k) | z8k)
basic_machine=$basic_machine-unknown basic_machine=$basic_machine-unknown
;; ;;
@@ -299,7 +301,7 @@ case $basic_machine in
| avr-* \ | avr-* \
| bs2000-* \ | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
| clipper-* | cydra-* \ | clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \ | d10v-* | d30v-* | dlx-* \
| elxsi-* \ | elxsi-* \
| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
@@ -307,9 +309,9 @@ case $basic_machine in
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| i*86-* | i860-* | i960-* | ia64-* \ | i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* | iq2000-* \ | ip2k-* | iq2000-* \
| m32r-* \ | m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | mcore-* \ | m88110-* | m88k-* | maxq-* | mcore-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips16-* \ | mips16-* \
| mips64-* | mips64el-* \ | mips64-* | mips64el-* \
@@ -325,8 +327,10 @@ case $basic_machine in
| mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipstx39-* | mipstx39el-* \ | mipstx39-* | mipstx39el-* \
| mips64r5900-* | mips64r5900el-* \
| mmix-* \
| msp430-* \ | msp430-* \
| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | none-* | np1-* | ns16k-* | ns32k-* \
| orion-* \ | orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
@@ -335,14 +339,14 @@ case $basic_machine in
| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \ | tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tron-* \ | tron-* \
| v850-* | v850e-* | vax-* \ | v850-* | v850e-* | vax-* \
| we32k-* \ | we32k-* \
| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
| xtensa-* \ | xstormy16-* | xtensa-* \
| ymp-* \ | ymp-* \
| z8k-*) | z8k-*)
;; ;;
@@ -362,6 +366,9 @@ case $basic_machine in
basic_machine=a29k-amd basic_machine=a29k-amd
os=-udi os=-udi
;; ;;
abacus)
basic_machine=abacus-unknown
;;
adobe68k) adobe68k)
basic_machine=m68010-adobe basic_machine=m68010-adobe
os=-scout os=-scout
@@ -379,6 +386,9 @@ case $basic_machine in
amd64) amd64)
basic_machine=x86_64-pc basic_machine=x86_64-pc
;; ;;
amd64-*)
basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
amdahl) amdahl)
basic_machine=580-amdahl basic_machine=580-amdahl
os=-sysv os=-sysv
@@ -438,12 +448,27 @@ case $basic_machine in
basic_machine=j90-cray basic_machine=j90-cray
os=-unicos os=-unicos
;; ;;
craynv)
basic_machine=craynv-cray
os=-unicosmp
;;
cr16c)
basic_machine=cr16c-unknown
os=-elf
;;
crds | unos) crds | unos)
basic_machine=m68k-crds basic_machine=m68k-crds
;; ;;
crisv32 | crisv32-* | etraxfs*)
basic_machine=crisv32-axis
;;
cris | cris-* | etrax*) cris | cris-* | etrax*)
basic_machine=cris-axis basic_machine=cris-axis
;; ;;
crx)
basic_machine=crx-unknown
os=-elf
;;
da30 | da30-*) da30 | da30-*)
basic_machine=m68k-da30 basic_machine=m68k-da30
;; ;;
@@ -466,6 +491,10 @@ case $basic_machine in
basic_machine=m88k-motorola basic_machine=m88k-motorola
os=-sysv3 os=-sysv3
;; ;;
djgpp)
basic_machine=i586-pc
os=-msdosdjgpp
;;
dpx20 | dpx20-*) dpx20 | dpx20-*)
basic_machine=rs6000-bull basic_machine=rs6000-bull
os=-bosx os=-bosx
@@ -638,16 +667,30 @@ case $basic_machine in
basic_machine=m68k-atari basic_machine=m68k-atari
os=-mint os=-mint
;; ;;
mipsEE* | ee | ps2)
basic_machine=mips64r5900el-scei
case $os in
-linux*)
;;
*)
os=-elf
;;
esac
;;
iop)
basic_machine=mipsel-scei
os=-irx
;;
dvp)
basic_machine=dvp-scei
os=-elf
;;
mips3*-*) mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;; ;;
mips3*) mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;; ;;
mmix*)
basic_machine=mmix-knuth
os=-mmixware
;;
monitor) monitor)
basic_machine=m68k-rom68k basic_machine=m68k-rom68k
os=-coff os=-coff
@@ -728,10 +771,6 @@ case $basic_machine in
np1) np1)
basic_machine=np1-gould basic_machine=np1-gould
;; ;;
nv1)
basic_machine=nv1-cray
os=-unicosmp
;;
nsr-tandem) nsr-tandem)
basic_machine=nsr-tandem basic_machine=nsr-tandem
;; ;;
@@ -743,6 +782,10 @@ case $basic_machine in
basic_machine=or32-unknown basic_machine=or32-unknown
os=-coff os=-coff
;; ;;
os400)
basic_machine=powerpc-ibm
os=-os400
;;
OSE68000 | ose68000) OSE68000 | ose68000)
basic_machine=m68000-ericsson basic_machine=m68000-ericsson
os=-ose os=-ose
@@ -963,6 +1006,10 @@ case $basic_machine in
tower | tower-32) tower | tower-32)
basic_machine=m68k-ncr basic_machine=m68k-ncr
;; ;;
tpf)
basic_machine=s390x-ibm
os=-tpf
;;
udi29k) udi29k)
basic_machine=a29k-amd basic_machine=a29k-amd
os=-udi os=-udi
@@ -1006,6 +1053,10 @@ case $basic_machine in
basic_machine=hppa1.1-winbond basic_machine=hppa1.1-winbond
os=-proelf os=-proelf
;; ;;
xbox)
basic_machine=i686-pc
os=-mingw32
;;
xps | xps100) xps | xps100)
basic_machine=xps100-honeywell basic_machine=xps100-honeywell
;; ;;
@@ -1036,6 +1087,9 @@ case $basic_machine in
romp) romp)
basic_machine=romp-ibm basic_machine=romp-ibm
;; ;;
mmix)
basic_machine=mmix-knuth
;;
rs6000) rs6000)
basic_machine=rs6000-ibm basic_machine=rs6000-ibm
;; ;;
@@ -1058,7 +1112,7 @@ case $basic_machine in
sh64) sh64)
basic_machine=sh64-unknown basic_machine=sh64-unknown
;; ;;
sparc | sparcv9 | sparcv9b) sparc | sparcv8 | sparcv9 | sparcv9b)
basic_machine=sparc-sun basic_machine=sparc-sun
;; ;;
cydra) cydra)
@@ -1131,19 +1185,20 @@ case $os in
| -aos* \ | -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* \ | -chorusos* | -chorusrdb* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei*) | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* | -irx*)
# Remember, each alternative MUST END IN *, to match a version number. # Remember, each alternative MUST END IN *, to match a version number.
;; ;;
-qnx*) -qnx*)
@@ -1182,6 +1237,9 @@ case $os in
-opened*) -opened*)
os=-openedition os=-openedition
;; ;;
-os400*)
os=-os400
;;
-wince*) -wince*)
os=-wince os=-wince
;; ;;
@@ -1203,6 +1261,9 @@ case $os in
-atheos*) -atheos*)
os=-atheos os=-atheos
;; ;;
-syllable*)
os=-syllable
;;
-386bsd) -386bsd)
os=-bsd os=-bsd
;; ;;
@@ -1225,6 +1286,9 @@ case $os in
-sinix*) -sinix*)
os=-sysv4 os=-sysv4
;; ;;
-tpf*)
os=-tpf
;;
-triton*) -triton*)
os=-sysv3 os=-sysv3
;; ;;
@@ -1261,6 +1325,9 @@ case $os in
-kaos*) -kaos*)
os=-kaos os=-kaos
;; ;;
-zvmoe)
os=-zvmoe
;;
-none) -none)
;; ;;
*) *)
@@ -1341,6 +1408,9 @@ case $basic_machine in
*-ibm) *-ibm)
os=-aix os=-aix
;; ;;
*-knuth)
os=-mmixware
;;
*-wec) *-wec)
os=-proelf os=-proelf
;; ;;
@@ -1473,9 +1543,15 @@ case $basic_machine in
-mvs* | -opened*) -mvs* | -opened*)
vendor=ibm vendor=ibm
;; ;;
-os400*)
vendor=ibm
;;
-ptx*) -ptx*)
vendor=sequent vendor=sequent
;; ;;
-tpf*)
vendor=ibm
;;
-vxsim* | -vxworks* | -windiss*) -vxsim* | -vxworks* | -windiss*)
vendor=wrs vendor=wrs
;; ;;

324
libpcre/configure vendored
View File

@@ -309,7 +309,7 @@ ac_includes_default="\
# include <unistd.h> # include <unistd.h>
#endif" #endif"
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB CPP EGREP BUILD_EXEEXT BUILD_OBJEXT CC_FOR_BUILD CFLAGS_FOR_BUILD HAVE_MEMMOVE HAVE_STRERROR LINK_SIZE MATCH_LIMIT NEWLINE PCRE_MAJOR PCRE_MINOR PCRE_DATE PCRE_VERSION PCRE_LIB_VERSION PCRE_POSIXLIB_VERSION POSIX_MALLOC_THRESHOLD UTF8 POSIX_OBJ POSIX_LOBJ POSIX_LIB LIBOBJS LTLIBOBJS' ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB CPP EGREP pcre_have_long_long pcre_have_ulong_long BUILD_EXEEXT BUILD_OBJEXT CC_FOR_BUILD CFLAGS_FOR_BUILD EBCDIC HAVE_MEMMOVE HAVE_STRERROR LINK_SIZE MATCH_LIMIT NEWLINE NO_RECURSE PCRE_MAJOR PCRE_MINOR PCRE_DATE PCRE_VERSION PCRE_LIB_VERSION PCRE_POSIXLIB_VERSION POSIX_MALLOC_THRESHOLD UCP UTF8 POSIX_OBJ POSIX_LOBJ POSIX_LIB LIBOBJS LTLIBOBJS'
ac_subst_files='' ac_subst_files=''
# Initialize some variables set by options. # Initialize some variables set by options.
@@ -841,8 +841,11 @@ Optional Features:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-utf8 enable UTF8 support --enable-utf8 enable UTF8 support
--enable-unicode-properties enable Unicode properties support
--enable-newline-is-cr use CR as the newline character --enable-newline-is-cr use CR as the newline character
--enable-newline-is-lf use LF as the newline character --enable-newline-is-lf use LF as the newline character
--enable-ebcdic assume EBCDIC coding rather than ASCII
--disable-stack-for-recursion disable use of stack recursion when matching
Optional Packages: Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -1306,9 +1309,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
PCRE_MAJOR=4 PCRE_MAJOR=6
PCRE_MINOR=3 PCRE_MINOR=3
PCRE_DATE=21-May-2003 PCRE_DATE=15-Aug-2005
PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR} PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
@@ -2249,6 +2252,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
@@ -2333,6 +2337,7 @@ fi
CC_FOR_BUILD=${CC_FOR_BUILD:-'$(CC)'} CC_FOR_BUILD=${CC_FOR_BUILD:-'$(CC)'}
CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CFLAGS)'} CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CFLAGS)'}
CPPFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CPPFLAGS)'}
BUILD_EXEEXT=${BUILD_EXEEXT:-'$(EXEEXT)'} BUILD_EXEEXT=${BUILD_EXEEXT:-'$(EXEEXT)'}
BUILD_OBJEXT=${BUILD_OBJEXT:-'$(OBJEXT)'} BUILD_OBJEXT=${BUILD_OBJEXT:-'$(OBJEXT)'}
@@ -3152,11 +3157,150 @@ _ACEOF
fi fi
echo "$as_me:$LINENO: checking for long long" >&5
echo $ECHO_N "checking for long long... $ECHO_C" >&6
if test "${ac_cv_type_long_long+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
int
main ()
{
if ((long long *) 0)
return 0;
if (sizeof (long long))
return 0;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_long_long=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_type_long_long=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
echo "${ECHO_T}$ac_cv_type_long_long" >&6
if test $ac_cv_type_long_long = yes; then
cat >>confdefs.h <<_ACEOF
#define HAVE_LONG_LONG 1
_ACEOF
pcre_have_long_long="1"
else
pcre_have_long_long="0"
fi
echo "$as_me:$LINENO: checking for unsigned long long" >&5
echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
if test "${ac_cv_type_unsigned_long_long+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
$ac_includes_default
int
main ()
{
if ((unsigned long long *) 0)
return 0;
if (sizeof (unsigned long long))
return 0;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag"
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_unsigned_long_long=yes
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_type_unsigned_long_long=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
if test $ac_cv_type_unsigned_long_long = yes; then
cat >>confdefs.h <<_ACEOF
#define HAVE_UNSIGNED_LONG_LONG 1
_ACEOF
pcre_have_ulong_long="1"
else
pcre_have_ulong_long="0"
fi
for ac_func in bcopy memmove strerror
for ac_func in bcopy memmove strerror strtoq strtoll
do do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:$LINENO: checking for $ac_func" >&5 echo "$as_me:$LINENO: checking for $ac_func" >&5
@@ -3269,6 +3413,16 @@ fi
fi; fi;
# Check whether --enable-unicode-properties or --disable-unicode-properties was given.
if test "${enable_unicode_properties+set}" = set; then
enableval="$enable_unicode_properties"
if test "$enableval" = "yes"; then
UCP=-DSUPPORT_UCP
fi
fi;
# Check whether --enable-newline-is-cr or --disable-newline-is-cr was given. # Check whether --enable-newline-is-cr or --disable-newline-is-cr was given.
if test "${enable_newline_is_cr+set}" = set; then if test "${enable_newline_is_cr+set}" = set; then
enableval="$enable_newline_is_cr" enableval="$enable_newline_is_cr"
@@ -3289,6 +3443,26 @@ fi
fi; fi;
# Check whether --enable-ebcdic or --disable-ebcdic was given.
if test "${enable_ebcdic+set}" = set; then
enableval="$enable_ebcdic"
if test "$enableval" == "yes"; then
EBCDIC=-DEBCDIC=1
fi
fi;
# Check whether --enable-stack-for-recursion or --disable-stack-for-recursion was given.
if test "${enable_stack_for_recursion+set}" = set; then
enableval="$enable_stack_for_recursion"
if test "$enableval" = "no"; then
NO_RECURSE=-DNO_RECURSE
fi
fi;
# Check whether --with-posix-malloc-threshold or --without-posix-malloc-threshold was given. # Check whether --with-posix-malloc-threshold or --without-posix-malloc-threshold was given.
@@ -3317,6 +3491,13 @@ if test "${with_match_limit+set}" = set; then
fi; fi;
if test "$UCP" != "" ; then
UTF8=-DSUPPORT_UTF8
fi
@@ -3341,14 +3522,14 @@ fi;
if test "x$enable_shared" = "xno" ; then if test "x$enable_shared" = "xno" ; then
cat >>confdefs.h <<\_ACEOF
cat >>confdefs.h <<\_ACEOF
#define PCRE_STATIC 1 #define PCRE_STATIC 1
_ACEOF _ACEOF
fi fi
ac_config_files="$ac_config_files Makefile pcre.h:pcre.in pcre-config:pcre-config.in" ac_config_files="$ac_config_files Makefile pcre.h:pcre.in"
ac_config_commands="$ac_config_commands default"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure # This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure # tests run on this system so they can be shared between configure
@@ -3766,9 +3947,6 @@ $config_files
Configuration headers: Configuration headers:
$config_headers $config_headers
Configuration commands:
$config_commands
Report bugs to <bug-autoconf@gnu.org>." Report bugs to <bug-autoconf@gnu.org>."
_ACEOF _ACEOF
@@ -3878,8 +4056,6 @@ do
# Handling of arguments. # Handling of arguments.
"Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"pcre.h" ) CONFIG_FILES="$CONFIG_FILES pcre.h:pcre.in" ;; "pcre.h" ) CONFIG_FILES="$CONFIG_FILES pcre.h:pcre.in" ;;
"pcre-config" ) CONFIG_FILES="$CONFIG_FILES pcre-config:pcre-config.in" ;;
"default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
"config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
*) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
echo "$as_me: error: invalid argument: $ac_config_target" >&2;} echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
@@ -3894,7 +4070,6 @@ done
if $ac_need_defaults; then if $ac_need_defaults; then
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi fi
# Have a temporary directory for convenience. Make it in the build tree # Have a temporary directory for convenience. Make it in the build tree
@@ -3977,15 +4152,19 @@ s,@RANLIB@,$RANLIB,;t t
s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
s,@CPP@,$CPP,;t t s,@CPP@,$CPP,;t t
s,@EGREP@,$EGREP,;t t s,@EGREP@,$EGREP,;t t
s,@pcre_have_long_long@,$pcre_have_long_long,;t t
s,@pcre_have_ulong_long@,$pcre_have_ulong_long,;t t
s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t
s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t
s,@CC_FOR_BUILD@,$CC_FOR_BUILD,;t t s,@CC_FOR_BUILD@,$CC_FOR_BUILD,;t t
s,@CFLAGS_FOR_BUILD@,$CFLAGS_FOR_BUILD,;t t s,@CFLAGS_FOR_BUILD@,$CFLAGS_FOR_BUILD,;t t
s,@EBCDIC@,$EBCDIC,;t t
s,@HAVE_MEMMOVE@,$HAVE_MEMMOVE,;t t s,@HAVE_MEMMOVE@,$HAVE_MEMMOVE,;t t
s,@HAVE_STRERROR@,$HAVE_STRERROR,;t t s,@HAVE_STRERROR@,$HAVE_STRERROR,;t t
s,@LINK_SIZE@,$LINK_SIZE,;t t s,@LINK_SIZE@,$LINK_SIZE,;t t
s,@MATCH_LIMIT@,$MATCH_LIMIT,;t t s,@MATCH_LIMIT@,$MATCH_LIMIT,;t t
s,@NEWLINE@,$NEWLINE,;t t s,@NEWLINE@,$NEWLINE,;t t
s,@NO_RECURSE@,$NO_RECURSE,;t t
s,@PCRE_MAJOR@,$PCRE_MAJOR,;t t s,@PCRE_MAJOR@,$PCRE_MAJOR,;t t
s,@PCRE_MINOR@,$PCRE_MINOR,;t t s,@PCRE_MINOR@,$PCRE_MINOR,;t t
s,@PCRE_DATE@,$PCRE_DATE,;t t s,@PCRE_DATE@,$PCRE_DATE,;t t
@@ -3993,6 +4172,7 @@ s,@PCRE_VERSION@,$PCRE_VERSION,;t t
s,@PCRE_LIB_VERSION@,$PCRE_LIB_VERSION,;t t s,@PCRE_LIB_VERSION@,$PCRE_LIB_VERSION,;t t
s,@PCRE_POSIXLIB_VERSION@,$PCRE_POSIXLIB_VERSION,;t t s,@PCRE_POSIXLIB_VERSION@,$PCRE_POSIXLIB_VERSION,;t t
s,@POSIX_MALLOC_THRESHOLD@,$POSIX_MALLOC_THRESHOLD,;t t s,@POSIX_MALLOC_THRESHOLD@,$POSIX_MALLOC_THRESHOLD,;t t
s,@UCP@,$UCP,;t t
s,@UTF8@,$UTF8,;t t s,@UTF8@,$UTF8,;t t
s,@POSIX_OBJ@,$POSIX_OBJ,;t t s,@POSIX_OBJ@,$POSIX_OBJ,;t t
s,@POSIX_LOBJ@,$POSIX_LOBJ,;t t s,@POSIX_LOBJ@,$POSIX_LOBJ,;t t
@@ -4455,124 +4635,6 @@ echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
fi fi
done done
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF
#
# CONFIG_COMMANDS section.
#
for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_dest" : 'X\(//\)[^/]' \| \
X"$ac_dest" : 'X\(//\)$' \| \
X"$ac_dest" : 'X\(/\)' \| \
. : '\(.\)' 2>/dev/null ||
echo X"$ac_dest" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
/^X\(\/\/\)[^/].*/{ s//\1/; q; }
/^X\(\/\/\)$/{ s//\1/; q; }
/^X\(\/\).*/{ s//\1/; q; }
s/.*/./; q'`
{ if $as_mkdir_p; then
mkdir -p "$ac_dir"
else
as_dir="$ac_dir"
as_dirs=
while test ! -d "$as_dir"; do
as_dirs="$as_dir $as_dirs"
as_dir=`(dirname "$as_dir") 2>/dev/null ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| \
. : '\(.\)' 2>/dev/null ||
echo X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
/^X\(\/\/\)[^/].*/{ s//\1/; q; }
/^X\(\/\/\)$/{ s//\1/; q; }
/^X\(\/\).*/{ s//\1/; q; }
s/.*/./; q'`
done
test ! -n "$as_dirs" || mkdir $as_dirs
fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
{ (exit 1); exit 1; }; }; }
ac_builddir=.
if test "$ac_dir" != .; then
ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
# A "../" for each directory in $ac_dir_suffix.
ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
else
ac_dir_suffix= ac_top_builddir=
fi
case $srcdir in
.) # No --srcdir option. We are building in place.
ac_srcdir=.
if test -z "$ac_top_builddir"; then
ac_top_srcdir=.
else
ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
fi ;;
[\\/]* | ?:[\\/]* ) # Absolute path.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir ;;
*) # Relative path.
ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_builddir$srcdir ;;
esac
# Do not use `cd foo && pwd` to compute absolute paths, because
# the directories may not exist.
case `pwd` in
.) ac_abs_builddir="$ac_dir";;
*)
case "$ac_dir" in
.) ac_abs_builddir=`pwd`;;
[\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
*) ac_abs_builddir=`pwd`/"$ac_dir";;
esac;;
esac
case $ac_abs_builddir in
.) ac_abs_top_builddir=${ac_top_builddir}.;;
*)
case ${ac_top_builddir}. in
.) ac_abs_top_builddir=$ac_abs_builddir;;
[\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
*) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
esac;;
esac
case $ac_abs_builddir in
.) ac_abs_srcdir=$ac_srcdir;;
*)
case $ac_srcdir in
.) ac_abs_srcdir=$ac_abs_builddir;;
[\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
*) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
esac;;
esac
case $ac_abs_builddir in
.) ac_abs_top_srcdir=$ac_top_srcdir;;
*)
case $ac_top_srcdir in
.) ac_abs_top_srcdir=$ac_abs_builddir;;
[\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
*) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
esac;;
esac
{ echo "$as_me:$LINENO: executing $ac_dest commands" >&5
echo "$as_me: executing $ac_dest commands" >&6;}
case $ac_dest in
default ) chmod a+x pcre-config ;;
esac
done
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF cat >>$CONFIG_STATUS <<\_ACEOF

View File

@@ -1,7 +1,13 @@
dnl Process this file with autoconf to produce a configure script.
dnl This has been stripped down a bit by fyodor@insecure.org for dnl This has been stripped down a bit by fyodor@insecure.org for
dnl inclusion in Nmap (removed libtool and dynamic library stuff) dnl inclusion in Nmap (removed libtool and dynamic library stuff)
dnl Process this file with autoconf to produce a configure script. dnl This configure.in file has been hacked around quite a lot as a result of
dnl patches that various people have sent to me (PH). Sometimes the information
dnl I get is contradictory. I've tried to put in comments that explain things,
dnl but in some cases the information is second-hand and I have no way of
dnl verifying it. I am not an autoconf or libtool expert!
dnl This is required at the start; the name is the name of a file dnl This is required at the start; the name is the name of a file
dnl it should be seeing, to verify it is in the same directory. dnl it should be seeing, to verify it is in the same directory.
@@ -23,9 +29,9 @@ dnl macro, and may be treated as octal constants. Stick to single
dnl digits for minor numbers less than 10. There are unlikely to be dnl digits for minor numbers less than 10. There are unlikely to be
dnl that many releases anyway. dnl that many releases anyway.
PCRE_MAJOR=4 PCRE_MAJOR=6
PCRE_MINOR=3 PCRE_MINOR=3
PCRE_DATE=21-May-2003 PCRE_DATE=15-Aug-2005
PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR} PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
dnl Default values for miscellaneous macros dnl Default values for miscellaneous macros
@@ -41,6 +47,7 @@ PCRE_POSIXLIB_VERSION=0:0:0
dnl Checks for programs. dnl Checks for programs.
AC_PROG_CC AC_PROG_CC
AC_PROG_RANLIB AC_PROG_RANLIB
dnl We need to find a compiler for compiling a program to run on the local host dnl We need to find a compiler for compiling a program to run on the local host
@@ -48,12 +55,13 @@ dnl while building. It needs to be different from CC when cross-compiling.
dnl There is a macro called AC_PROG_CC_FOR_BUILD in the GNU archive for dnl There is a macro called AC_PROG_CC_FOR_BUILD in the GNU archive for
dnl figuring this out automatically. Unfortunately, it does not work with the dnl figuring this out automatically. Unfortunately, it does not work with the
dnl latest versions of autoconf. So for the moment, we just default to the dnl latest versions of autoconf. So for the moment, we just default to the
dnl same values as the "main" compiler. People who are corss-compiling will dnl same values as the "main" compiler. People who are cross-compiling will
dnl just have to adjust the Makefile by hand or set these values when they dnl just have to adjust the Makefile by hand or set these values when they
dnl run "configure". dnl run "configure".
CC_FOR_BUILD=${CC_FOR_BUILD:-'$(CC)'} CC_FOR_BUILD=${CC_FOR_BUILD:-'$(CC)'}
CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CFLAGS)'} CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CFLAGS)'}
CPPFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CPPFLAGS)'}
BUILD_EXEEXT=${BUILD_EXEEXT:-'$(EXEEXT)'} BUILD_EXEEXT=${BUILD_EXEEXT:-'$(EXEEXT)'}
BUILD_OBJEXT=${BUILD_OBJEXT:-'$(OBJEXT)'} BUILD_OBJEXT=${BUILD_OBJEXT:-'$(OBJEXT)'}
@@ -67,9 +75,14 @@ dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST AC_C_CONST
AC_TYPE_SIZE_T AC_TYPE_SIZE_T
AC_CHECK_TYPES([long long], [pcre_have_long_long="1"], [pcre_have_long_long="0"])
AC_CHECK_TYPES([unsigned long long], [pcre_have_ulong_long="1"], [pcre_have_ulong_long="0"])
AC_SUBST(pcre_have_long_long)
AC_SUBST(pcre_have_ulong_long)
dnl Checks for library functions. dnl Checks for library functions.
AC_CHECK_FUNCS(bcopy memmove strerror) AC_CHECK_FUNCS(bcopy memmove strerror strtoq strtoll)
dnl Handle --enable-utf8 dnl Handle --enable-utf8
@@ -80,6 +93,15 @@ if test "$enableval" = "yes"; then
fi fi
) )
dnl Handle --enable-unicode-properties
AC_ARG_ENABLE(unicode-properties,
[ --enable-unicode-properties enable Unicode properties support],
if test "$enableval" = "yes"; then
UCP=-DSUPPORT_UCP
fi
)
dnl Handle --enable-newline-is-cr dnl Handle --enable-newline-is-cr
AC_ARG_ENABLE(newline-is-cr, AC_ARG_ENABLE(newline-is-cr,
@@ -98,6 +120,24 @@ if test "$enableval" = "yes"; then
fi fi
) )
dnl Handle --enable-ebcdic
AC_ARG_ENABLE(ebcdic,
[ --enable-ebcdic assume EBCDIC coding rather than ASCII],
if test "$enableval" == "yes"; then
EBCDIC=-DEBCDIC=1
fi
)
dnl Handle --disable-stack-for-recursion
AC_ARG_ENABLE(stack-for-recursion,
[ --disable-stack-for-recursion disable use of stack recursion when matching],
if test "$enableval" = "no"; then
NO_RECURSE=-DNO_RECURSE
fi
)
dnl There doesn't seem to be a straightforward way of having parameters dnl There doesn't seem to be a straightforward way of having parameters
dnl that set values, other than fudging the --with thing. So that's what dnl that set values, other than fudging the --with thing. So that's what
dnl I've done. dnl I've done.
@@ -123,17 +163,25 @@ AC_ARG_WITH(match-limit,
MATCH_LIMIT=-DMATCH_LIMIT=$withval MATCH_LIMIT=-DMATCH_LIMIT=$withval
) )
dnl Unicode character property support implies UTF-8 support
if test "$UCP" != "" ; then
UTF8=-DSUPPORT_UTF8
fi
dnl "Export" these variables dnl "Export" these variables
AC_SUBST(BUILD_EXEEXT) AC_SUBST(BUILD_EXEEXT)
AC_SUBST(BUILD_OBJEXT) AC_SUBST(BUILD_OBJEXT)
AC_SUBST(CC_FOR_BUILD) AC_SUBST(CC_FOR_BUILD)
AC_SUBST(CFLAGS_FOR_BUILD) AC_SUBST(CFLAGS_FOR_BUILD)
AC_SUBST(EBCDIC)
AC_SUBST(HAVE_MEMMOVE) AC_SUBST(HAVE_MEMMOVE)
AC_SUBST(HAVE_STRERROR) AC_SUBST(HAVE_STRERROR)
AC_SUBST(LINK_SIZE) AC_SUBST(LINK_SIZE)
AC_SUBST(MATCH_LIMIT) AC_SUBST(MATCH_LIMIT)
AC_SUBST(NEWLINE) AC_SUBST(NEWLINE)
AC_SUBST(NO_RECURSE)
AC_SUBST(PCRE_MAJOR) AC_SUBST(PCRE_MAJOR)
AC_SUBST(PCRE_MINOR) AC_SUBST(PCRE_MINOR)
AC_SUBST(PCRE_DATE) AC_SUBST(PCRE_DATE)
@@ -141,16 +189,16 @@ AC_SUBST(PCRE_VERSION)
AC_SUBST(PCRE_LIB_VERSION) AC_SUBST(PCRE_LIB_VERSION)
AC_SUBST(PCRE_POSIXLIB_VERSION) AC_SUBST(PCRE_POSIXLIB_VERSION)
AC_SUBST(POSIX_MALLOC_THRESHOLD) AC_SUBST(POSIX_MALLOC_THRESHOLD)
AC_SUBST(UCP)
AC_SUBST(UTF8) AC_SUBST(UTF8)
AC_SUBST(POSIX_OBJ) AC_SUBST(POSIX_OBJ)
AC_SUBST(POSIX_LOBJ) AC_SUBST(POSIX_LOBJ)
AC_SUBST(POSIX_LIB) AC_SUBST(POSIX_LIB)
if test "x$enable_shared" = "xno" ; then if test "x$enable_shared" = "xno" ; then
AC_DEFINE(PCRE_STATIC,1) AC_DEFINE([PCRE_STATIC],[1],[to link statically])
fi fi
dnl This must be last; it determines what files are written as well as config.h dnl This must be last; it determines what files are written as well as config.h
AC_OUTPUT(Makefile pcre.h:pcre.in pcre-config:pcre-config.in,[chmod a+x pcre-config]) AC_OUTPUT(Makefile pcre.h:pcre.in)

View File

@@ -2,117 +2,135 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* /* PCRE is a library of functions to support regular expressions whose syntax
PCRE 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. and semantics are as close as possible to those of the Perl 5 language.
Written by: Philip Hazel <ph10@cam.ac.uk> Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
Copyright (c) 1997-2001 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Permission is granted to anyone to use this software for any purpose on any Redistribution and use in source and binary forms, with or without
computer system, and to redistribute it freely, subject to the following modification, are permitted provided that the following conditions are met:
restrictions:
1. This software is distributed in the hope that it will be useful, * Redistributions of source code must retain the above copyright notice,
but WITHOUT ANY WARRANTY; without even the implied warranty of this list of conditions and the following disclaimer.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by * Redistributions in binary form must reproduce the above copyright
explicit claim or by omission. notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Altered versions must be plainly marked as such, and must not be * Neither the name of the University of Cambridge nor the names of its
misrepresented as being the original software. contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
4. If PCRE is embedded in any software that is released under the GNU THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
General Purpose Licence (GPL), then the terms of that licence shall AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
supersede any condition above with which it is incompatible. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
See the file Tech.Notes for some information on the internals.
*/ */
/* This is a support program to generate the file chartables.c, containing /* This is a freestanding support program to generate a file containing default
character tables of various kinds. They are built according to the default C character tables for PCRE. The tables are built according to the default C
locale and used as the default tables by PCRE. Now that pcre_maketables is locale. Now that pcre_maketables is a function visible to the outside world, we
a function visible to the outside world, we make use of its code from here in make use of its code from here in order to be consistent. */
order to be consistent. */
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "internal.h" #include "pcre_internal.h"
#define DFTABLES /* maketables.c notices this */ #define DFTABLES /* pcre_maketables.c notices this */
#include "maketables.c" #include "pcre_maketables.c"
int main(void) int main(int argc, char **argv)
{ {
int i; int i;
FILE *f;
const unsigned char *tables = pcre_maketables(); const unsigned char *tables = pcre_maketables();
const unsigned char *base_of_tables = tables;
/* There are two printf() calls here, because gcc in pedantic mode complains if (argc != 2)
{
fprintf(stderr, "dftables: one filename argument is required\n");
return 1;
}
f = fopen(argv[1], "wb");
if (f == NULL)
{
fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]);
return 1;
}
/* There are two fprintf() calls here, because gcc in pedantic mode complains
about the very long string otherwise. */ about the very long string otherwise. */
printf( fprintf(f,
"/*************************************************\n" "/*************************************************\n"
"* Perl-Compatible Regular Expressions *\n" "* Perl-Compatible Regular Expressions *\n"
"*************************************************/\n\n" "*************************************************/\n\n"
"/* This file is automatically written by the dftables 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" "program. If you edit it by hand, you might like to edit the Makefile to \n"
"prevent its ever being regenerated.\n\n"); "prevent its ever being regenerated.\n\n");
printf( fprintf(f,
"This file is #included in the compilation of pcre.c to build the default\n" "This file contains the default tables for characters with codes less than\n"
"character tables which are used when no tables are passed to the compile\n" "128 (ASCII characters). These tables are used when no external tables are\n"
"function. */\n\n" "passed to PCRE. */\n\n"
"static unsigned char pcre_default_tables[] = {\n\n" "const unsigned char _pcre_default_tables[] = {\n\n"
"/* This table is a lower casing table. */\n\n"); "/* This table is a lower casing table. */\n\n");
printf(" "); fprintf(f, " ");
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
if ((i & 7) == 0 && i != 0) printf("\n "); if ((i & 7) == 0 && i != 0) fprintf(f, "\n ");
printf("%3d", *tables++); fprintf(f, "%3d", *tables++);
if (i != 255) printf(","); if (i != 255) fprintf(f, ",");
} }
printf(",\n\n"); fprintf(f, ",\n\n");
printf("/* This table is a case flipping table. */\n\n"); fprintf(f, "/* This table is a case flipping table. */\n\n");
printf(" "); fprintf(f, " ");
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
if ((i & 7) == 0 && i != 0) printf("\n "); if ((i & 7) == 0 && i != 0) fprintf(f, "\n ");
printf("%3d", *tables++); fprintf(f, "%3d", *tables++);
if (i != 255) printf(","); if (i != 255) fprintf(f, ",");
} }
printf(",\n\n"); fprintf(f, ",\n\n");
printf( fprintf(f,
"/* This table contains bit maps for various character classes.\n" "/* This table contains bit maps for various character classes.\n"
"Each map is 32 bytes long and the bits run from the least\n" "Each map is 32 bytes long and the bits run from the least\n"
"significant end of each byte. The classes that have their own\n" "significant end of each byte. The classes that have their own\n"
"maps are: space, xdigit, digit, upper, lower, word, graph\n" "maps are: space, xdigit, digit, upper, lower, word, graph\n"
"print, punct, and cntrl. Other classes are built from combinations. */\n\n"); "print, punct, and cntrl. Other classes are built from combinations. */\n\n");
printf(" "); fprintf(f, " ");
for (i = 0; i < cbit_length; i++) for (i = 0; i < cbit_length; i++)
{ {
if ((i & 7) == 0 && i != 0) if ((i & 7) == 0 && i != 0)
{ {
if ((i & 31) == 0) printf("\n"); if ((i & 31) == 0) fprintf(f, "\n");
printf("\n "); fprintf(f, "\n ");
} }
printf("0x%02x", *tables++); fprintf(f, "0x%02x", *tables++);
if (i != cbit_length - 1) printf(","); if (i != cbit_length - 1) fprintf(f, ",");
} }
printf(",\n\n"); fprintf(f, ",\n\n");
printf( fprintf(f,
"/* This table identifies various classes of character by individual bits:\n" "/* This table identifies various classes of character by individual bits:\n"
" 0x%02x white space character\n" " 0x%02x white space character\n"
" 0x%02x letter\n" " 0x%02x letter\n"
@@ -123,29 +141,31 @@ printf(
ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word, ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,
ctype_meta); ctype_meta);
printf(" "); fprintf(f, " ");
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
if ((i & 7) == 0 && i != 0) if ((i & 7) == 0 && i != 0)
{ {
printf(" /* "); fprintf(f, " /* ");
if (isprint(i-8)) printf(" %c -", i-8); if (isprint(i-8)) fprintf(f, " %c -", i-8);
else printf("%3d-", i-8); else fprintf(f, "%3d-", i-8);
if (isprint(i-1)) printf(" %c ", i-1); if (isprint(i-1)) fprintf(f, " %c ", i-1);
else printf("%3d", i-1); else fprintf(f, "%3d", i-1);
printf(" */\n "); fprintf(f, " */\n ");
} }
printf("0x%02x", *tables++); fprintf(f, "0x%02x", *tables++);
if (i != 255) printf(","); if (i != 255) fprintf(f, ",");
} }
printf("};/* "); fprintf(f, "};/* ");
if (isprint(i-8)) printf(" %c -", i-8); if (isprint(i-8)) fprintf(f, " %c -", i-8);
else printf("%3d-", i-8); else fprintf(f, "%3d-", i-8);
if (isprint(i-1)) printf(" %c ", i-1); if (isprint(i-1)) fprintf(f, " %c ", i-1);
else printf("%3d", i-1); else fprintf(f, "%3d", i-1);
printf(" */\n\n/* End of chartables.c */\n"); fprintf(f, " */\n\n/* End of chartables.c */\n");
fclose(f);
free((void *)base_of_tables);
return 0; return 0;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,59 +0,0 @@
#!/bin/sh
prefix=@prefix@
exec_prefix=@exec_prefix@
exec_prefix_set=no
usage="\
Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]"
if test $# -eq 0; then
echo "${usage}" 1>&2
exit 1
fi
while test $# -gt 0; do
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case $1 in
--prefix=*)
prefix=$optarg
if test $exec_prefix_set = no ; then
exec_prefix=$optarg
fi
;;
--prefix)
echo $prefix
;;
--exec-prefix=*)
exec_prefix=$optarg
exec_prefix_set=yes
;;
--exec-prefix)
echo $exec_prefix
;;
--version)
echo @PCRE_VERSION@
;;
--cflags | --cflags-posix)
if test @includedir@ != /usr/include ; then
includes=-I@includedir@
fi
echo $includes
;;
--libs-posix)
echo -L@libdir@ -lpcreposix -lpcre
;;
--libs)
echo -L@libdir@ -lpcre
;;
*)
echo "${usage}" 1>&2
exit 1
;;
esac
shift
done

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +0,0 @@
EXPORTS
pcre_malloc DATA
pcre_free DATA
pcre_compile
pcre_copy_substring
pcre_exec
pcre_get_substring
pcre_get_substring_list
pcre_free_substring
pcre_free_substring_list
pcre_info
pcre_fullinfo
pcre_maketables
pcre_study
pcre_version
regcomp
regexec
regerror
regfree

258
libpcre/pcre.h Normal file
View File

@@ -0,0 +1,258 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* In its original form, this is the .in file that is transformed by
"configure" into pcre.h.
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
#ifndef _PCRE_H
#define _PCRE_H
/* The file pcre.h is build by "configure". Do not edit it; instead
make changes to pcre.in. */
#define PCRE_MAJOR 6
#define PCRE_MINOR 3
#define PCRE_DATE 15-Aug-2005
/* Win32 uses DLL by default; it needs special stuff for exported functions. */
#ifdef _WIN32
# ifdef PCRE_DEFINITION
# ifdef DLL_EXPORT
# define PCRE_DATA_SCOPE __declspec(dllexport)
# endif
# else
# ifndef PCRE_STATIC
# define PCRE_DATA_SCOPE extern __declspec(dllimport)
# endif
# endif
#endif
/* For other operating systems, we use the standard "extern". */
#ifndef PCRE_DATA_SCOPE
# ifdef __cplusplus
# define PCRE_DATA_SCOPE extern "C"
# else
# define PCRE_DATA_SCOPE extern
# endif
#endif
/* Have to include stdlib.h in order to ensure that size_t is defined;
it is needed here for malloc. */
#include <stdlib.h>
/* Allow for C++ users */
#ifdef __cplusplus
extern "C" {
#endif
/* Options */
#define PCRE_CASELESS 0x00000001
#define PCRE_MULTILINE 0x00000002
#define PCRE_DOTALL 0x00000004
#define PCRE_EXTENDED 0x00000008
#define PCRE_ANCHORED 0x00000010
#define PCRE_DOLLAR_ENDONLY 0x00000020
#define PCRE_EXTRA 0x00000040
#define PCRE_NOTBOL 0x00000080
#define PCRE_NOTEOL 0x00000100
#define PCRE_UNGREEDY 0x00000200
#define PCRE_NOTEMPTY 0x00000400
#define PCRE_UTF8 0x00000800
#define PCRE_NO_AUTO_CAPTURE 0x00001000
#define PCRE_NO_UTF8_CHECK 0x00002000
#define PCRE_AUTO_CALLOUT 0x00004000
#define PCRE_PARTIAL 0x00008000
#define PCRE_DFA_SHORTEST 0x00010000
#define PCRE_DFA_RESTART 0x00020000
#define PCRE_FIRSTLINE 0x00040000
/* Exec-time and get/set-time error codes */
#define PCRE_ERROR_NOMATCH (-1)
#define PCRE_ERROR_NULL (-2)
#define PCRE_ERROR_BADOPTION (-3)
#define PCRE_ERROR_BADMAGIC (-4)
#define PCRE_ERROR_UNKNOWN_NODE (-5)
#define PCRE_ERROR_NOMEMORY (-6)
#define PCRE_ERROR_NOSUBSTRING (-7)
#define PCRE_ERROR_MATCHLIMIT (-8)
#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
#define PCRE_ERROR_BADUTF8 (-10)
#define PCRE_ERROR_BADUTF8_OFFSET (-11)
#define PCRE_ERROR_PARTIAL (-12)
#define PCRE_ERROR_BADPARTIAL (-13)
#define PCRE_ERROR_INTERNAL (-14)
#define PCRE_ERROR_BADCOUNT (-15)
#define PCRE_ERROR_DFA_UITEM (-16)
#define PCRE_ERROR_DFA_UCOND (-17)
#define PCRE_ERROR_DFA_UMLIMIT (-18)
#define PCRE_ERROR_DFA_WSSIZE (-19)
#define PCRE_ERROR_DFA_RECURSE (-20)
/* Request types for pcre_fullinfo() */
#define PCRE_INFO_OPTIONS 0
#define PCRE_INFO_SIZE 1
#define PCRE_INFO_CAPTURECOUNT 2
#define PCRE_INFO_BACKREFMAX 3
#define PCRE_INFO_FIRSTBYTE 4
#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */
#define PCRE_INFO_FIRSTTABLE 5
#define PCRE_INFO_LASTLITERAL 6
#define PCRE_INFO_NAMEENTRYSIZE 7
#define PCRE_INFO_NAMECOUNT 8
#define PCRE_INFO_NAMETABLE 9
#define PCRE_INFO_STUDYSIZE 10
#define PCRE_INFO_DEFAULT_TABLES 11
/* Request types for pcre_config() */
#define PCRE_CONFIG_UTF8 0
#define PCRE_CONFIG_NEWLINE 1
#define PCRE_CONFIG_LINK_SIZE 2
#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
#define PCRE_CONFIG_MATCH_LIMIT 4
#define PCRE_CONFIG_STACKRECURSE 5
#define PCRE_CONFIG_UNICODE_PROPERTIES 6
/* Bit flags for the pcre_extra structure */
#define PCRE_EXTRA_STUDY_DATA 0x0001
#define PCRE_EXTRA_MATCH_LIMIT 0x0002
#define PCRE_EXTRA_CALLOUT_DATA 0x0004
#define PCRE_EXTRA_TABLES 0x0008
/* Types */
struct real_pcre; /* declaration; the definition is private */
typedef struct real_pcre pcre;
/* The structure for passing additional data to pcre_exec(). This is defined in
such as way as to be extensible. Always add new fields at the end, in order to
remain compatible. */
typedef struct pcre_extra {
unsigned long int flags; /* Bits for which fields are set */
void *study_data; /* Opaque data from pcre_study() */
unsigned long int match_limit; /* Maximum number of calls to match() */
void *callout_data; /* Data passed back in callouts */
const unsigned char *tables; /* Pointer to character tables */
} pcre_extra;
/* The structure for passing out data via the pcre_callout_function. We use a
structure so that new fields can be added on the end in future versions,
without changing the API of the function, thereby allowing old clients to work
without modification. */
typedef struct pcre_callout_block {
int version; /* Identifies version of block */
/* ------------------------ Version 0 ------------------------------- */
int callout_number; /* Number compiled into pattern */
int *offset_vector; /* The offset vector */
const char *subject; /* The subject being matched */
int subject_length; /* The length of the subject */
int start_match; /* Offset to start of this match attempt */
int current_position; /* Where we currently are in the subject */
int capture_top; /* Max current capture */
int capture_last; /* Most recently closed capture */
void *callout_data; /* Data passed in with the call */
/* ------------------- Added for Version 1 -------------------------- */
int pattern_position; /* Offset to next item in the pattern */
int next_item_length; /* Length of next item in the pattern */
/* ------------------------------------------------------------------ */
} pcre_callout_block;
/* Indirection for store get and free functions. These can be set to
alternative malloc/free functions if required. Special ones are used in the
non-recursive case for "frames". There is also an optional callout function
that is triggered by the (?) regex item. For Virtual Pascal, these definitions
have to take another form. */
#ifndef VPCOMPAT
PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
PCRE_DATA_SCOPE void (*pcre_free)(void *);
PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
PCRE_DATA_SCOPE void (*pcre_stack_free)(void *);
PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
#else /* VPCOMPAT */
PCRE_DATA_SCOPE void *pcre_malloc(size_t);
PCRE_DATA_SCOPE void pcre_free(void *);
PCRE_DATA_SCOPE void *pcre_stack_malloc(size_t);
PCRE_DATA_SCOPE void pcre_stack_free(void *);
PCRE_DATA_SCOPE int pcre_callout(pcre_callout_block *);
#endif /* VPCOMPAT */
/* Exported PCRE functions */
PCRE_DATA_SCOPE pcre *pcre_compile(const char *, int, const char **, int *,
const unsigned char *);
PCRE_DATA_SCOPE pcre *pcre_compile2(const char *, int, int *, const char **,
int *, const unsigned char *);
PCRE_DATA_SCOPE int pcre_config(int, void *);
PCRE_DATA_SCOPE int pcre_copy_named_substring(const pcre *, const char *,
int *, int, const char *, char *, int);
PCRE_DATA_SCOPE int pcre_copy_substring(const char *, int *, int, int, char *,
int);
PCRE_DATA_SCOPE int pcre_dfa_exec(const pcre *, const pcre_extra *,
const char *, int, int, int, int *, int , int *, int);
PCRE_DATA_SCOPE int pcre_exec(const pcre *, const pcre_extra *, const char *,
int, int, int, int *, int);
PCRE_DATA_SCOPE void pcre_free_substring(const char *);
PCRE_DATA_SCOPE void pcre_free_substring_list(const char **);
PCRE_DATA_SCOPE int pcre_fullinfo(const pcre *, const pcre_extra *, int,
void *);
PCRE_DATA_SCOPE int pcre_get_named_substring(const pcre *, const char *,
int *, int, const char *, const char **);
PCRE_DATA_SCOPE int pcre_get_stringnumber(const pcre *, const char *);
PCRE_DATA_SCOPE int pcre_get_substring(const char *, int *, int, int,
const char **);
PCRE_DATA_SCOPE int pcre_get_substring_list(const char *, int *, int,
const char ***);
PCRE_DATA_SCOPE int pcre_info(const pcre *, int *, int *);
PCRE_DATA_SCOPE const unsigned char *pcre_maketables(void);
PCRE_DATA_SCOPE int pcre_refcount(pcre *, int);
PCRE_DATA_SCOPE pcre_extra *pcre_study(const pcre *, int, const char **);
PCRE_DATA_SCOPE const char *pcre_version(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* End of pcre.h */

View File

@@ -2,7 +2,39 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* Copyright (c) 1997-2003 University of Cambridge */ /* In its original form, this is the .in file that is transformed by
"configure" into pcre.h.
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
#ifndef _PCRE_H #ifndef _PCRE_H
#define _PCRE_H #define _PCRE_H
@@ -14,7 +46,7 @@ make changes to pcre.in. */
#define PCRE_MINOR @PCRE_MINOR@ #define PCRE_MINOR @PCRE_MINOR@
#define PCRE_DATE @PCRE_DATE@ #define PCRE_DATE @PCRE_DATE@
/* Win32 uses DLL by default */ /* Win32 uses DLL by default; it needs special stuff for exported functions. */
#ifdef _WIN32 #ifdef _WIN32
# ifdef PCRE_DEFINITION # ifdef PCRE_DEFINITION
@@ -23,12 +55,19 @@ make changes to pcre.in. */
# endif # endif
# else # else
# ifndef PCRE_STATIC # ifndef PCRE_STATIC
# define PCRE_DATA_SCOPE __declspec(dllimport) # define PCRE_DATA_SCOPE extern __declspec(dllimport)
# endif # endif
# endif # endif
#endif #endif
/* For other operating systems, we use the standard "extern". */
#ifndef PCRE_DATA_SCOPE #ifndef PCRE_DATA_SCOPE
# define PCRE_DATA_SCOPE extern # ifdef __cplusplus
# define PCRE_DATA_SCOPE extern "C"
# else
# define PCRE_DATA_SCOPE extern
# endif
#endif #endif
/* Have to include stdlib.h in order to ensure that size_t is defined; /* Have to include stdlib.h in order to ensure that size_t is defined;
@@ -44,31 +83,48 @@ extern "C" {
/* Options */ /* Options */
#define PCRE_CASELESS 0x0001 #define PCRE_CASELESS 0x00000001
#define PCRE_MULTILINE 0x0002 #define PCRE_MULTILINE 0x00000002
#define PCRE_DOTALL 0x0004 #define PCRE_DOTALL 0x00000004
#define PCRE_EXTENDED 0x0008 #define PCRE_EXTENDED 0x00000008
#define PCRE_ANCHORED 0x0010 #define PCRE_ANCHORED 0x00000010
#define PCRE_DOLLAR_ENDONLY 0x0020 #define PCRE_DOLLAR_ENDONLY 0x00000020
#define PCRE_EXTRA 0x0040 #define PCRE_EXTRA 0x00000040
#define PCRE_NOTBOL 0x0080 #define PCRE_NOTBOL 0x00000080
#define PCRE_NOTEOL 0x0100 #define PCRE_NOTEOL 0x00000100
#define PCRE_UNGREEDY 0x0200 #define PCRE_UNGREEDY 0x00000200
#define PCRE_NOTEMPTY 0x0400 #define PCRE_NOTEMPTY 0x00000400
#define PCRE_UTF8 0x0800 #define PCRE_UTF8 0x00000800
#define PCRE_NO_AUTO_CAPTURE 0x1000 #define PCRE_NO_AUTO_CAPTURE 0x00001000
#define PCRE_NO_UTF8_CHECK 0x00002000
#define PCRE_AUTO_CALLOUT 0x00004000
#define PCRE_PARTIAL 0x00008000
#define PCRE_DFA_SHORTEST 0x00010000
#define PCRE_DFA_RESTART 0x00020000
#define PCRE_FIRSTLINE 0x00040000
/* Exec-time and get/set-time error codes */ /* Exec-time and get/set-time error codes */
#define PCRE_ERROR_NOMATCH (-1) #define PCRE_ERROR_NOMATCH (-1)
#define PCRE_ERROR_NULL (-2) #define PCRE_ERROR_NULL (-2)
#define PCRE_ERROR_BADOPTION (-3) #define PCRE_ERROR_BADOPTION (-3)
#define PCRE_ERROR_BADMAGIC (-4) #define PCRE_ERROR_BADMAGIC (-4)
#define PCRE_ERROR_UNKNOWN_NODE (-5) #define PCRE_ERROR_UNKNOWN_NODE (-5)
#define PCRE_ERROR_NOMEMORY (-6) #define PCRE_ERROR_NOMEMORY (-6)
#define PCRE_ERROR_NOSUBSTRING (-7) #define PCRE_ERROR_NOSUBSTRING (-7)
#define PCRE_ERROR_MATCHLIMIT (-8) #define PCRE_ERROR_MATCHLIMIT (-8)
#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ #define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
#define PCRE_ERROR_BADUTF8 (-10)
#define PCRE_ERROR_BADUTF8_OFFSET (-11)
#define PCRE_ERROR_PARTIAL (-12)
#define PCRE_ERROR_BADPARTIAL (-13)
#define PCRE_ERROR_INTERNAL (-14)
#define PCRE_ERROR_BADCOUNT (-15)
#define PCRE_ERROR_DFA_UITEM (-16)
#define PCRE_ERROR_DFA_UCOND (-17)
#define PCRE_ERROR_DFA_UMLIMIT (-18)
#define PCRE_ERROR_DFA_WSSIZE (-19)
#define PCRE_ERROR_DFA_RECURSE (-20)
/* Request types for pcre_fullinfo() */ /* Request types for pcre_fullinfo() */
@@ -84,6 +140,7 @@ extern "C" {
#define PCRE_INFO_NAMECOUNT 8 #define PCRE_INFO_NAMECOUNT 8
#define PCRE_INFO_NAMETABLE 9 #define PCRE_INFO_NAMETABLE 9
#define PCRE_INFO_STUDYSIZE 10 #define PCRE_INFO_STUDYSIZE 10
#define PCRE_INFO_DEFAULT_TABLES 11
/* Request types for pcre_config() */ /* Request types for pcre_config() */
@@ -92,12 +149,15 @@ extern "C" {
#define PCRE_CONFIG_LINK_SIZE 2 #define PCRE_CONFIG_LINK_SIZE 2
#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 #define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
#define PCRE_CONFIG_MATCH_LIMIT 4 #define PCRE_CONFIG_MATCH_LIMIT 4
#define PCRE_CONFIG_STACKRECURSE 5
#define PCRE_CONFIG_UNICODE_PROPERTIES 6
/* Bit flags for the pcre_extra structure */ /* Bit flags for the pcre_extra structure */
#define PCRE_EXTRA_STUDY_DATA 0x0001 #define PCRE_EXTRA_STUDY_DATA 0x0001
#define PCRE_EXTRA_MATCH_LIMIT 0x0002 #define PCRE_EXTRA_MATCH_LIMIT 0x0002
#define PCRE_EXTRA_CALLOUT_DATA 0x0004 #define PCRE_EXTRA_CALLOUT_DATA 0x0004
#define PCRE_EXTRA_TABLES 0x0008
/* Types */ /* Types */
@@ -105,13 +165,15 @@ struct real_pcre; /* declaration; the definition is private */
typedef struct real_pcre pcre; typedef struct real_pcre pcre;
/* The structure for passing additional data to pcre_exec(). This is defined in /* The structure for passing additional data to pcre_exec(). This is defined in
such as way as to be extensible. */ such as way as to be extensible. Always add new fields at the end, in order to
remain compatible. */
typedef struct pcre_extra { typedef struct pcre_extra {
unsigned long int flags; /* Bits for which fields are set */ unsigned long int flags; /* Bits for which fields are set */
void *study_data; /* Opaque data from pcre_study() */ void *study_data; /* Opaque data from pcre_study() */
unsigned long int match_limit; /* Maximum number of calls to match() */ unsigned long int match_limit; /* Maximum number of calls to match() */
void *callout_data; /* Data passed back in callouts */ void *callout_data; /* Data passed back in callouts */
const unsigned char *tables; /* Pointer to character tables */
} pcre_extra; } pcre_extra;
/* The structure for passing out data via the pcre_callout_function. We use a /* The structure for passing out data via the pcre_callout_function. We use a
@@ -127,55 +189,67 @@ typedef struct pcre_callout_block {
const char *subject; /* The subject being matched */ const char *subject; /* The subject being matched */
int subject_length; /* The length of the subject */ int subject_length; /* The length of the subject */
int start_match; /* Offset to start of this match attempt */ int start_match; /* Offset to start of this match attempt */
int current_position; /* Where we currently are */ int current_position; /* Where we currently are in the subject */
int capture_top; /* Max current capture */ int capture_top; /* Max current capture */
int capture_last; /* Most recently closed capture */ int capture_last; /* Most recently closed capture */
void *callout_data; /* Data passed in with the call */ void *callout_data; /* Data passed in with the call */
/* ------------------- Added for Version 1 -------------------------- */
int pattern_position; /* Offset to next item in the pattern */
int next_item_length; /* Length of next item in the pattern */
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
} pcre_callout_block; } pcre_callout_block;
/* Indirection for store get and free functions. These can be set to /* Indirection for store get and free functions. These can be set to
alternative malloc/free functions if required. There is also an optional alternative malloc/free functions if required. Special ones are used in the
callout function that is triggered by the (?) regex item. Some magic is non-recursive case for "frames". There is also an optional callout function
required for Win32 DLL; it is null on other OS. For Virtual Pascal, these that is triggered by the (?) regex item. For Virtual Pascal, these definitions
have to be different again. */ have to take another form. */
#ifndef VPCOMPAT #ifndef VPCOMPAT
PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t); PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
PCRE_DATA_SCOPE void (*pcre_free)(void *); PCRE_DATA_SCOPE void (*pcre_free)(void *);
PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
PCRE_DATA_SCOPE void (*pcre_stack_free)(void *);
PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *); PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
#else /* VPCOMPAT */ #else /* VPCOMPAT */
extern void *pcre_malloc(size_t); PCRE_DATA_SCOPE void *pcre_malloc(size_t);
extern void pcre_free(void *); PCRE_DATA_SCOPE void pcre_free(void *);
extern int pcre_callout(pcre_callout_block *); PCRE_DATA_SCOPE void *pcre_stack_malloc(size_t);
PCRE_DATA_SCOPE void pcre_stack_free(void *);
PCRE_DATA_SCOPE int pcre_callout(pcre_callout_block *);
#endif /* VPCOMPAT */ #endif /* VPCOMPAT */
/* Exported PCRE functions */ /* Exported PCRE functions */
extern pcre *pcre_compile(const char *, int, const char **, PCRE_DATA_SCOPE pcre *pcre_compile(const char *, int, const char **, int *,
int *, const unsigned char *); const unsigned char *);
extern int pcre_config(int, void *); PCRE_DATA_SCOPE pcre *pcre_compile2(const char *, int, int *, const char **,
extern int pcre_copy_named_substring(const pcre *, const char *, int *, const unsigned char *);
int *, int, const char *, char *, int); PCRE_DATA_SCOPE int pcre_config(int, void *);
extern int pcre_copy_substring(const char *, int *, int, int, PCRE_DATA_SCOPE int pcre_copy_named_substring(const pcre *, const char *,
char *, int); int *, int, const char *, char *, int);
extern int pcre_exec(const pcre *, const pcre_extra *, PCRE_DATA_SCOPE int pcre_copy_substring(const char *, int *, int, int, char *,
const char *, int, int, int, int *, int); int);
extern void pcre_free_substring(const char *); PCRE_DATA_SCOPE int pcre_dfa_exec(const pcre *, const pcre_extra *,
extern void pcre_free_substring_list(const char **); const char *, int, int, int, int *, int , int *, int);
extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, PCRE_DATA_SCOPE int pcre_exec(const pcre *, const pcre_extra *, const char *,
void *); int, int, int, int *, int);
extern int pcre_get_named_substring(const pcre *, const char *, PCRE_DATA_SCOPE void pcre_free_substring(const char *);
int *, int, const char *, const char **); PCRE_DATA_SCOPE void pcre_free_substring_list(const char **);
extern int pcre_get_stringnumber(const pcre *, const char *); PCRE_DATA_SCOPE int pcre_fullinfo(const pcre *, const pcre_extra *, int,
extern int pcre_get_substring(const char *, int *, int, int, void *);
const char **); PCRE_DATA_SCOPE int pcre_get_named_substring(const pcre *, const char *,
extern int pcre_get_substring_list(const char *, int *, int, int *, int, const char *, const char **);
const char ***); PCRE_DATA_SCOPE int pcre_get_stringnumber(const pcre *, const char *);
extern int pcre_info(const pcre *, int *, int *); PCRE_DATA_SCOPE int pcre_get_substring(const char *, int *, int, int,
extern const unsigned char *pcre_maketables(void); const char **);
extern pcre_extra *pcre_study(const pcre *, int, const char **); PCRE_DATA_SCOPE int pcre_get_substring_list(const char *, int *, int,
extern const char *pcre_version(void); const char ***);
PCRE_DATA_SCOPE int pcre_info(const pcre *, int *, int *);
PCRE_DATA_SCOPE const unsigned char *pcre_maketables(void);
PCRE_DATA_SCOPE int pcre_refcount(pcre *, int);
PCRE_DATA_SCOPE pcre_extra *pcre_study(const pcre *, int, const char **);
PCRE_DATA_SCOPE const char *pcre_version(void);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@@ -6,11 +6,11 @@
program. If you edit it by hand, you might like to edit the Makefile to program. If you edit it by hand, you might like to edit the Makefile to
prevent its ever being regenerated. prevent its ever being regenerated.
This file is #included in the compilation of pcre.c to build the default This file contains the default tables for characters with codes less than
character tables which are used when no tables are passed to the compile 128 (ASCII characters). These tables are used when no external tables are
function. */ passed to PCRE. */
static unsigned char pcre_default_tables[] = { const unsigned char _pcre_default_tables[] = {
/* This table is a lower casing table. */ /* This table is a lower casing table. */

5059
libpcre/pcre_compile.c Normal file

File diff suppressed because it is too large Load Diff

112
libpcre/pcre_config.c Normal file
View File

@@ -0,0 +1,112 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains the external function pcre_config(). */
#include "pcre_internal.h"
/*************************************************
* Return info about what features are configured *
*************************************************/
/* This function has an extensible interface so that additional items can be
added compatibly.
Arguments:
what what information is required
where where to put the information
Returns: 0 if data returned, negative on error
*/
EXPORT int
pcre_config(int what, void *where)
{
switch (what)
{
case PCRE_CONFIG_UTF8:
#ifdef SUPPORT_UTF8
*((int *)where) = 1;
#else
*((int *)where) = 0;
#endif
break;
case PCRE_CONFIG_UNICODE_PROPERTIES:
#ifdef SUPPORT_UCP
*((int *)where) = 1;
#else
*((int *)where) = 0;
#endif
break;
case PCRE_CONFIG_NEWLINE:
*((int *)where) = NEWLINE;
break;
case PCRE_CONFIG_LINK_SIZE:
*((int *)where) = LINK_SIZE;
break;
case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:
*((int *)where) = POSIX_MALLOC_THRESHOLD;
break;
case PCRE_CONFIG_MATCH_LIMIT:
*((unsigned int *)where) = MATCH_LIMIT;
break;
case PCRE_CONFIG_STACKRECURSE:
#ifdef NO_RECURSE
*((int *)where) = 0;
#else
*((int *)where) = 1;
#endif
break;
default: return PCRE_ERROR_BADOPTION;
}
return 0;
}
/* End of pcre_config.c */

1922
libpcre/pcre_dfa_exec.c Normal file

File diff suppressed because it is too large Load Diff

3632
libpcre/pcre_exec.c Normal file

File diff suppressed because it is too large Load Diff

149
libpcre/pcre_fullinfo.c Normal file
View File

@@ -0,0 +1,149 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/*PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains the external function pcre_fullinfo(), which returns
information about a compiled pattern. */
#include "pcre_internal.h"
/*************************************************
* Return info about compiled pattern *
*************************************************/
/* This is a newer "info" function which has an extensible interface so
that additional items can be added compatibly.
Arguments:
argument_re points to compiled code
extra_data points extra data, or NULL
what what information is required
where where to put the information
Returns: 0 if data returned, negative on error
*/
EXPORT int
pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what,
void *where)
{
real_pcre internal_re;
pcre_study_data internal_study;
const real_pcre *re = (const real_pcre *)argument_re;
const pcre_study_data *study = NULL;
if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
study = (const pcre_study_data *)extra_data->study_data;
if (re->magic_number != MAGIC_NUMBER)
{
re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
if (re == NULL) return PCRE_ERROR_BADMAGIC;
if (study != NULL) study = &internal_study;
}
switch (what)
{
case PCRE_INFO_OPTIONS:
*((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;
break;
case PCRE_INFO_SIZE:
*((size_t *)where) = re->size;
break;
case PCRE_INFO_STUDYSIZE:
*((size_t *)where) = (study == NULL)? 0 : study->size;
break;
case PCRE_INFO_CAPTURECOUNT:
*((int *)where) = re->top_bracket;
break;
case PCRE_INFO_BACKREFMAX:
*((int *)where) = re->top_backref;
break;
case PCRE_INFO_FIRSTBYTE:
*((int *)where) =
((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
break;
/* Make sure we pass back the pointer to the bit vector in the external
block, not the internal copy (with flipped integer fields). */
case PCRE_INFO_FIRSTTABLE:
*((const uschar **)where) =
(study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
break;
case PCRE_INFO_LASTLITERAL:
*((int *)where) =
((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1;
break;
case PCRE_INFO_NAMEENTRYSIZE:
*((int *)where) = re->name_entry_size;
break;
case PCRE_INFO_NAMECOUNT:
*((int *)where) = re->name_count;
break;
case PCRE_INFO_NAMETABLE:
*((const uschar **)where) = (const uschar *)re + re->name_table_offset;
break;
case PCRE_INFO_DEFAULT_TABLES:
*((const uschar **)where) = (const uschar *)(_pcre_default_tables);
break;
default: return PCRE_ERROR_BADOPTION;
}
return 0;
}
/* End of pcre_fullinfo.c */

View File

@@ -2,45 +2,48 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* /* PCRE is a library of functions to support regular expressions whose syntax
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.
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.
Written by: Philip Hazel <ph10@cam.ac.uk> Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
Copyright (c) 1997-2003 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Permission is granted to anyone to use this software for any purpose on any Redistribution and use in source and binary forms, with or without
computer system, and to redistribute it freely, subject to the following modification, are permitted provided that the following conditions are met:
restrictions:
1. This software is distributed in the hope that it will be useful, * Redistributions of source code must retain the above copyright notice,
but WITHOUT ANY WARRANTY; without even the implied warranty of this list of conditions and the following disclaimer.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by * Redistributions in binary form must reproduce the above copyright
explicit claim or by omission. notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Altered versions must be plainly marked as such, and must not be * Neither the name of the University of Cambridge nor the names of its
misrepresented as being the original software. contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
4. If PCRE is embedded in any software that is released under the GNU THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
General Purpose Licence (GPL), then the terms of that licence shall AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
supersede any condition above with which it is incompatible. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
/* This module contains some convenience functions for extracting substrings /* This module contains some convenience functions for extracting substrings
from the subject string after a regex match has succeeded. The original idea from the subject string after a regex match has succeeded. The original idea
for these functions came from Scott Wimer <scottw@cgibuilder.com>. */ for these functions came from Scott Wimer. */
/* Include the internals header, which itself includes Standard C headers plus #include "pcre_internal.h"
the external pcre header. */
#include "internal.h"
/************************************************* /*************************************************
@@ -346,4 +349,4 @@ pcre_free_substring(const char *pointer)
(pcre_free)((void *)pointer); (pcre_free)((void *)pointer);
} }
/* End of get.c */ /* End of pcre_get.c */

69
libpcre/pcre_globals.c Normal file
View File

@@ -0,0 +1,69 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains global variables that are exported by the PCRE library.
PCRE is thread-clean and doesn't use any global variables in the normal sense.
However, it calls memory allocation and freeing functions via the four
indirections below, and it can optionally do callouts, using the fifth
indirection. These values can be changed by the caller, but are shared between
all threads. However, when compiling for Virtual Pascal, things are done
differently, and global variables are not used (see pcre.in). */
#include "pcre_internal.h"
#ifndef VPCOMPAT
#ifdef __cplusplus
extern "C" void *(*pcre_malloc)(size_t) = malloc;
extern "C" void (*pcre_free)(void *) = free;
extern "C" void *(*pcre_stack_malloc)(size_t) = malloc;
extern "C" void (*pcre_stack_free)(void *) = free;
extern "C" int (*pcre_callout)(pcre_callout_block *) = NULL;
#else
void *(*pcre_malloc)(size_t) = malloc;
void (*pcre_free)(void *) = free;
void *(*pcre_stack_malloc)(size_t) = malloc;
void (*pcre_stack_free)(void *) = free;
int (*pcre_callout)(pcre_callout_block *) = NULL;
#endif
#endif
/* End of pcre_globals.c */

89
libpcre/pcre_info.c Normal file
View File

@@ -0,0 +1,89 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains the external function pcre_info(), which gives some
information about a compiled pattern. However, use of this function is now
deprecated, as it has been superseded by pcre_fullinfo(). */
#include "pcre_internal.h"
/*************************************************
* (Obsolete) Return info about compiled pattern *
*************************************************/
/* This is the original "info" function. It picks potentially useful data out
of the private structure, but its interface was too rigid. It remains for
backwards compatibility. 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:
argument_re points to compiled code
optptr where to pass back the options
first_byte where to pass back the first character,
or -1 if multiline and all branches start ^,
or -2 otherwise
Returns: number of capturing subpatterns
or negative values on error
*/
EXPORT int
pcre_info(const pcre *argument_re, int *optptr, int *first_byte)
{
real_pcre internal_re;
const real_pcre *re = (const real_pcre *)argument_re;
if (re == NULL) return PCRE_ERROR_NULL;
if (re->magic_number != MAGIC_NUMBER)
{
re = _pcre_try_flipped(re, &internal_re, NULL, NULL);
if (re == NULL) return PCRE_ERROR_BADMAGIC;
}
if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
if (first_byte != NULL)
*first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
return re->top_bracket;
}
/* End of pcre_info.c */

View File

@@ -3,37 +3,44 @@
*************************************************/ *************************************************/
/* This is a library of functions to support regular expressions whose syntax /* PCRE 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 and semantics are as close as possible to those of the Perl 5 language.
the file Tech.Notes for some information on the internals.
Written by: Philip Hazel <ph10@cam.ac.uk> Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
Copyright (c) 1997-2003 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Permission is granted to anyone to use this software for any purpose on any Redistribution and use in source and binary forms, with or without
computer system, and to redistribute it freely, subject to the following modification, are permitted provided that the following conditions are met:
restrictions:
1. This software is distributed in the hope that it will be useful, * Redistributions of source code must retain the above copyright notice,
but WITHOUT ANY WARRANTY; without even the implied warranty of this list of conditions and the following disclaimer.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by * Redistributions in binary form must reproduce the above copyright
explicit claim or by omission. notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Altered versions must be plainly marked as such, and must not be * Neither the name of the University of Cambridge nor the names of its
misrepresented as being the original software. contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
4. If PCRE is embedded in any software that is released under the GNU THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
General Purpose Licence (GPL), then the terms of that licence shall AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
supersede any condition above with which it is incompatible. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
/* This header contains definitions that are shared between the different /* This header contains definitions that are shared between the different
modules, but which are not relevant to the outside. */ modules, but which are not relevant to the exported API. This includes some
functions whose names all begin with "_pcre_". */
/* Get the definitions provided by running "configure" */ /* Get the definitions provided by running "configure" */
#ifndef WIN32 #ifndef WIN32
@@ -42,6 +49,82 @@ modules, but which are not relevant to the outside. */
#include "pcre_winconfig.h" #include "pcre_winconfig.h"
#endif #endif
/* Define DEBUG to get debugging output on stdout. */
/****
#define DEBUG
****/
/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
inline, and there are *still* stupid compilers about that don't like indented
pre-processor statements, or at least there were when I first wrote this. After
all, it had only been about 10 years then... */
/* Get the definitions provided by running "configure" */
#ifdef DEBUG
#define DPRINTF(p) printf p
#else
#define DPRINTF(p) /*nothing*/
#endif
/* Standard C headers plus the external interface definition. The only time
setjmp and stdarg are used is when NO_RECURSE is set. */
#include <ctype.h>
#include <limits.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef PCRE_SPY
#define PCRE_DEFINITION /* Win32 __declspec(export) trigger for .dll */
#endif
/* We need to have types that specify unsigned 16-bit and 32-bit integers. We
cannot determine these outside the compilation (e.g. by running a program as
part of "configure") because PCRE is often cross-compiled for use on other
systems. Instead we make use of the maximum sizes that are available at
preprocessor time in standard C environments. */
#if USHRT_MAX == 65535
typedef unsigned short pcre_uint16;
#elif UINT_MAX == 65535
typedef unsigned int pcre_uint16;
#else
#error Cannot determine a type for 16-bit unsigned integers
#endif
#if UINT_MAX == 4294967295
typedef unsigned int pcre_uint32;
#elif ULONG_MAX == 4294967295
typedef unsigned long int pcre_uint32;
#else
#error Cannot determine a type for 32-bit unsigned integers
#endif
/* All character handling must be done as unsigned characters. Otherwise there
are problems with top-bit-set characters and functions such as isspace().
However, we leave the interface to the outside world as char *, because that
should make things easier for callers. We define a short type for unsigned char
to save lots of typing. I tried "uchar", but it causes problems on Digital
Unix, where it is defined in sys/types, so use "uschar" instead. */
typedef unsigned char uschar;
/* Include the public PCRE header */
#include "pcre.h"
/* Include the (copy of) the public ucp header, changing the external name into a private one. This does no harm, even if we aren't compiling UCP support. */
#define ucp_findchar _pcre_ucp_findchar
#include "ucp.h"
/* When compiling for use with the Virtual Pascal compiler, these functions /* When compiling for use with the Virtual Pascal compiler, these functions
need to have their names changed. PCRE must be compiled with the -DVPCOMPAT need to have their names changed. PCRE must be compiled with the -DVPCOMPAT
option on the command line. */ option on the command line. */
@@ -79,13 +162,14 @@ for (i = 0; i < n; ++i) *(--dest) = *(--src);
#endif /* not VPCOMPAT */ #endif /* not VPCOMPAT */
/* PCRE keeps offsets in its compiled code as 2-byte quantities by default. /* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored
These are used, for example, to link from the start of a subpattern to its in big-endian order) by default. These are used, for example, to link from the
alternatives and its end. The use of 2 bytes per offset limits the size of the start of a subpattern to its alternatives and its end. The use of 2 bytes per
compiled regex to around 64K, which is big enough for almost everybody. offset limits the size of the compiled regex to around 64K, which is big enough
However, I received a request for an even bigger limit. For this reason, and for almost everybody. However, I received a request for an even bigger limit.
also to make the code easier to maintain, the storing and loading of offsets For this reason, and also to make the code easier to maintain, the storing and
from the byte string is now handled by the macros that are defined here. loading of offsets from the byte string is now handled by the macros that are
defined here.
The macros are controlled by the value of LINK_SIZE. This defaults to 2 in The macros are controlled by the value of LINK_SIZE. This defaults to 2 in
the config.h file, but can be overridden by using -D on the command line. This the config.h file, but can be overridden by using -D on the command line. This
@@ -154,24 +238,115 @@ capturing parenthesis numbers in back references. */
#define PUT2INC(a,n,d) PUT2(a,n,d), a += 2 #define PUT2INC(a,n,d) PUT2(a,n,d), a += 2
/* Standard C headers plus the external interface definition */ /* When UTF-8 encoding is being used, a character is no longer just a single
byte. The macros for character handling generate simple sequences when used in
byte-mode, and more complicated ones for UTF-8 characters. */
#include <ctype.h> #ifndef SUPPORT_UTF8
#include <limits.h> #define GETCHAR(c, eptr) c = *eptr;
#include <stddef.h> #define GETCHARTEST(c, eptr) c = *eptr;
#include <stdio.h> #define GETCHARINC(c, eptr) c = *eptr++;
#include <stdlib.h> #define GETCHARINCTEST(c, eptr) c = *eptr++;
#include <string.h> #define GETCHARLEN(c, eptr, len) c = *eptr;
#define BACKCHAR(eptr)
#else /* SUPPORT_UTF8 */
/* Get the next UTF-8 character, not advancing the pointer. This is called when
we know we are in UTF-8 mode. */
#define GETCHAR(c, eptr) \
c = *eptr; \
if ((c & 0xc0) == 0xc0) \
{ \
int gcii; \
int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
int gcss = 6*gcaa; \
c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
for (gcii = 1; gcii <= gcaa; gcii++) \
{ \
gcss -= 6; \
c |= (eptr[gcii] & 0x3f) << gcss; \
} \
}
/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the
pointer. */
#define GETCHARTEST(c, eptr) \
c = *eptr; \
if (utf8 && (c & 0xc0) == 0xc0) \
{ \
int gcii; \
int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
int gcss = 6*gcaa; \
c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
for (gcii = 1; gcii <= gcaa; gcii++) \
{ \
gcss -= 6; \
c |= (eptr[gcii] & 0x3f) << gcss; \
} \
}
/* Get the next UTF-8 character, advancing the pointer. This is called when we
know we are in UTF-8 mode. */
#define GETCHARINC(c, eptr) \
c = *eptr++; \
if ((c & 0xc0) == 0xc0) \
{ \
int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
int gcss = 6*gcaa; \
c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
while (gcaa-- > 0) \
{ \
gcss -= 6; \
c |= (*eptr++ & 0x3f) << gcss; \
} \
}
/* Get the next character, testing for UTF-8 mode, and advancing the pointer */
#define GETCHARINCTEST(c, eptr) \
c = *eptr++; \
if (utf8 && (c & 0xc0) == 0xc0) \
{ \
int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
int gcss = 6*gcaa; \
c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
while (gcaa-- > 0) \
{ \
gcss -= 6; \
c |= (*eptr++ & 0x3f) << gcss; \
} \
}
/* Get the next UTF-8 character, not advancing the pointer, incrementing length
if there are extra bytes. This is called when we know we are in UTF-8 mode. */
#define GETCHARLEN(c, eptr, len) \
c = *eptr; \
if ((c & 0xc0) == 0xc0) \
{ \
int gcii; \
int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
int gcss = 6*gcaa; \
c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
for (gcii = 1; gcii <= gcaa; gcii++) \
{ \
gcss -= 6; \
c |= (eptr[gcii] & 0x3f) << gcss; \
} \
len += gcaa; \
}
/* If the pointer is not at the start of a character, move it back until
it is. Called only in UTF-8 mode. */
#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--;
#ifndef PCRE_SPY
#define PCRE_DEFINITION /* Win32 __declspec(export) trigger for .dll */
#endif #endif
#ifndef WIN32
#include "pcre.h"
#else
#include "pcre_win.h"
#endif
/* In case there is no definition of offsetof() provided - though any proper /* In case there is no definition of offsetof() provided - though any proper
Standard C system should have one. */ Standard C system should have one. */
@@ -180,6 +355,7 @@ Standard C system should have one. */
#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) #define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
#endif #endif
/* These are the public options that can change during matching. */ /* These are the public options that can change during matching. */
#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) #define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
@@ -187,32 +363,38 @@ Standard C system should have one. */
/* Private options flags start at the most significant end of the four bytes, /* 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 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 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 significant end. Make sure they don't overlap! */
to four bytes there is plenty of space. */
#define PCRE_FIRSTSET 0x40000000 /* first_byte is set */ #define PCRE_FIRSTSET 0x40000000 /* first_byte is set */
#define PCRE_REQCHSET 0x20000000 /* req_byte is set */ #define PCRE_REQCHSET 0x20000000 /* req_byte is set */
#define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */ #define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */
#define PCRE_ICHANGED 0x08000000 /* i option changes within regex */ #define PCRE_ICHANGED 0x08000000 /* i option changes within regex */
#define PCRE_NOPARTIAL 0x04000000 /* can't use partial with this regex */
/* Options for the "extra" block produced by pcre_study(). */ /* Options for the "extra" block produced by pcre_study(). */
#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ #define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */
/* Masks for identifying the public options which are permitted at compile /* Masks for identifying the public options that are permitted at compile
time, run time or study time, respectively. */ time, run time, or study time, respectively. */
#define PUBLIC_OPTIONS \ #define PUBLIC_OPTIONS \
(PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \
PCRE_NO_AUTO_CAPTURE) PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE)
#define PUBLIC_EXEC_OPTIONS \ #define PUBLIC_EXEC_OPTIONS \
(PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY) (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \
PCRE_PARTIAL)
#define PUBLIC_DFA_EXEC_OPTIONS \
(PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \
PCRE_PARTIAL|PCRE_DFA_SHORTEST|PCRE_DFA_RESTART)
#define PUBLIC_STUDY_OPTIONS 0 /* None defined */ #define PUBLIC_STUDY_OPTIONS 0 /* None defined */
/* Magic number to provide a small check against being handed junk. */ /* Magic number to provide a small check against being handed junk. Also used
to detect whether a pattern was compiled on a host of different endianness. */
#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ #define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */
@@ -221,6 +403,11 @@ time, run time or study time, respectively. */
#define REQ_UNSET (-2) #define REQ_UNSET (-2)
#define REQ_NONE (-1) #define REQ_NONE (-1)
/* The maximum remaining length of subject we are prepared to search for a
req_byte match. */
#define REQ_BYTE_MAX 1000
/* Flags added to firstbyte or reqbyte; a "non-literal" item is either a /* Flags added to firstbyte or reqbyte; a "non-literal" item is either a
variable-length repeat, or a anything other than literal characters. */ variable-length repeat, or a anything other than literal characters. */
@@ -268,12 +455,13 @@ definitions below, up to ESC_z. There's a dummy for OP_ANY because it
corresponds to "." rather than an escape sequence. The final one must be corresponds to "." rather than an escape sequence. The final one must be
ESC_REF as subsequent values are used for \1, \2, \3, etc. There is are two ESC_REF as subsequent values are used for \1, \2, \3, etc. There is are two
tests in the code for an escape greater than ESC_b and less than ESC_Z to tests in the code for an escape greater than ESC_b and less than ESC_Z to
detect the types that may be repeated. These are the types that consume a detect the types that may be repeated. These are the types that consume
character. If any new escapes are put in between that don't consume a characters. If any new escapes are put in between that don't consume a
character, that code will have to change. */ character, that code will have to change. */
enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W,
ESC_w, ESC_dum1, ESC_C, ESC_Z, ESC_z, ESC_E, ESC_Q, ESC_REF }; ESC_w, ESC_dum1, ESC_C, ESC_P, ESC_p, ESC_X, ESC_Z, ESC_z, ESC_E,
ESC_Q, ESC_REF };
/* Flag bits and data types for the extended class (OP_XCLASS) for classes that /* Flag bits and data types for the extended class (OP_XCLASS) for classes that
contain UTF-8 characters with values greater than 255. */ contain UTF-8 characters with values greater than 255. */
@@ -284,6 +472,8 @@ contain UTF-8 characters with values greater than 255. */
#define XCL_END 0 /* Marks end of individual items */ #define XCL_END 0 /* Marks end of individual items */
#define XCL_SINGLE 1 /* Single item (one multibyte char) follows */ #define XCL_SINGLE 1 /* Single item (one multibyte char) follows */
#define XCL_RANGE 2 /* A range (two multibyte chars) follows */ #define XCL_RANGE 2 /* A range (two multibyte chars) follows */
#define XCL_PROP 3 /* Unicode property (one property code) follows */
#define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */
/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets /* Opcode table: OP_BRA must be last, as all values >= it are used for brackets
@@ -309,110 +499,123 @@ enum {
OP_WORDCHAR, /* 10 \w */ OP_WORDCHAR, /* 10 \w */
OP_ANY, /* 11 Match any character */ OP_ANY, /* 11 Match any character */
OP_ANYBYTE, /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */ OP_ANYBYTE, /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */
OP_EODN, /* 13 End of data or \n at end of data: \Z. */ OP_NOTPROP, /* 13 \P (not Unicode property) */
OP_EOD, /* 14 End of data: \z */ OP_PROP, /* 14 \p (Unicode property) */
OP_EXTUNI, /* 15 \X (extended Unicode sequence */
OP_EODN, /* 16 End of data or \n at end of data: \Z. */
OP_EOD, /* 17 End of data: \z */
OP_OPT, /* 15 Set runtime options */ OP_OPT, /* 18 Set runtime options */
OP_CIRC, /* 16 Start of line - varies with multiline switch */ OP_CIRC, /* 19 Start of line - varies with multiline switch */
OP_DOLL, /* 17 End of line - varies with multiline switch */ OP_DOLL, /* 20 End of line - varies with multiline switch */
OP_CHARS, /* 18 Match string of characters */ OP_CHAR, /* 21 Match one character, casefully */
OP_NOT, /* 19 Match anything but the following char */ OP_CHARNC, /* 22 Match one character, caselessly */
OP_NOT, /* 23 Match anything but the following char */
OP_STAR, /* 20 The maximizing and minimizing versions of */ OP_STAR, /* 24 The maximizing and minimizing versions of */
OP_MINSTAR, /* 21 all these opcodes must come in pairs, with */ OP_MINSTAR, /* 25 all these opcodes must come in pairs, with */
OP_PLUS, /* 22 the minimizing one second. */ OP_PLUS, /* 26 the minimizing one second. */
OP_MINPLUS, /* 23 This first set applies to single characters */ OP_MINPLUS, /* 27 This first set applies to single characters */
OP_QUERY, /* 24 */ OP_QUERY, /* 28 */
OP_MINQUERY, /* 25 */ OP_MINQUERY, /* 29 */
OP_UPTO, /* 26 From 0 to n matches */ OP_UPTO, /* 30 From 0 to n matches */
OP_MINUPTO, /* 27 */ OP_MINUPTO, /* 31 */
OP_EXACT, /* 28 Exactly n matches */ OP_EXACT, /* 32 Exactly n matches */
OP_NOTSTAR, /* 29 The maximizing and minimizing versions of */ OP_NOTSTAR, /* 33 The maximizing and minimizing versions of */
OP_NOTMINSTAR, /* 30 all these opcodes must come in pairs, with */ OP_NOTMINSTAR, /* 34 all these opcodes must come in pairs, with */
OP_NOTPLUS, /* 31 the minimizing one second. */ OP_NOTPLUS, /* 35 the minimizing one second. */
OP_NOTMINPLUS, /* 32 This set applies to "not" single characters */ OP_NOTMINPLUS, /* 36 This set applies to "not" single characters */
OP_NOTQUERY, /* 33 */ OP_NOTQUERY, /* 37 */
OP_NOTMINQUERY, /* 34 */ OP_NOTMINQUERY, /* 38 */
OP_NOTUPTO, /* 35 From 0 to n matches */ OP_NOTUPTO, /* 39 From 0 to n matches */
OP_NOTMINUPTO, /* 36 */ OP_NOTMINUPTO, /* 40 */
OP_NOTEXACT, /* 37 Exactly n matches */ OP_NOTEXACT, /* 41 Exactly n matches */
OP_TYPESTAR, /* 38 The maximizing and minimizing versions of */ OP_TYPESTAR, /* 42 The maximizing and minimizing versions of */
OP_TYPEMINSTAR, /* 39 all these opcodes must come in pairs, with */ OP_TYPEMINSTAR, /* 43 all these opcodes must come in pairs, with */
OP_TYPEPLUS, /* 40 the minimizing one second. These codes must */ OP_TYPEPLUS, /* 44 the minimizing one second. These codes must */
OP_TYPEMINPLUS, /* 41 be in exactly the same order as those above. */ OP_TYPEMINPLUS, /* 45 be in exactly the same order as those above. */
OP_TYPEQUERY, /* 42 This set applies to character types such as \d */ OP_TYPEQUERY, /* 46 This set applies to character types such as \d */
OP_TYPEMINQUERY, /* 43 */ OP_TYPEMINQUERY, /* 47 */
OP_TYPEUPTO, /* 44 From 0 to n matches */ OP_TYPEUPTO, /* 48 From 0 to n matches */
OP_TYPEMINUPTO, /* 45 */ OP_TYPEMINUPTO, /* 49 */
OP_TYPEEXACT, /* 46 Exactly n matches */ OP_TYPEEXACT, /* 50 Exactly n matches */
OP_CRSTAR, /* 47 The maximizing and minimizing versions of */ OP_CRSTAR, /* 51 The maximizing and minimizing versions of */
OP_CRMINSTAR, /* 48 all these opcodes must come in pairs, with */ OP_CRMINSTAR, /* 52 all these opcodes must come in pairs, with */
OP_CRPLUS, /* 49 the minimizing one second. These codes must */ OP_CRPLUS, /* 53 the minimizing one second. These codes must */
OP_CRMINPLUS, /* 50 be in exactly the same order as those above. */ OP_CRMINPLUS, /* 54 be in exactly the same order as those above. */
OP_CRQUERY, /* 51 These are for character classes and back refs */ OP_CRQUERY, /* 55 These are for character classes and back refs */
OP_CRMINQUERY, /* 52 */ OP_CRMINQUERY, /* 56 */
OP_CRRANGE, /* 53 These are different to the three seta above. */ OP_CRRANGE, /* 57 These are different to the three sets above. */
OP_CRMINRANGE, /* 54 */ OP_CRMINRANGE, /* 58 */
OP_CLASS, /* 55 Match a character class, chars < 256 only */ OP_CLASS, /* 59 Match a character class, chars < 256 only */
OP_NCLASS, /* 56 Same, but the bitmap was created from a negative OP_NCLASS, /* 60 Same, but the bitmap was created from a negative
class - the difference is relevant only when a UTF-8 class - the difference is relevant only when a UTF-8
character > 255 is encountered. */ character > 255 is encountered. */
OP_XCLASS, /* 56 Extended class for handling UTF-8 chars within the OP_XCLASS, /* 61 Extended class for handling UTF-8 chars within the
class. This does both positive and negative. */ class. This does both positive and negative. */
OP_REF, /* 57 Match a back reference */ OP_REF, /* 62 Match a back reference */
OP_RECURSE, /* 58 Match a numbered subpattern (possibly recursive) */ OP_RECURSE, /* 63 Match a numbered subpattern (possibly recursive) */
OP_CALLOUT, /* 59 Call out to external function if provided */ OP_CALLOUT, /* 64 Call out to external function if provided */
OP_ALT, /* 60 Start of alternation */ OP_ALT, /* 65 Start of alternation */
OP_KET, /* 61 End of group that doesn't have an unbounded repeat */ OP_KET, /* 66 End of group that doesn't have an unbounded repeat */
OP_KETRMAX, /* 62 These two must remain together and in this */ OP_KETRMAX, /* 67 These two must remain together and in this */
OP_KETRMIN, /* 63 order. They are for groups the repeat for ever. */ OP_KETRMIN, /* 68 order. They are for groups the repeat for ever. */
/* The assertions must come before ONCE and COND */ /* The assertions must come before ONCE and COND */
OP_ASSERT, /* 64 Positive lookahead */ OP_ASSERT, /* 69 Positive lookahead */
OP_ASSERT_NOT, /* 65 Negative lookahead */ OP_ASSERT_NOT, /* 70 Negative lookahead */
OP_ASSERTBACK, /* 66 Positive lookbehind */ OP_ASSERTBACK, /* 71 Positive lookbehind */
OP_ASSERTBACK_NOT, /* 67 Negative lookbehind */ OP_ASSERTBACK_NOT, /* 72 Negative lookbehind */
OP_REVERSE, /* 68 Move pointer back - used in lookbehind assertions */ OP_REVERSE, /* 73 Move pointer back - used in lookbehind assertions */
/* ONCE and COND must come after the assertions, with ONCE first, as there's /* ONCE and COND must come after the assertions, with ONCE first, as there's
a test for >= ONCE for a subpattern that isn't an assertion. */ a test for >= ONCE for a subpattern that isn't an assertion. */
OP_ONCE, /* 69 Once matched, don't back up into the subpattern */ OP_ONCE, /* 74 Once matched, don't back up into the subpattern */
OP_COND, /* 70 Conditional group */ OP_COND, /* 75 Conditional group */
OP_CREF, /* 71 Used to hold an extraction string number (cond ref) */ OP_CREF, /* 76 Used to hold an extraction string number (cond ref) */
OP_BRAZERO, /* 72 These two must remain together and in this */ OP_BRAZERO, /* 77 These two must remain together and in this */
OP_BRAMINZERO, /* 73 order. */ OP_BRAMINZERO, /* 78 order. */
OP_BRANUMBER, /* 74 Used for extracting brackets whose number is greater OP_BRANUMBER, /* 79 Used for extracting brackets whose number is greater
than can fit into an opcode. */ than can fit into an opcode. */
OP_BRA /* 75 This and greater values are used for brackets that OP_BRA /* 80 This and greater values are used for brackets that
extract substrings up to a basic limit. After that, extract substrings up to EXTRACT_BASIC_MAX. After
use is made of OP_BRANUMBER. */ that, use is made of OP_BRANUMBER. */
}; };
/* WARNING: There is an implicit assumption in study.c that all opcodes are /* WARNING WARNING WARNING: There is an implicit assumption in pcre.c and
less than 128 in value. This makes handling UTF-8 character sequences easier. study.c that all opcodes are less than 128 in value. This makes handling UTF-8
*/ character sequences easier. */
/* The highest extraction number before we have to start using additional
bytes. (Originally PCRE didn't have support for extraction counts highter than
this number.) The value is limited by the number of opcodes left after OP_BRA,
i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional
opcodes. */
#define EXTRACT_BASIC_MAX 100
/* This macro defines textual names for all the opcodes. There are used only /* This macro defines textual names for all the opcodes. These are used only
for debugging, in pcre.c when DEBUG is defined, and also in pcretest.c. The for debugging. The macro is referenced only in pcre_printint.c. */
macro is referenced only in printint.c. */
#define OP_NAME_LIST \ #define OP_NAME_LIST \
"End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d", \ "End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d", \
"\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", "\\Z", "\\z", \ "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", \
"Opt", "^", "$", "chars", "not", \ "notprop", "prop", "extuni", \
"\\Z", "\\z", \
"Opt", "^", "$", "char", "charnc", "not", \
"*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
"*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
"*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
@@ -426,7 +629,7 @@ macro is referenced only in printint.c. */
/* This macro defines the length of fixed length operations in the compiled /* This macro defines the length of fixed length operations in the compiled
regex. The lengths are used when searching for specific things, and also in the regex. The lengths are used when searching for specific things, and also in the
debugging printing of a compiled regex. We use a macro so that it can be debugging printing of a compiled regex. We use a macro so that it can be
incorporated both into pcre.c and pcretest.c without being publicly exposed. defined close to the definitions of the opcodes themselves.
As things have been extended, some of these are no longer fixed lenths, but are As things have been extended, some of these are no longer fixed lenths, but are
minima instead. For example, the length of a single-character repeat may vary minima instead. For example, the length of a single-character repeat may vary
@@ -435,13 +638,16 @@ in UTF-8 mode. The code that uses this table must know about such things. */
#define OP_LENGTHS \ #define OP_LENGTHS \
1, /* End */ \ 1, /* End */ \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \
1, 1, 1, 1, 2, 1, 1, /* Any, Anybyte, \Z, \z, Opt, ^, $ */ \ 1, 1, /* Any, Anybyte */ \
2, /* Chars - the minimum length */ \ 2, 2, 1, /* NOTPROP, PROP, EXTUNI */ \
1, 1, 2, 1, 1, /* \Z, \z, Opt, ^, $ */ \
2, /* Char - the minimum length */ \
2, /* Charnc - the minimum length */ \
2, /* not */ \ 2, /* not */ \
/* Positive single-char repeats */ \ /* Positive single-char repeats ** These are */ \
2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** These are */ \ 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \
4, 4, 4, /* upto, minupto, exact ** minima */ \ 4, 4, 4, /* upto, minupto, exact ** UTF-8 mode */ \
/* Negative single-char repeats */ \ /* Negative single-char repeats - only for chars < 256 */ \
2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \ 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \
4, 4, 4, /* NOT upto, minupto, exact */ \ 4, 4, 4, /* NOT upto, minupto, exact */ \
/* Positive type repeats */ \ /* Positive type repeats */ \
@@ -455,7 +661,7 @@ in UTF-8 mode. The code that uses this table must know about such things. */
0, /* XCLASS - variable length */ \ 0, /* XCLASS - variable length */ \
3, /* REF */ \ 3, /* REF */ \
1+LINK_SIZE, /* RECURSE */ \ 1+LINK_SIZE, /* RECURSE */ \
2, /* CALLOUT */ \ 2+2*LINK_SIZE, /* CALLOUT */ \
1+LINK_SIZE, /* Alt */ \ 1+LINK_SIZE, /* Alt */ \
1+LINK_SIZE, /* Ket */ \ 1+LINK_SIZE, /* Ket */ \
1+LINK_SIZE, /* KetRmax */ \ 1+LINK_SIZE, /* KetRmax */ \
@@ -473,97 +679,61 @@ in UTF-8 mode. The code that uses this table must know about such things. */
1+LINK_SIZE /* BRA */ \ 1+LINK_SIZE /* BRA */ \
/* The highest extraction number before we have to start using additional
bytes. (Originally PCRE didn't have support for extraction counts highter than
this number.) The value is limited by the number of opcodes left after OP_BRA,
i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional
opcodes. */
#define EXTRACT_BASIC_MAX 150
/* A magic value for OP_CREF to indicate the "in recursion" condition. */ /* A magic value for OP_CREF to indicate the "in recursion" condition. */
#define CREF_RECURSE 0xffff #define CREF_RECURSE 0xffff
/* The texts of compile-time error messages are defined as macros here so that /* Error code numbers. They are given names so that they can more easily be
they can be accessed by the POSIX wrapper and converted into error codes. Yes, tracked. */
I could have used error codes in the first place, but didn't feel like changing
just to accommodate the POSIX wrapper. */
#define ERR1 "\\ at end of pattern" enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9,
#define ERR2 "\\c at end of pattern" ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19,
#define ERR3 "unrecognized character follows \\" ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29,
#define ERR4 "numbers out of order in {} quantifier" ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39,
#define ERR5 "number too big in {} quantifier" ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47 };
#define ERR6 "missing terminating ] for character class"
#define ERR7 "invalid escape sequence in character class"
#define ERR8 "range out of order in character class"
#define ERR9 "nothing to repeat"
#define ERR10 "operand of unlimited repeat could match the empty string"
#define ERR11 "internal error: unexpected repeat"
#define ERR12 "unrecognized character after (?"
#define ERR13 "POSIX named classes are supported only within a class"
#define ERR14 "missing )"
#define ERR15 "reference to non-existent subpattern"
#define ERR16 "erroffset passed as NULL"
#define ERR17 "unknown option bit(s) set"
#define ERR18 "missing ) after comment"
#define ERR19 "parentheses nested too deeply"
#define ERR20 "regular expression too large"
#define ERR21 "failed to get memory"
#define ERR22 "unmatched parentheses"
#define ERR23 "internal error: code overflow"
#define ERR24 "unrecognized character after (?<"
#define ERR25 "lookbehind assertion is not fixed length"
#define ERR26 "malformed number after (?("
#define ERR27 "conditional group contains more than two branches"
#define ERR28 "assertion expected after (?("
#define ERR29 "(?R or (?digits must be followed by )"
#define ERR30 "unknown POSIX class name"
#define ERR31 "POSIX collating elements are not supported"
#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support"
#define ERR33 "spare error"
#define ERR34 "character value in \\x{...} sequence is too large"
#define ERR35 "invalid condition (?(0)"
#define ERR36 "\\C not allowed in lookbehind assertion"
#define ERR37 "PCRE does not support \\L, \\l, \\N, \\P, \\p, \\U, \\u, or \\X"
#define ERR38 "number after (?C is > 255"
#define ERR39 "closing ) for (?C expected"
#define ERR40 "recursive call could loop indefinitely"
#define ERR41 "unrecognized character after (?P"
#define ERR42 "syntax error after (?P"
#define ERR43 "two named groups have the same name"
/* All character handling must be done as unsigned characters. Otherwise there
are problems with top-bit-set characters and functions such as isspace().
However, we leave the interface to the outside world as char *, because that
should make things easier for callers. We define a short type for unsigned char
to save lots of typing. I tried "uchar", but it causes problems on Digital
Unix, where it is defined in sys/types, so use "uschar" instead. */
typedef unsigned char uschar;
/* The real format of the start of the pcre block; the index of names and the /* The real format of the start of the pcre block; the index of names and the
code vector run on as long as necessary after the end. */ code vector run on as long as necessary after the end. We store an explicit
offset to the name table so that if a regex is compiled on one host, saved, and
then run on another where the size of pointers is different, all might still
be well. For the case of compiled-on-4 and run-on-8, we include an extra
pointer that is always NULL. For future-proofing, a few dummy fields were
originally included - even though you can never get this planning right - but
there is only one left now.
NOTE NOTE NOTE:
Because people can now save and re-use compiled patterns, any additions to this
structure should be made at the end, and something earlier (e.g. a new
flag in the options or one of the dummy fields) should indicate that the new
fields are present. Currently PCRE always sets the dummy fields to zero.
NOTE NOTE NOTE:
*/
typedef struct real_pcre { typedef struct real_pcre {
unsigned long int magic_number; pcre_uint32 magic_number;
size_t size; /* Total that was malloced */ pcre_uint32 size; /* Total that was malloced */
const unsigned char *tables; /* Pointer to tables */ pcre_uint32 options;
unsigned long int options; pcre_uint32 dummy1; /* For future use, maybe */
unsigned short int top_bracket;
unsigned short int top_backref; pcre_uint16 top_bracket;
unsigned short int first_byte; pcre_uint16 top_backref;
unsigned short int req_byte; pcre_uint16 first_byte;
unsigned short int name_entry_size; /* Size of any name items; 0 => none */ pcre_uint16 req_byte;
unsigned short int name_count; /* Number of name items */ pcre_uint16 name_table_offset; /* Offset to name table that follows */
pcre_uint16 name_entry_size; /* Size of any name items */
pcre_uint16 name_count; /* Number of name items */
pcre_uint16 ref_count; /* Reference count */
const unsigned char *tables; /* Pointer to tables or NULL for std */
const unsigned char *nullpad; /* NULL padding */
} real_pcre; } real_pcre;
/* The format of the block used to store data from pcre_study(). */ /* The format of the block used to store data from pcre_study(). The same
remark (see NOTE above) about extending this structure applies. */
typedef struct pcre_study_data { typedef struct pcre_study_data {
size_t size; /* Total that was malloced */ pcre_uint32 size; /* Total that was malloced */
uschar options; pcre_uint32 options;
uschar start_bits[32]; uschar start_bits[32];
} pcre_study_data; } pcre_study_data;
@@ -576,12 +746,14 @@ typedef struct compile_data {
const uschar *cbits; /* Points to character type table */ const uschar *cbits; /* Points to character type table */
const uschar *ctypes; /* Points to table of type maps */ const uschar *ctypes; /* Points to table of type maps */
const uschar *start_code; /* The start of the compiled code */ const uschar *start_code; /* The start of the compiled code */
const uschar *start_pattern; /* The start of the pattern */
uschar *name_table; /* The name/number table */ uschar *name_table; /* The name/number table */
int names_found; /* Number of entries so far */ int names_found; /* Number of entries so far */
int name_entry_size; /* Size of each entry */ int name_entry_size; /* Size of each entry */
int top_backref; /* Maximum back reference */ int top_backref; /* Maximum back reference */
unsigned int backref_map; /* Bitmap of low back refs */ unsigned int backref_map; /* Bitmap of low back refs */
int req_varyopt; /* "After variable item" flag for reqbyte */ int req_varyopt; /* "After variable item" flag for reqbyte */
BOOL nopartial; /* Set TRUE if partial won't work */
} compile_data; } compile_data;
/* Structure for maintaining a chain of pointers to the currently incomplete /* Structure for maintaining a chain of pointers to the currently incomplete
@@ -596,7 +768,7 @@ typedef struct branch_chain {
call within the pattern. */ call within the pattern. */
typedef struct recursion_info { typedef struct recursion_info {
struct recursion_info *prev; /* Previous recursion record (or NULL) */ struct recursion_info *prevrec; /* Previous recursion record (or NULL) */
int group_num; /* Number of group that was called */ int group_num; /* Number of group that was called */
const uschar *after_call; /* "Return value": points after the call in the expr */ const uschar *after_call; /* "Return value": points after the call in the expr */
const uschar *save_start; /* Old value of md->start_match */ const uschar *save_start; /* Old value of md->start_match */
@@ -604,8 +776,18 @@ typedef struct recursion_info {
int saved_max; /* Number of saved offsets */ int saved_max; /* Number of saved offsets */
} recursion_info; } recursion_info;
/* When compiling in a mode that doesn't use recursive calls to match(),
a structure is used to remember local variables on the heap. It is defined in
pcre.c, close to the match() function, so that it is easy to keep it in step
with any changes of local variable. However, the pointer to the current frame
must be saved in some "static" place over a longjmp(). We declare the
structure here so that we can put a pointer in the match_data structure.
NOTE: This isn't used for a "normal" compilation of pcre. */
struct heapframe;
/* Structure for passing "static" information around between the functions /* Structure for passing "static" information around between the functions
doing the matching, so that they are thread-safe. */ doing traditional NFA matching, so that they are thread-safe. */
typedef struct match_data { typedef struct match_data {
unsigned long int match_call_count; /* As it says */ unsigned long int match_call_count; /* As it says */
@@ -621,6 +803,8 @@ typedef struct match_data {
BOOL utf8; /* UTF8 flag */ BOOL utf8; /* UTF8 flag */
BOOL endonly; /* Dollar not before final \n */ BOOL endonly; /* Dollar not before final \n */
BOOL notempty; /* Empty string match not wanted */ BOOL notempty; /* Empty string match not wanted */
BOOL partial; /* PARTIAL flag */
BOOL hitend; /* Hit the end of the subject at some point */
const uschar *start_code; /* For use when recursing */ const uschar *start_code; /* For use when recursing */
const uschar *start_subject; /* Start of the subject string */ const uschar *start_subject; /* Start of the subject string */
const uschar *end_subject; /* End of the subject string */ const uschar *end_subject; /* End of the subject string */
@@ -631,8 +815,22 @@ typedef struct match_data {
int start_offset; /* The start offset value */ int start_offset; /* The start offset value */
recursion_info *recursive; /* Linked list of recursion data */ recursion_info *recursive; /* Linked list of recursion data */
void *callout_data; /* To pass back to callouts */ void *callout_data; /* To pass back to callouts */
struct heapframe *thisframe; /* Used only when compiling for no recursion */
} match_data; } match_data;
/* A similar structure is used for the same purpose by the DFA matching
functions. */
typedef struct dfa_match_data {
const uschar *start_code; /* Start of the compiled pattern */
const uschar *start_subject; /* Start of the subject string */
const uschar *end_subject; /* End of subject string */
const uschar *tables; /* Character tables */
int moptions; /* Match options */
int poptions; /* Pattern options */
void *callout_data; /* To pass back to callouts */
} dfa_match_data;
/* Bit definitions for entries in the pcre_ctypes table. */ /* Bit definitions for entries in the pcre_ctypes table. */
#define ctype_space 0x01 #define ctype_space 0x01
@@ -666,4 +864,45 @@ total length. */
#define ctypes_offset (cbits_offset + cbit_length) #define ctypes_offset (cbits_offset + cbit_length)
#define tables_length (ctypes_offset + 256) #define tables_length (ctypes_offset + 256)
/* End of internal.h */ /* Layout of the UCP type table that translates property names into codes for
ucp_findchar(). */
typedef struct {
const char *name;
int value;
} ucp_type_table;
/* Internal shared data tables. These are tables that are used by more than one
of the exported public functions. They have to be "external" in the C sense,
but are not part of the PCRE public API. The data for these tables is in the
pcre_tables.c module. */
extern const int _pcre_utf8_table1[];
extern const int _pcre_utf8_table2[];
extern const int _pcre_utf8_table3[];
extern const uschar _pcre_utf8_table4[];
extern const int _pcre_utf8_table1_size;
extern const ucp_type_table _pcre_utt[];
extern const int _pcre_utt_size;
extern const uschar _pcre_default_tables[];
extern const uschar _pcre_OP_lengths[];
/* Internal shared functions. These are functions that are used by more than
one of the exported public functions. They have to be "external" in the C
sense, but are not part of the PCRE public API. */
extern int _pcre_ord2utf8(int, uschar *);
extern void _pcre_printint(pcre *, FILE *);
extern real_pcre * _pcre_try_flipped(const real_pcre *, real_pcre *,
const pcre_study_data *, pcre_study_data *);
extern int _pcre_ucp_findchar(const int, int *, int *);
extern int _pcre_valid_utf8(const uschar *, int);
extern BOOL _pcre_xclass(int, const uschar *);
/* End of pcre_internal.h */

View File

@@ -2,48 +2,53 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* /* PCRE is a library of functions to support regular expressions whose syntax
PCRE 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. and semantics are as close as possible to those of the Perl 5 language.
Written by: Philip Hazel <ph10@cam.ac.uk> Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
Copyright (c) 1997-2003 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Permission is granted to anyone to use this software for any purpose on any Redistribution and use in source and binary forms, with or without
computer system, and to redistribute it freely, subject to the following modification, are permitted provided that the following conditions are met:
restrictions:
1. This software is distributed in the hope that it will be useful, * Redistributions of source code must retain the above copyright notice,
but WITHOUT ANY WARRANTY; without even the implied warranty of this list of conditions and the following disclaimer.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by * Redistributions in binary form must reproduce the above copyright
explicit claim or by omission. notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Altered versions must be plainly marked as such, and must not be * Neither the name of the University of Cambridge nor the names of its
misrepresented as being the original software. contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
4. If PCRE is embedded in any software that is released under the GNU THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
General Purpose Licence (GPL), then the terms of that licence shall AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
supersede any condition above with which it is incompatible. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
See the file Tech.Notes for some information on the internals.
*/ */
/* This file is compiled on its own as part of the PCRE library. However, /* This module contains the external function pcre_maketables(), which builds
it is also included in the compilation of dftables.c, in which case the macro character tables for PCRE in the current locale. The file is compiled on its
DFTABLES is defined. */ own as part of the PCRE library. However, it is also included in the
compilation of dftables.c, in which case the macro DFTABLES is defined. */
#ifndef DFTABLES #ifndef DFTABLES
#include "internal.h" #include "pcre_internal.h"
#endif #endif
/************************************************* /*************************************************
* Create PCRE character tables * * Create PCRE character tables *
*************************************************/ *************************************************/
@@ -126,11 +131,15 @@ for (i = 0; i < 256; i++)
if (isdigit(i)) x += ctype_digit; if (isdigit(i)) x += ctype_digit;
if (isxdigit(i)) x += ctype_xdigit; if (isxdigit(i)) x += ctype_xdigit;
if (isalnum(i) || i == '_') x += ctype_word; if (isalnum(i) || i == '_') x += ctype_word;
if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta;
*p++ = x; /* Note: strchr includes the terminating zero in the characters it considers.
} In this instance, that is ok because we want binary zero to be flagged as a
meta-character, which in this sense is any character that terminates a run
of data characters. */
if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; *p++ = x; }
return yield; return yield;
} }
/* End of maketables.c */ /* End of pcre_maketables.c */

View File

@@ -2,41 +2,48 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* /* PCRE is a library of functions to support regular expressions whose syntax
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.
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.
Written by: Philip Hazel <ph10@cam.ac.uk> Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
Copyright (c) 1997-2003 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Permission is granted to anyone to use this software for any purpose on any Redistribution and use in source and binary forms, with or without
computer system, and to redistribute it freely, subject to the following modification, are permitted provided that the following conditions are met:
restrictions:
1. This software is distributed in the hope that it will be useful, * Redistributions of source code must retain the above copyright notice,
but WITHOUT ANY WARRANTY; without even the implied warranty of this list of conditions and the following disclaimer.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by * Redistributions in binary form must reproduce the above copyright
explicit claim or by omission. notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Altered versions must be plainly marked as such, and must not be * Neither the name of the University of Cambridge nor the names of its
misrepresented as being the original software. contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
4. If PCRE is embedded in any software that is released under the GNU THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
General Purpose Licence (GPL), then the terms of that licence shall AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
supersede any condition above with which it is incompatible. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
/* This module contains a debugging function for printing out the internal form /* This module contains an PCRE private debugging function for printing out the
of a compiled regular expression. It is kept in a separate file so that it can internal form of a compiled regular expression, along with some supporting
be #included both in the pcretest program, and in the library itself when local functions. */
compiled with the debugging switch. */
#include "pcre_internal.h"
static const char *OP_names[] = { OP_NAME_LIST }; static const char *OP_names[] = { OP_NAME_LIST };
@@ -46,18 +53,6 @@ static const char *OP_names[] = { OP_NAME_LIST };
* Print single- or multi-byte character * * Print single- or multi-byte character *
*************************************************/ *************************************************/
/* These tables are actually copies of ones in pcre.c. If we compile the
library with debugging, they are included twice, but that isn't really a
problem - compiling with debugging is pretty rare and these are very small. */
static int utf8_t3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
static uschar utf8_t4[] = {
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
static int static int
print_char(FILE *f, uschar *ptr, BOOL utf8) print_char(FILE *f, uschar *ptr, BOOL utf8)
{ {
@@ -71,11 +66,23 @@ if (!utf8 || (c & 0xc0) != 0xc0)
else else
{ {
int i; int i;
int a = utf8_t4[c & 0x3f]; /* Number of additional bytes */ int a = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */
int s = 6*a; int s = 6*a;
c = (c & utf8_t3[a]) << s; c = (c & _pcre_utf8_table3[a]) << s;
for (i = 1; i <= a; i++) for (i = 1; i <= a; i++)
{ {
/* This is a check for malformed UTF-8; it should only occur if the sanity
check has been turned off. Rather than swallow random bytes, just stop if
we hit a bad one. Print it with \X instead of \x as an indication. */
if ((ptr[i] & 0xc0) != 0x80)
{
fprintf(f, "\\X{%x}", c);
return i - 1;
}
/* The byte is OK */
s -= 6; s -= 6;
c |= (ptr[i] & 0x3f) << s; c |= (ptr[i] & 0x3f) << s;
} }
@@ -86,19 +93,59 @@ else
/*************************************************
* Find Unicode property name *
*************************************************/
static const char *
get_ucpname(int property)
{
#ifdef SUPPORT_UCP
int i;
for (i = _pcre_utt_size; i >= 0; i--)
{
if (property == _pcre_utt[i].value) break;
}
return (i >= 0)? _pcre_utt[i].name : "??";
#else
return "??";
#endif
}
/************************************************* /*************************************************
* Print compiled regex * * Print compiled regex *
*************************************************/ *************************************************/
static void /* Make this function work for a regex with integers either byte order.
print_internals(pcre *external_re, FILE *f) However, we assume that what we are passed is a compiled regex. */
EXPORT void
_pcre_printint(pcre *external_re, FILE *f)
{ {
real_pcre *re = (real_pcre *)external_re; real_pcre *re = (real_pcre *)external_re;
uschar *codestart = uschar *codestart, *code;
(uschar *)re + sizeof(real_pcre) + re->name_count * re->name_entry_size; BOOL utf8;
uschar *code = codestart;
BOOL utf8 = (re->options & PCRE_UTF8) != 0; unsigned int options = re->options;
int offset = re->name_table_offset;
int count = re->name_count;
int size = re->name_entry_size;
if (re->magic_number != MAGIC_NUMBER)
{
offset = ((offset << 8) & 0xff00) | ((offset >> 8) & 0xff);
count = ((count << 8) & 0xff00) | ((count >> 8) & 0xff);
size = ((size << 8) & 0xff00) | ((size >> 8) & 0xff);
options = ((options << 24) & 0xff000000) |
((options << 8) & 0x00ff0000) |
((options >> 8) & 0x0000ff00) |
((options >> 24) & 0x000000ff);
}
code = codestart = (uschar *)re + offset + count * size;
utf8 = (options & PCRE_UTF8) != 0;
for(;;) for(;;)
{ {
@@ -106,7 +153,7 @@ for(;;)
int c; int c;
int extra = 0; int extra = 0;
fprintf(f, "%3d ", code - codestart); fprintf(f, "%3d ", (int)(code - codestart));
if (*code >= OP_BRA) if (*code >= OP_BRA)
{ {
@@ -114,7 +161,7 @@ for(;;)
fprintf(f, "%3d Bra extra\n", GET(code, 1)); fprintf(f, "%3d Bra extra\n", GET(code, 1));
else else
fprintf(f, "%3d Bra %d\n", GET(code, 1), *code - OP_BRA); fprintf(f, "%3d Bra %d\n", GET(code, 1), *code - OP_BRA);
code += OP_lengths[OP_BRA]; code += _pcre_OP_lengths[OP_BRA];
continue; continue;
} }
@@ -129,18 +176,31 @@ for(;;)
fprintf(f, " %.2x %s", code[1], OP_names[*code]); fprintf(f, " %.2x %s", code[1], OP_names[*code]);
break; break;
case OP_CHARS: case OP_CHAR:
{ {
int charlength = code[1]; fprintf(f, " ");
ccode = code + 2; do
extra = charlength;
fprintf(f, "%3d ", charlength);
while (charlength > 0)
{ {
int extrabytes = print_char(f, ccode, utf8); code++;
ccode += 1 + extrabytes; code += 1 + print_char(f, code, utf8);
charlength -= 1 + extrabytes;
} }
while (*code == OP_CHAR);
fprintf(f, "\n");
continue;
}
break;
case OP_CHARNC:
{
fprintf(f, " NC ");
do
{
code++;
code += 1 + print_char(f, code, utf8);
}
while (*code == OP_CHARNC);
fprintf(f, "\n");
continue;
} }
break; break;
@@ -182,8 +242,16 @@ for(;;)
case OP_TYPEQUERY: case OP_TYPEQUERY:
case OP_TYPEMINQUERY: case OP_TYPEMINQUERY:
fprintf(f, " "); fprintf(f, " ");
if (*code >= OP_TYPESTAR) fprintf(f, "%s", OP_names[code[1]]); if (*code >= OP_TYPESTAR)
else extra = print_char(f, code+1, utf8); {
fprintf(f, "%s", OP_names[code[1]]);
if (code[1] == OP_PROP || code[1] == OP_NOTPROP)
{
fprintf(f, " %s ", get_ucpname(code[2]));
extra = 1;
}
}
else extra = print_char(f, code+1, utf8);
fprintf(f, "%s", OP_names[*code]); fprintf(f, "%s", OP_names[*code]);
break; break;
@@ -201,7 +269,13 @@ for(;;)
case OP_TYPEEXACT: case OP_TYPEEXACT:
case OP_TYPEUPTO: case OP_TYPEUPTO:
case OP_TYPEMINUPTO: case OP_TYPEMINUPTO:
fprintf(f, " %s{", OP_names[code[3]]); fprintf(f, " %s", OP_names[code[3]]);
if (code[3] == OP_PROP || code[3] == OP_NOTPROP)
{
fprintf(f, " %s ", get_ucpname(code[4]));
extra = 1;
}
fprintf(f, "{");
if (*code != OP_TYPEEXACT) fprintf(f, "0,"); if (*code != OP_TYPEEXACT) fprintf(f, "0,");
fprintf(f, "%d}", GET2(code,1)); fprintf(f, "%d}", GET2(code,1));
if (*code == OP_TYPEMINUPTO) fprintf(f, "?"); if (*code == OP_TYPEMINUPTO) fprintf(f, "?");
@@ -228,7 +302,7 @@ for(;;)
case OP_NOTMINUPTO: case OP_NOTMINUPTO:
if (isprint(c = code[3])) fprintf(f, " [^%c]{", c); if (isprint(c = code[3])) fprintf(f, " [^%c]{", c);
else fprintf(f, " [^\\x%02x]{", c); else fprintf(f, " [^\\x%02x]{", c);
if (*code != OP_NOTEXACT) fprintf(f, ","); if (*code != OP_NOTEXACT) fprintf(f, "0,");
fprintf(f, "%d}", GET2(code,1)); fprintf(f, "%d}", GET2(code,1));
if (*code == OP_NOTMINUPTO) fprintf(f, "?"); if (*code == OP_NOTMINUPTO) fprintf(f, "?");
break; break;
@@ -239,11 +313,17 @@ for(;;)
case OP_REF: case OP_REF:
fprintf(f, " \\%d", GET2(code,1)); fprintf(f, " \\%d", GET2(code,1));
ccode = code + OP_lengths[*code]; ccode = code + _pcre_OP_lengths[*code];
goto CLASS_REF_REPEAT; goto CLASS_REF_REPEAT;
case OP_CALLOUT: case OP_CALLOUT:
fprintf(f, " %s %d", OP_names[*code], code[1]); fprintf(f, " %s %d %d %d", OP_names[*code], code[1], GET(code,2),
GET(code, 2 + LINK_SIZE));
break;
case OP_PROP:
case OP_NOTPROP:
fprintf(f, " %s %s", OP_names[*code], get_ucpname(code[1]));
break; break;
/* OP_XCLASS can only occur in UTF-8 mode. However, there's no harm in /* OP_XCLASS can only occur in UTF-8 mode. However, there's no harm in
@@ -287,7 +367,7 @@ for(;;)
if (isprint(i)) fprintf(f, "%c", i); else fprintf(f, "\\x%02x", i); if (isprint(i)) fprintf(f, "%c", i); else fprintf(f, "\\x%02x", i);
if (--j > i) if (--j > i)
{ {
fprintf(f, "-"); if (j != i + 1) fprintf(f, "-");
if (j == '-' || j == ']') fprintf(f, "\\"); if (j == '-' || j == ']') fprintf(f, "\\");
if (isprint(j)) fprintf(f, "%c", j); else fprintf(f, "\\x%02x", j); if (isprint(j)) fprintf(f, "%c", j); else fprintf(f, "\\x%02x", j);
} }
@@ -304,11 +384,22 @@ for(;;)
int ch; int ch;
while ((ch = *ccode++) != XCL_END) while ((ch = *ccode++) != XCL_END)
{ {
ccode += 1 + print_char(f, ccode, TRUE); if (ch == XCL_PROP)
if (ch == XCL_RANGE) {
fprintf(f, "\\p{%s}", get_ucpname(*ccode++));
}
else if (ch == XCL_NOTPROP)
{
fprintf(f, "\\P{%s}", get_ucpname(*ccode++));
}
else
{ {
fprintf(f, "-");
ccode += 1 + print_char(f, ccode, TRUE); ccode += 1 + print_char(f, ccode, TRUE);
if (ch == XCL_RANGE)
{
fprintf(f, "-");
ccode += 1 + print_char(f, ccode, TRUE);
}
} }
} }
} }
@@ -329,7 +420,7 @@ for(;;)
case OP_CRQUERY: case OP_CRQUERY:
case OP_CRMINQUERY: case OP_CRMINQUERY:
fprintf(f, "%s", OP_names[*ccode]); fprintf(f, "%s", OP_names[*ccode]);
extra = OP_lengths[*ccode]; extra += _pcre_OP_lengths[*ccode];
break; break;
case OP_CRRANGE: case OP_CRRANGE:
@@ -339,7 +430,7 @@ for(;;)
if (max == 0) fprintf(f, "{%d,}", min); if (max == 0) fprintf(f, "{%d,}", min);
else fprintf(f, "{%d,%d}", min, max); else fprintf(f, "{%d,%d}", min, max);
if (*ccode == OP_CRMINRANGE) fprintf(f, "?"); if (*ccode == OP_CRMINRANGE) fprintf(f, "?");
extra = OP_lengths[*ccode]; extra += _pcre_OP_lengths[*ccode];
break; break;
} }
} }
@@ -352,9 +443,9 @@ for(;;)
break; break;
} }
code += OP_lengths[*code] + extra; code += _pcre_OP_lengths[*code] + extra;
fprintf(f, "\n"); fprintf(f, "\n");
} }
} }
/* End of printint.c */ /* End of pcre_printint.c */

77
libpcre/pcre_refcount.c Normal file
View File

@@ -0,0 +1,77 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains the external function pcre_refcount(), which is an
auxiliary function that can be used to maintain a reference count in a compiled
pattern data block. This might be helpful in applications where the block is
shared by different users. */
#include "pcre_internal.h"
/*************************************************
* Maintain reference count *
*************************************************/
/* The reference count is a 16-bit field, initialized to zero. It is not
possible to transfer a non-zero count from one host to a different host that
has a different byte order - though I can't see why anyone in their right mind
would ever want to do that!
Arguments:
argument_re points to compiled code
adjust value to add to the count
Returns: the (possibly updated) count value (a non-negative number), or
a negative error number
*/
EXPORT int
pcre_refcount(pcre *argument_re, int adjust)
{
real_pcre *re = (real_pcre *)argument_re;
if (re == NULL) return PCRE_ERROR_NULL;
re->ref_count = (-adjust > re->ref_count)? 0 :
(adjust + re->ref_count > 65535)? 65535 :
re->ref_count + adjust;
return re->ref_count;
}
/* End of pcre_refcount.c */

View File

@@ -2,42 +2,47 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* /* PCRE is a library of functions to support regular expressions whose syntax
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.
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.
Written by: Philip Hazel <ph10@cam.ac.uk> Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
Copyright (c) 1997-2002 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Permission is granted to anyone to use this software for any purpose on any Redistribution and use in source and binary forms, with or without
computer system, and to redistribute it freely, subject to the following modification, are permitted provided that the following conditions are met:
restrictions:
1. This software is distributed in the hope that it will be useful, * Redistributions of source code must retain the above copyright notice,
but WITHOUT ANY WARRANTY; without even the implied warranty of this list of conditions and the following disclaimer.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by * Redistributions in binary form must reproduce the above copyright
explicit claim or by omission. notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Altered versions must be plainly marked as such, and must not be * Neither the name of the University of Cambridge nor the names of its
misrepresented as being the original software. contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
4. If PCRE is embedded in any software that is released under the GNU THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
General Purpose Licence (GPL), then the terms of that licence shall AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
supersede any condition above with which it is incompatible. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
/* Include the internals header, which itself includes Standard C headers plus /* This module contains the external function pcre_study(), along with local
the external pcre header. */ supporting functions. */
#include "internal.h"
#include "pcre_internal.h"
/************************************************* /*************************************************
@@ -57,7 +62,7 @@ Returns: nothing
*/ */
static void static void
set_bit(uschar *start_bits, int c, BOOL caseless, compile_data *cd) set_bit(uschar *start_bits, unsigned int c, BOOL caseless, compile_data *cd)
{ {
start_bits[c/8] |= (1 << (c&7)); start_bits[c/8] |= (1 << (c&7));
if (caseless && (cd->ctypes[c] & ctype_letter) != 0) if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
@@ -123,7 +128,7 @@ do
/* Skip over callout */ /* Skip over callout */
case OP_CALLOUT: case OP_CALLOUT:
tcode += 2; tcode += 2 + 2*LINK_SIZE;
break; break;
/* Skip over extended extraction bracket number */ /* Skip over extended extraction bracket number */
@@ -186,11 +191,10 @@ do
/* At least one single char sets the bit and stops */ /* At least one single char sets the bit and stops */
case OP_EXACT: /* Fall through */ case OP_EXACT: /* Fall through */
tcode++; tcode += 2;
case OP_CHARS: /* Fall through */
tcode++;
case OP_CHAR:
case OP_CHARNC:
case OP_PLUS: case OP_PLUS:
case OP_MINPLUS: case OP_MINPLUS:
set_bit(start_bits, tcode[1], caseless, cd); set_bit(start_bits, tcode[1], caseless, cd);
@@ -260,6 +264,9 @@ do
case OP_TYPEMINQUERY: case OP_TYPEMINQUERY:
switch(tcode[1]) switch(tcode[1])
{ {
case OP_ANY:
return FALSE;
case OP_NOT_DIGIT: case OP_NOT_DIGIT:
for (c = 0; c < 32; c++) for (c = 0; c < 32; c++)
start_bits[c] |= ~cd->cbits[c+cbit_digit]; start_bits[c] |= ~cd->cbits[c+cbit_digit];
@@ -297,19 +304,50 @@ do
/* Character class where all the information is in a bit map: set the /* Character class where all the information is in a bit map: set the
bits and either carry on or not, according to the repeat count. If it was bits and either carry on or not, according to the repeat count. If it was
a negative class, and we are operating with UTF-8 characters, any byte a negative class, and we are operating with UTF-8 characters, any byte
with the top-bit set is a potentially valid starter because it may start with a value >= 0xc4 is a potentially valid starter because it starts a
a character with a value > 255. (This is sub-optimal in that the character with a value > 255. */
character may be in the range 128-255, and those characters might be
unwanted, but that's as far as we go for the moment.) */
case OP_NCLASS: case OP_NCLASS:
if (utf8) memset(start_bits+16, 0xff, 16); if (utf8)
{
start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */
memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */
}
/* Fall through */ /* Fall through */
case OP_CLASS: case OP_CLASS:
{ {
tcode++; tcode++;
for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
/* In UTF-8 mode, the bits in a bit map correspond to character
values, not to byte values. However, the bit map we are constructing is
for byte values. So we have to do a conversion for characters whose
value is > 127. In fact, there are only two possible starting bytes for
characters in the range 128 - 255. */
if (utf8)
{
for (c = 0; c < 16; c++) start_bits[c] |= tcode[c];
for (c = 128; c < 256; c++)
{
if ((tcode[c/8] && (1 << (c&7))) != 0)
{
int d = (c >> 6) | 0xc0; /* Set bit for this starter */
start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */
c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */
}
}
}
/* In non-UTF-8 mode, the two bit maps are completely compatible. */
else
{
for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
}
/* Advance past the bit map, and act on what follows */
tcode += 32; tcode += 32;
switch (*tcode) switch (*tcode)
{ {
@@ -363,14 +401,15 @@ Returns: pointer to a pcre_extra block, with study_data filled in and the
NULL on error or if no optimization possible NULL on error or if no optimization possible
*/ */
pcre_extra * EXPORT pcre_extra *
pcre_study(const pcre *external_re, int options, const char **errorptr) pcre_study(const pcre *external_re, int options, const char **errorptr)
{ {
uschar start_bits[32]; uschar start_bits[32];
pcre_extra *extra; pcre_extra *extra;
pcre_study_data *study; pcre_study_data *study;
const uschar *tables;
const real_pcre *re = (const real_pcre *)external_re; const real_pcre *re = (const real_pcre *)external_re;
uschar *code = (uschar *)re + sizeof(real_pcre) + uschar *code = (uschar *)re + re->name_table_offset +
(re->name_count * re->name_entry_size); (re->name_count * re->name_entry_size);
compile_data compile_block; compile_data compile_block;
@@ -395,12 +434,17 @@ at present. */
if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0)
return NULL; return NULL;
/* Set the character tables in the block which is passed around */ /* Set the character tables in the block that is passed around */
compile_block.lcc = re->tables + lcc_offset; tables = re->tables;
compile_block.fcc = re->tables + fcc_offset; if (tables == NULL)
compile_block.cbits = re->tables + cbits_offset; (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,
compile_block.ctypes = re->tables + ctypes_offset; (void *)(&tables));
compile_block.lcc = tables + lcc_offset;
compile_block.fcc = tables + fcc_offset;
compile_block.cbits = tables + cbits_offset;
compile_block.ctypes = tables + ctypes_offset;
/* See if we can find a fixed set of initial characters for the pattern. */ /* See if we can find a fixed set of initial characters for the pattern. */
@@ -435,4 +479,4 @@ memcpy(study->start_bits, start_bits, sizeof(start_bits));
return extra; return extra;
} }
/* End of study.c */ /* End of pcre_study.c */

129
libpcre/pcre_tables.c Normal file
View File

@@ -0,0 +1,129 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains some fixed tables that are used by more than one of the
PCRE code modules. */
#include "pcre_internal.h"
/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that
the definition is next to the definition of the opcodes in internal.h. */
const uschar _pcre_OP_lengths[] = { OP_LENGTHS };
/*************************************************
* Tables for UTF-8 support *
*************************************************/
/* These are the breakpoints for different numbers of bytes in a UTF-8
character. */
const int _pcre_utf8_table1[] =
{ 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
const int _pcre_utf8_table1_size = sizeof(_pcre_utf8_table1)/sizeof(int);
/* These are the indicator bits and the mask for the data bits to set in the
first byte of a character, indexed by the number of additional bytes. */
const int _pcre_utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
const int _pcre_utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
/* Table of the number of extra characters, indexed by the first character
masked with 0x3f. The highest number for a valid UTF-8 character is in fact
0x3d. */
const uschar _pcre_utf8_table4[] = {
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
/* This table translates Unicode property names into code values for the
ucp_findchar() function. It is used by pcretest as well as by the library
functions. */
const ucp_type_table _pcre_utt[] = {
{ "C", 128 + ucp_C },
{ "Cc", ucp_Cc },
{ "Cf", ucp_Cf },
{ "Cn", ucp_Cn },
{ "Co", ucp_Co },
{ "Cs", ucp_Cs },
{ "L", 128 + ucp_L },
{ "Ll", ucp_Ll },
{ "Lm", ucp_Lm },
{ "Lo", ucp_Lo },
{ "Lt", ucp_Lt },
{ "Lu", ucp_Lu },
{ "M", 128 + ucp_M },
{ "Mc", ucp_Mc },
{ "Me", ucp_Me },
{ "Mn", ucp_Mn },
{ "N", 128 + ucp_N },
{ "Nd", ucp_Nd },
{ "Nl", ucp_Nl },
{ "No", ucp_No },
{ "P", 128 + ucp_P },
{ "Pc", ucp_Pc },
{ "Pd", ucp_Pd },
{ "Pe", ucp_Pe },
{ "Pf", ucp_Pf },
{ "Pi", ucp_Pi },
{ "Po", ucp_Po },
{ "Ps", ucp_Ps },
{ "S", 128 + ucp_S },
{ "Sc", ucp_Sc },
{ "Sk", ucp_Sk },
{ "Sm", ucp_Sm },
{ "So", ucp_So },
{ "Z", 128 + ucp_Z },
{ "Zl", ucp_Zl },
{ "Zp", ucp_Zp },
{ "Zs", ucp_Zs }
};
const int _pcre_utt_size = sizeof(_pcre_utt)/sizeof(ucp_type_table);
/* End of pcre_tables.c */

132
libpcre/pcre_try_flipped.c Normal file
View File

@@ -0,0 +1,132 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains an internal function that tests a compiled pattern to
see if it was compiled with the opposite endianness. If so, it uses an
auxiliary local function to flip the appropriate bytes. */
#include "pcre_internal.h"
/*************************************************
* Flip bytes in an integer *
*************************************************/
/* This function is called when the magic number in a regex doesn't match, in
order to flip its bytes to see if we are dealing with a pattern that was
compiled on a host of different endianness. If so, this function is used to
flip other byte values.
Arguments:
value the number to flip
n the number of bytes to flip (assumed to be 2 or 4)
Returns: the flipped value
*/
static long int
byteflip(long int value, int n)
{
if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8);
return ((value & 0x000000ff) << 24) |
((value & 0x0000ff00) << 8) |
((value & 0x00ff0000) >> 8) |
((value & 0xff000000) >> 24);
}
/*************************************************
* Test for a byte-flipped compiled regex *
*************************************************/
/* This function is called from pcre_exec(), pcre_dfa_exec(), and also from
pcre_fullinfo(). Its job is to test whether the regex is byte-flipped - that
is, it was compiled on a system of opposite endianness. The function is called
only when the native MAGIC_NUMBER test fails. If the regex is indeed flipped,
we flip all the relevant values into a different data block, and return it.
Arguments:
re points to the regex
study points to study data, or NULL
internal_re points to a new regex block
internal_study points to a new study block
Returns: the new block if is is indeed a byte-flipped regex
NULL if it is not
*/
EXPORT real_pcre *
_pcre_try_flipped(const real_pcre *re, real_pcre *internal_re,
const pcre_study_data *study, pcre_study_data *internal_study)
{
if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER)
return NULL;
*internal_re = *re; /* To copy other fields */
internal_re->size = byteflip(re->size, sizeof(re->size));
internal_re->options = byteflip(re->options, sizeof(re->options));
internal_re->top_bracket =
(pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket));
internal_re->top_backref =
(pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref));
internal_re->first_byte =
(pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte));
internal_re->req_byte =
(pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte));
internal_re->name_table_offset =
(pcre_uint16)byteflip(re->name_table_offset, sizeof(re->name_table_offset));
internal_re->name_entry_size =
(pcre_uint16)byteflip(re->name_entry_size, sizeof(re->name_entry_size));
internal_re->name_count =
(pcre_uint16)byteflip(re->name_count, sizeof(re->name_count));
if (study != NULL)
{
*internal_study = *study; /* To copy other fields */
internal_study->size = byteflip(study->size, sizeof(study->size));
internal_study->options = byteflip(study->options, sizeof(study->options));
}
return internal_re;
}
/* End of pcre_tryflipped.c */

61
libpcre/pcre_version.c Normal file
View File

@@ -0,0 +1,61 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains the external function pcre_version(), which returns a
string that identifies the PCRE version that is in use. */
#include "pcre_internal.h"
/*************************************************
* Return version string *
*************************************************/
#define STRING(a) # a
#define XSTRING(s) STRING(s)
EXPORT const char *
pcre_version(void)
{
return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE);
}
/* End of pcre_version.c */

View File

@@ -1,184 +0,0 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* Copyright (c) 1997-2003 University of Cambridge */
#ifndef _PCRE_H
#define _PCRE_H
/* The file pcre.h is build by "configure". Do not edit it; instead
make changes to pcre.in. */
#define PCRE_MAJOR 4
#define PCRE_MINOR 3
#define PCRE_DATE "21-May-2003"
/* Win32 uses DLL by default */
#ifdef _WIN32
# ifdef PCRE_DEFINITION
# ifdef DLL_EXPORT
# define PCRE_DATA_SCOPE __declspec(dllexport)
# endif
# else
# ifndef PCRE_STATIC
# define PCRE_DATA_SCOPE __declspec(dllimport)
# endif
# endif
#endif
#ifndef PCRE_DATA_SCOPE
# define PCRE_DATA_SCOPE extern
#endif
/* Have to include stdlib.h in order to ensure that size_t is defined;
it is needed here for malloc. */
#include <stdlib.h>
/* Allow for C++ users */
#ifdef __cplusplus
extern "C" {
#endif
/* Options */
#define PCRE_CASELESS 0x0001
#define PCRE_MULTILINE 0x0002
#define PCRE_DOTALL 0x0004
#define PCRE_EXTENDED 0x0008
#define PCRE_ANCHORED 0x0010
#define PCRE_DOLLAR_ENDONLY 0x0020
#define PCRE_EXTRA 0x0040
#define PCRE_NOTBOL 0x0080
#define PCRE_NOTEOL 0x0100
#define PCRE_UNGREEDY 0x0200
#define PCRE_NOTEMPTY 0x0400
#define PCRE_UTF8 0x0800
#define PCRE_NO_AUTO_CAPTURE 0x1000
/* Exec-time and get/set-time error codes */
#define PCRE_ERROR_NOMATCH (-1)
#define PCRE_ERROR_NULL (-2)
#define PCRE_ERROR_BADOPTION (-3)
#define PCRE_ERROR_BADMAGIC (-4)
#define PCRE_ERROR_UNKNOWN_NODE (-5)
#define PCRE_ERROR_NOMEMORY (-6)
#define PCRE_ERROR_NOSUBSTRING (-7)
#define PCRE_ERROR_MATCHLIMIT (-8)
#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
/* Request types for pcre_fullinfo() */
#define PCRE_INFO_OPTIONS 0
#define PCRE_INFO_SIZE 1
#define PCRE_INFO_CAPTURECOUNT 2
#define PCRE_INFO_BACKREFMAX 3
#define PCRE_INFO_FIRSTBYTE 4
#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */
#define PCRE_INFO_FIRSTTABLE 5
#define PCRE_INFO_LASTLITERAL 6
#define PCRE_INFO_NAMEENTRYSIZE 7
#define PCRE_INFO_NAMECOUNT 8
#define PCRE_INFO_NAMETABLE 9
#define PCRE_INFO_STUDYSIZE 10
/* Request types for pcre_config() */
#define PCRE_CONFIG_UTF8 0
#define PCRE_CONFIG_NEWLINE 1
#define PCRE_CONFIG_LINK_SIZE 2
#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
#define PCRE_CONFIG_MATCH_LIMIT 4
/* Bit flags for the pcre_extra structure */
#define PCRE_EXTRA_STUDY_DATA 0x0001
#define PCRE_EXTRA_MATCH_LIMIT 0x0002
#define PCRE_EXTRA_CALLOUT_DATA 0x0004
/* Types */
struct real_pcre; /* declaration; the definition is private */
typedef struct real_pcre pcre;
/* The structure for passing additional data to pcre_exec(). This is defined in
such as way as to be extensible. */
typedef struct pcre_extra {
unsigned long int flags; /* Bits for which fields are set */
void *study_data; /* Opaque data from pcre_study() */
unsigned long int match_limit; /* Maximum number of calls to match() */
void *callout_data; /* Data passed back in callouts */
} pcre_extra;
/* The structure for passing out data via the pcre_callout_function. We use a
structure so that new fields can be added on the end in future versions,
without changing the API of the function, thereby allowing old clients to work
without modification. */
typedef struct pcre_callout_block {
int version; /* Identifies version of block */
/* ------------------------ Version 0 ------------------------------- */
int callout_number; /* Number compiled into pattern */
int *offset_vector; /* The offset vector */
const char *subject; /* The subject being matched */
int subject_length; /* The length of the subject */
int start_match; /* Offset to start of this match attempt */
int current_position; /* Where we currently are */
int capture_top; /* Max current capture */
int capture_last; /* Most recently closed capture */
void *callout_data; /* Data passed in with the call */
/* ------------------------------------------------------------------ */
} pcre_callout_block;
/* Indirection for store get and free functions. These can be set to
alternative malloc/free functions if required. There is also an optional
callout function that is triggered by the (?) regex item. Some magic is
required for Win32 DLL; it is null on other OS. For Virtual Pascal, these
have to be different again. */
#ifndef VPCOMPAT
PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
PCRE_DATA_SCOPE void (*pcre_free)(void *);
PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
#else /* VPCOMPAT */
extern void *pcre_malloc(size_t);
extern void pcre_free(void *);
extern int pcre_callout(pcre_callout_block *);
#endif /* VPCOMPAT */
/* Exported PCRE functions */
extern pcre *pcre_compile(const char *, int, const char **,
int *, const unsigned char *);
extern int pcre_config(int, void *);
extern int pcre_copy_named_substring(const pcre *, const char *,
int *, int, const char *, char *, int);
extern int pcre_copy_substring(const char *, int *, int, int,
char *, int);
extern int pcre_exec(const pcre *, const pcre_extra *,
const char *, int, int, int, int *, int);
extern void pcre_free_substring(const char *);
extern void pcre_free_substring_list(const char **);
extern int pcre_fullinfo(const pcre *, const pcre_extra *, int,
void *);
extern int pcre_get_named_substring(const pcre *, const char *,
int *, int, const char *, const char **);
extern int pcre_get_stringnumber(const pcre *, const char *);
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 *);
extern const unsigned char *pcre_maketables(void);
extern pcre_extra *pcre_study(const pcre *, int, const char **);
extern const char *pcre_version(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* End of pcre.h */

121
libpcre/pcre_xclass.c Normal file
View File

@@ -0,0 +1,121 @@
/*************************************************
* Perl-Compatible Regular Expressions *
*************************************************/
/* PCRE 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.
Written by Philip Hazel
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* This module contains an internal function that is used to match an extended
class (one that contains characters whose values are > 255). It is used by both
pcre_exec() and pcre_def_exec(). */
#include "pcre_internal.h"
/*************************************************
* Match character against an XCLASS *
*************************************************/
/* This function is called to match a character against an extended class that
might contain values > 255.
Arguments:
c the character
data points to the flag byte of the XCLASS data
Returns: TRUE if character matches, else FALSE
*/
EXPORT BOOL
_pcre_xclass(int c, const uschar *data)
{
int t;
BOOL negated = (*data & XCL_NOT) != 0;
/* Character values < 256 are matched against a bitmap, if one is present. If
not, we still carry on, because there may be ranges that start below 256 in the
additional data. */
if (c < 256)
{
if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0)
return !negated; /* char found */
}
/* First skip the bit map if present. Then match against the list of Unicode
properties or large chars or ranges that end with a large char. We won't ever
encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */
if ((*data++ & XCL_MAP) != 0) data += 32;
while ((t = *data++) != XCL_END)
{
int x, y;
if (t == XCL_SINGLE)
{
GETCHARINC(x, data);
if (c == x) return !negated;
}
else if (t == XCL_RANGE)
{
GETCHARINC(x, data);
GETCHARINC(y, data);
if (c >= x && c <= y) return !negated;
}
#ifdef SUPPORT_UCP
else /* XCL_PROP & XCL_NOTPROP */
{
int chartype, othercase;
int rqdtype = *data++;
int category = ucp_findchar(c, &chartype, &othercase);
if (rqdtype >= 128)
{
if ((rqdtype - 128 == category) == (t == XCL_PROP)) return !negated;
}
else
{
if ((rqdtype == chartype) == (t == XCL_PROP)) return !negated;
}
}
#endif /* SUPPORT_UCP */
}
return negated; /* char did not match */
}
/* End of pcre_xclass.c */

View File

@@ -2,103 +2,108 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* /* PCRE is a library of functions to support regular expressions whose syntax
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.
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.
This module is a wrapper that provides a POSIX API to the underlying PCRE Written by Philip Hazel
functions. Copyright (c) 1997-2005 University of Cambridge
Written by: Philip Hazel <ph10@cam.ac.uk>
Copyright (c) 1997-2003 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Permission is granted to anyone to use this software for any purpose on any Redistribution and use in source and binary forms, with or without
computer system, and to redistribute it freely, subject to the following modification, are permitted provided that the following conditions are met:
restrictions:
1. This software is distributed in the hope that it will be useful, * Redistributions of source code must retain the above copyright notice,
but WITHOUT ANY WARRANTY; without even the implied warranty of this list of conditions and the following disclaimer.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. The origin of this software must not be misrepresented, either by * Redistributions in binary form must reproduce the above copyright
explicit claim or by omission. notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Altered versions must be plainly marked as such, and must not be * Neither the name of the University of Cambridge nor the names of its
misrepresented as being the original software. contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
4. If PCRE is embedded in any software that is released under the GNU THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
General Purpose Licence (GPL), then the terms of that licence shall AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
supersede any condition above with which it is incompatible. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "internal.h"
/* This module is a wrapper that provides a POSIX API to the underlying PCRE
functions. */
#include "pcre_internal.h"
#include "pcreposix.h" #include "pcreposix.h"
#include "stdlib.h" #include "stdlib.h"
/* Corresponding tables of PCRE error messages and POSIX error codes. */ /* Table to translate PCRE compile time error codes into POSIX error codes. */
static const char *estring[] = { static const int eint[] = {
ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, 0, /* no error */
ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20, REG_EESCAPE, /* \ at end of pattern */
ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30, REG_EESCAPE, /* \c at end of pattern */
ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40, REG_EESCAPE, /* unrecognized character follows \ */
ERR41, ERR42, ERR43 }; REG_BADBR, /* numbers out of order in {} quantifier */
REG_BADBR, /* number too big in {} quantifier */
static int eint[] = { REG_EBRACK, /* missing terminating ] for character class */
REG_EESCAPE, /* "\\ at end of pattern" */ REG_ECTYPE, /* invalid escape sequence in character class */
REG_EESCAPE, /* "\\c at end of pattern" */ REG_ERANGE, /* range out of order in character class */
REG_EESCAPE, /* "unrecognized character follows \\" */ REG_BADRPT, /* nothing to repeat */
REG_BADBR, /* "numbers out of order in {} quantifier" */ REG_BADRPT, /* operand of unlimited repeat could match the empty string */
REG_BADBR, /* "number too big in {} quantifier" */ REG_ASSERT, /* internal error: unexpected repeat */
REG_EBRACK, /* "missing terminating ] for character class" */ REG_BADPAT, /* unrecognized character after (? */
REG_ECTYPE, /* "invalid escape sequence in character class" */ REG_BADPAT, /* POSIX named classes are supported only within a class */
REG_ERANGE, /* "range out of order in character class" */ REG_EPAREN, /* missing ) */
REG_BADRPT, /* "nothing to repeat" */ REG_ESUBREG, /* reference to non-existent subpattern */
REG_BADRPT, /* "operand of unlimited repeat could match the empty string" */ REG_INVARG, /* erroffset passed as NULL */
REG_ASSERT, /* "internal error: unexpected repeat" */ REG_INVARG, /* unknown option bit(s) set */
REG_BADPAT, /* "unrecognized character after (?" */ REG_EPAREN, /* missing ) after comment */
REG_BADPAT, /* "POSIX named classes are supported only within a class" */ REG_ESIZE, /* parentheses nested too deeply */
REG_EPAREN, /* "missing )" */ REG_ESIZE, /* regular expression too large */
REG_ESUBREG, /* "reference to non-existent subpattern" */ REG_ESPACE, /* failed to get memory */
REG_INVARG, /* "erroffset passed as NULL" */ REG_EPAREN, /* unmatched brackets */
REG_INVARG, /* "unknown option bit(s) set" */ REG_ASSERT, /* internal error: code overflow */
REG_EPAREN, /* "missing ) after comment" */ REG_BADPAT, /* unrecognized character after (?< */
REG_ESIZE, /* "parentheses nested too deeply" */ REG_BADPAT, /* lookbehind assertion is not fixed length */
REG_ESIZE, /* "regular expression too large" */ REG_BADPAT, /* malformed number after (?( */
REG_ESPACE, /* "failed to get memory" */ REG_BADPAT, /* conditional group containe more than two branches */
REG_EPAREN, /* "unmatched brackets" */ REG_BADPAT, /* assertion expected after (?( */
REG_ASSERT, /* "internal error: code overflow" */ REG_BADPAT, /* (?R or (?digits must be followed by ) */
REG_BADPAT, /* "unrecognized character after (?<" */ REG_ECTYPE, /* unknown POSIX class name */
REG_BADPAT, /* "lookbehind assertion is not fixed length" */ REG_BADPAT, /* POSIX collating elements are not supported */
REG_BADPAT, /* "malformed number after (?(" */ REG_INVARG, /* this version of PCRE is not compiled with PCRE_UTF8 support */
REG_BADPAT, /* "conditional group containe more than two branches" */ REG_BADPAT, /* spare error */
REG_BADPAT, /* "assertion expected after (?(" */ REG_BADPAT, /* character value in \x{...} sequence is too large */
REG_BADPAT, /* "(?R or (?digits must be followed by )" */ REG_BADPAT, /* invalid condition (?(0) */
REG_ECTYPE, /* "unknown POSIX class name" */ REG_BADPAT, /* \C not allowed in lookbehind assertion */
REG_BADPAT, /* "POSIX collating elements are not supported" */ REG_EESCAPE, /* PCRE does not support \L, \l, \N, \U, or \u */
REG_INVARG, /* "this version of PCRE is not compiled with PCRE_UTF8 support" */ REG_BADPAT, /* number after (?C is > 255 */
REG_BADPAT, /* "spare error" */ REG_BADPAT, /* closing ) for (?C expected */
REG_BADPAT, /* "character value in \x{...} sequence is too large" */ REG_BADPAT, /* recursive call could loop indefinitely */
REG_BADPAT, /* "invalid condition (?(0)" */ REG_BADPAT, /* unrecognized character after (?P */
REG_BADPAT, /* "\\C not allowed in lookbehind assertion" */ REG_BADPAT, /* syntax error after (?P */
REG_EESCAPE, /* "PCRE does not support \\L, \\l, \\N, \\P, \\p, \\U, \\u, or \\X" */ REG_BADPAT, /* two named groups have the same name */
REG_BADPAT, /* "number after (?C is > 255" */ REG_BADPAT, /* invalid UTF-8 string */
REG_BADPAT, /* "closing ) for (?C expected" */ REG_BADPAT, /* support for \P, \p, and \X has not been compiled */
REG_BADPAT, /* "recursive call could loop indefinitely" */ REG_BADPAT, /* malformed \P or \p sequence */
REG_BADPAT, /* "unrecognized character after (?P" */ REG_BADPAT /* unknown property name after \P or \p */
REG_BADPAT, /* "syntax error after (?P" */
REG_BADPAT /* "two named groups have the same name" */
}; };
/* Table of texts corresponding to POSIX error codes */ /* Table of texts corresponding to POSIX error codes */
static const char *pstring[] = { static const char *const pstring[] = {
"", /* Dummy for value 0 */ "", /* Dummy for value 0 */
"internal error", /* REG_ASSERT */ "internal error", /* REG_ASSERT */
"invalid repeat counts in {}", /* BADBR */ "invalid repeat counts in {}", /* BADBR */
@@ -122,29 +127,11 @@ static const char *pstring[] = {
/*************************************************
* Translate PCRE text code to int *
*************************************************/
/* PCRE compile-time errors are given as strings defined as macros. We can just
look them up in a table to turn them into POSIX-style error codes. */
static int
pcre_posix_error_code(const char *s)
{
size_t i;
for (i = 0; i < sizeof(estring)/sizeof(char *); i++)
if (strcmp(s, estring[i]) == 0) return eint[i];
return REG_ASSERT;
}
/************************************************* /*************************************************
* Translate error code to string * * Translate error code to string *
*************************************************/ *************************************************/
size_t EXPORT size_t
regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
{ {
const char *message, *addmessage; const char *message, *addmessage;
@@ -179,7 +166,7 @@ return length + addlength;
* Free store held by a regex * * Free store held by a regex *
*************************************************/ *************************************************/
void EXPORT void
regfree(regex_t *preg) regfree(regex_t *preg)
{ {
(pcre_free)(preg->re_pcre); (pcre_free)(preg->re_pcre);
@@ -202,22 +189,25 @@ Returns: 0 on success
various non-zero codes on failure various non-zero codes on failure
*/ */
int EXPORT int
regcomp(regex_t *preg, const char *pattern, int cflags) regcomp(regex_t *preg, const char *pattern, int cflags)
{ {
const char *errorptr; const char *errorptr;
int erroffset; int erroffset;
int errorcode;
int options = 0; int options = 0;
if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL;
preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL); preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,
&erroffset, NULL);
preg->re_erroffset = erroffset; preg->re_erroffset = erroffset;
if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr); if (preg->re_pcre == NULL) return eint[errorcode];
preg->re_nsub = pcre_info(preg->re_pcre, NULL, NULL); preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
return 0; return 0;
} }
@@ -235,7 +225,7 @@ ints. However, if the number of possible capturing brackets is small, use a
block of store on the stack, to reduce the use of malloc/free. The threshold is block of store on the stack, to reduce the use of malloc/free. The threshold is
in a macro that can be changed at configure time. */ in a macro that can be changed at configure time. */
int EXPORT int
regexec(const regex_t *preg, const char *string, size_t nmatch, regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags) regmatch_t pmatch[], int eflags)
{ {
@@ -264,8 +254,8 @@ if (nmatch > 0)
} }
} }
rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string), 0, options, rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string),
ovector, nmatch * 3); 0, options, ovector, nmatch * 3);
if (rc == 0) rc = nmatch; /* All captured slots were filled in */ if (rc == 0) rc = nmatch; /* All captured slots were filled in */
@@ -293,6 +283,9 @@ else
case PCRE_ERROR_BADMAGIC: return REG_INVARG; case PCRE_ERROR_BADMAGIC: return REG_INVARG;
case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
case PCRE_ERROR_NOMEMORY: return REG_ESPACE; case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;
case PCRE_ERROR_BADUTF8: return REG_INVARG;
case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;
default: return REG_ASSERT; default: return REG_ASSERT;
} }
} }

View File

@@ -2,14 +2,43 @@
* Perl-Compatible Regular Expressions * * Perl-Compatible Regular Expressions *
*************************************************/ *************************************************/
/* Copyright (c) 1997-2003 University of Cambridge */
#ifndef _PCREPOSIX_H #ifndef _PCREPOSIX_H
#define _PCREPOSIX_H #define _PCREPOSIX_H
/* This is the header for the POSIX wrapper interface to the PCRE Perl- /* This is the header for the POSIX wrapper interface to the PCRE Perl-
Compatible Regular Expression library. It defines the things POSIX says should Compatible Regular Expression library. It defines the things POSIX says should
be there. I hope. */ be there. I hope.
Copyright (c) 1997-2005 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------------------------------------------
*/
/* Have to include stdlib.h in order to ensure that size_t is defined. */ /* Have to include stdlib.h in order to ensure that size_t is defined. */
@@ -28,6 +57,10 @@ extern "C" {
#define REG_NOTBOL 0x04 #define REG_NOTBOL 0x04
#define REG_NOTEOL 0x08 #define REG_NOTEOL 0x08
/* Additional options, not defined by POSIX, but somebody wanted them. */
#define REG_DOTALL 0x10
/* These are not used by PCRE, but by defining them we make it easier /* These are not used by PCRE, but by defining them we make it easier
to slot PCRE into existing programs that make POSIX calls. */ to slot PCRE into existing programs that make POSIX calls. */

View File

@@ -1,211 +0,0 @@
#! /usr/bin/perl
# Program for testing regular expressions with perl to check that PCRE handles
# them the same. This is the version that supports /8 for UTF-8 testing. As it
# stands, it requires at least Perl 5.8 for UTF-8 support. For Perl 5.6, it
# can be used as is for non-UTF-8 testing, but you have to uncomment the
# "use utf8" lines in order to to UTF-8 stuff (and you mustn't uncomment them
# for non-UTF-8 use).
# Function for turning a string into a string of printing chars. There are
# currently problems with UTF-8 strings; this fudges round them.
sub pchars {
my($t) = "";
if ($utf8)
{
# use utf8; <=============== For UTF-8 in Perl 5.6
@p = unpack('U*', $_[0]);
foreach $c (@p)
{
if ($c >= 32 && $c < 127) { $t .= chr $c; }
else { $t .= sprintf("\\x{%02x}", $c); }
}
}
else
{
foreach $c (split(//, $_[0]))
{
if (ord $c >= 32 && ord $c < 127) { $t .= $c; }
else { $t .= sprintf("\\x%02x", ord $c); }
}
}
$t;
}
# Read lines from named file or stdin and write to named file or stdout; lines
# consist of a regular expression, in delimiters and optionally followed by
# options, followed by a set of test data, terminated by an empty line.
# Sort out the input and output files
if (@ARGV > 0)
{
open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n";
$infile = "INFILE";
}
else { $infile = "STDIN"; }
if (@ARGV > 1)
{
open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n";
$outfile = "OUTFILE";
}
else { $outfile = "STDOUT"; }
printf($outfile "Perl $] Regular Expressions\n\n");
# Main loop
NEXT_RE:
for (;;)
{
printf " re> " if $infile eq "STDIN";
last if ! ($_ = <$infile>);
printf $outfile "$_" if $infile ne "STDIN";
next if ($_ eq "");
$pattern = $_;
while ($pattern !~ /^\s*(.).*\1/s)
{
printf " > " if $infile eq "STDIN";
last if ! ($_ = <$infile>);
printf $outfile "$_" if $infile ne "STDIN";
$pattern .= $_;
}
chomp($pattern);
$pattern =~ s/\s+$//;
# The private /+ modifier means "print $' afterwards".
$showrest = ($pattern =~ s/\+(?=[a-z]*$)//);
# The private /8 modifier means "operate in UTF-8". Currently, Perl
# has bugs that we try to work around using this flag.
$utf8 = ($pattern =~ s/8(?=[a-z]*$)//);
# Check that the pattern is valid
if ($utf8)
{
# use utf8; <=============== For UTF-8 in Perl 5.6
eval "\$_ =~ ${pattern}";
}
else
{
eval "\$_ =~ ${pattern}";
}
if ($@)
{
printf $outfile "Error: $@";
next NEXT_RE;
}
# If the /g modifier is present, we want to put a loop round the matching;
# otherwise just a single "if".
$cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if";
# If the pattern is actually the null string, Perl uses the most recently
# executed (and successfully compiled) regex is used instead. This is a
# nasty trap for the unwary! The PCRE test suite does contain null strings
# in places - if they are allowed through here all sorts of weird and
# unexpected effects happen. To avoid this, we replace such patterns with
# a non-null pattern that has the same effect.
$pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/);
# Read data lines and test them
for (;;)
{
printf "data> " if $infile eq "STDIN";
last NEXT_RE if ! ($_ = <$infile>);
chomp;
printf $outfile "$_\n" if $infile ne "STDIN";
s/\s+$//;
s/^\s+//;
last if ($_ eq "");
$x = eval "\"$_\""; # To get escapes processed
# Empty array for holding results, then do the matching.
@subs = ();
$pushes = "push \@subs,\$&;" .
"push \@subs,\$1;" .
"push \@subs,\$2;" .
"push \@subs,\$3;" .
"push \@subs,\$4;" .
"push \@subs,\$5;" .
"push \@subs,\$6;" .
"push \@subs,\$7;" .
"push \@subs,\$8;" .
"push \@subs,\$9;" .
"push \@subs,\$10;" .
"push \@subs,\$11;" .
"push \@subs,\$12;" .
"push \@subs,\$13;" .
"push \@subs,\$14;" .
"push \@subs,\$15;" .
"push \@subs,\$16;" .
"push \@subs,\$'; }";
if ($utf8)
{
# use utf8; <=============== For UTF-8 in Perl 5.6
eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
}
else
{
eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
}
if ($@)
{
printf $outfile "Error: $@\n";
next NEXT_RE;
}
elsif (scalar(@subs) == 0)
{
printf $outfile "No match\n";
}
else
{
while (scalar(@subs) != 0)
{
printf $outfile (" 0: %s\n", &pchars($subs[0]));
printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest;
$last_printed = 0;
for ($i = 1; $i <= 16; $i++)
{
if (defined $subs[$i])
{
while ($last_printed++ < $i-1)
{ printf $outfile ("%2d: <unset>\n", $last_printed); }
printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i]));
$last_printed = $i;
}
}
splice(@subs, 0, 18);
}
}
}
}
printf $outfile "\n";
# End

60
libpcre/ucp.h Normal file
View File

@@ -0,0 +1,60 @@
/*************************************************
* libucp - Unicode Property Table handler *
*************************************************/
#ifndef _UCP_H
#define _UCP_H
/* These are the character categories that are returned by ucp_findchar */
enum {
ucp_C, /* Other */
ucp_L, /* Letter */
ucp_M, /* Mark */
ucp_N, /* Number */
ucp_P, /* Punctuation */
ucp_S, /* Symbol */
ucp_Z /* Separator */
};
/* These are the detailed character types that are returned by ucp_findchar */
enum {
ucp_Cc, /* Control */
ucp_Cf, /* Format */
ucp_Cn, /* Unassigned */
ucp_Co, /* Private use */
ucp_Cs, /* Surrogate */
ucp_Ll, /* Lower case letter */
ucp_Lm, /* Modifier letter */
ucp_Lo, /* Other letter */
ucp_Lt, /* Title case letter */
ucp_Lu, /* Upper case letter */
ucp_Mc, /* Spacing mark */
ucp_Me, /* Enclosing mark */
ucp_Mn, /* Non-spacing mark */
ucp_Nd, /* Decimal number */
ucp_Nl, /* Letter number */
ucp_No, /* Other number */
ucp_Pc, /* Connector punctuation */
ucp_Pd, /* Dash punctuation */
ucp_Pe, /* Close punctuation */
ucp_Pf, /* Final punctuation */
ucp_Pi, /* Initial punctuation */
ucp_Po, /* Other punctuation */
ucp_Ps, /* Open punctuation */
ucp_Sc, /* Currency symbol */
ucp_Sk, /* Modifier symbol */
ucp_Sm, /* Mathematical symbol */
ucp_So, /* Other symbol */
ucp_Zl, /* Line separator */
ucp_Zp, /* Paragraph separator */
ucp_Zs /* Space separator */
};
extern int ucp_findchar(const int, int *, int *);
#endif
/* End of ucp.h */