mirror of
https://github.com/3proxy/3proxy.git
synced 2026-04-07 05:40:12 +08:00
Merge branch 'master' into test-ci
This commit is contained in:
commit
7860471601
65
.github/workflows/c-cpp.yml
vendored
65
.github/workflows/c-cpp.yml
vendored
@ -23,28 +23,57 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
# - name: configure
|
# - name: configure
|
||||||
# run: ./configure
|
# run: ./configure
|
||||||
- name: ln Linux
|
- name: Linux libraries
|
||||||
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
||||||
run: ln -s Makefile.Linux Makefile
|
run: sudo apt install libssl-dev libpam-dev libpcre2-dev
|
||||||
- name: ln Mac
|
- name: make Ubuntu
|
||||||
if: ${{ startsWith(matrix.target, 'macos') }}
|
|
||||||
run: ln -s Makefile.FreeBSD Makefile
|
|
||||||
- name: ln Windows
|
|
||||||
if: ${{ startsWith(matrix.target, 'windows') }}
|
|
||||||
run: copy Makefile.win Makefile
|
|
||||||
- name: dirs Windows
|
|
||||||
if: ${{ startsWith(matrix.target, 'windows') }}
|
|
||||||
run: cmd /C 'echo LIBS := -L "c:/program files/openssl/lib/VC/x64/MT" $(LIBS) >>Makefile.win && echo CFLAGS := -I "c:/program files/openssl/include" $(CFLAGS) >>Makefile.win && type Makefile.win && dir "c:/program files/openssl/lib" && dir "c:/program files/openssl/lib/VC/x64/MT" && dir "c:/mingw64/lib/" '
|
|
||||||
- name: SSLPlugin Linux
|
|
||||||
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
||||||
run: "sed -i '/^PLUGIN/s/$/ SSLPlugin/' Makefile && sed -i '/^LIBS/s/$/ -lcrypto -lssl/' Makefile"
|
run: make -f Makefile.Linux
|
||||||
- name: make
|
|
||||||
run: make
|
|
||||||
- name: mkdir
|
- name: mkdir
|
||||||
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
||||||
run: mkdir ~/3proxy
|
run: mkdir ~/3proxy
|
||||||
- name: make install
|
- name: make install
|
||||||
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
||||||
run: make DESTDIR=~/3proxy install
|
run: make -f Makefile.Linux DESTDIR=~/3proxy install
|
||||||
- name: make clean
|
- name: make clean Linux
|
||||||
run: make clean
|
if: ${{ startsWith(matrix.target, 'ubuntu') }}
|
||||||
|
run: make -f Makefile.Linux clean
|
||||||
|
- name: Mac libraries
|
||||||
|
if: ${{ startsWith(matrix.target, 'macos') }}
|
||||||
|
run: brew install pcre2
|
||||||
|
- name: make MacOS
|
||||||
|
if: ${{ startsWith(matrix.target, 'macos') }}
|
||||||
|
run: make -f Makefile.FreeBSD
|
||||||
|
env:
|
||||||
|
LDFLAGS: "-L/usr/local/lib -L/opt/homebrew/lib -L/opt/homebrew/opt/openssl/lib"
|
||||||
|
CFLAGS: "-I/usr/local/include -I/opt/homebrew/include -I/usr/local/opt/openssl/include -I/opt/homebrew/opt/openssl/include"
|
||||||
|
- name: make clean MacOS
|
||||||
|
if: ${{ startsWith(matrix.target, 'macos') }}
|
||||||
|
run: make -f Makefile.FreeBSD clean
|
||||||
|
- name: make Windows
|
||||||
|
if: ${{ startsWith(matrix.target, 'windows') }}
|
||||||
|
run: make -f Makefile.win
|
||||||
|
env:
|
||||||
|
LIBS: '-L "c:/program files/openssl/lib/VC/x64/MT"'
|
||||||
|
CFLAGS: '-I "c:/program files/openssl/include"'
|
||||||
|
- name: make clean Windows
|
||||||
|
if: ${{ startsWith(matrix.target, 'windows') }}
|
||||||
|
run: make -f Makefile.win clean
|
||||||
|
- name: Add msbuild to PATH
|
||||||
|
if: ${{ startsWith(matrix.target, 'windows') }}
|
||||||
|
uses: microsoft/setup-msbuild@v3
|
||||||
|
- name: make Windows MSVC
|
||||||
|
if: ${{ startsWith(matrix.target, 'windows') }}
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
|
||||||
|
D:
|
||||||
|
cd "D:/a/3proxy/3proxy"
|
||||||
|
vcpkg install pcre2:x64-windows
|
||||||
|
mkdir bin64
|
||||||
|
set "LIB=%LIB%;c:/program files/openssl/lib/VC/x64/MT;c:/vcpkg/installed/x64-windows/lib"
|
||||||
|
nmake /F Makefile.msvc64
|
||||||
|
nmake /F Makefile.msvc64 clean
|
||||||
|
env:
|
||||||
|
CFLAGS: '-I "c:/program files/openssl/include" -I "c:/vcpkg/installed/x64-windows/include"'
|
||||||
|
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -259,3 +259,4 @@ pip-log.txt
|
|||||||
|
|
||||||
#Mr Developer
|
#Mr Developer
|
||||||
.mr.developer.cfg
|
.mr.developer.cfg
|
||||||
|
CLAUDE.md
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# 3proxy.full is fully functional 3proxy build based on busibox:glibc
|
# 3proxy.full is fully functional 3proxy build based on busybox:glibc
|
||||||
#
|
#
|
||||||
#to build:
|
#to build:
|
||||||
# docker build -f Dockerfile.full -t 3proxy.full .
|
# docker build -f Dockerfile.full -t 3proxy.full .
|
||||||
@ -13,8 +13,11 @@
|
|||||||
# docker run -p 3129:3129 -v /path/to/local/config/directory:/usr/local/3proxy/conf -name 3proxy.full 3proxy.full
|
# docker run -p 3129:3129 -v /path/to/local/config/directory:/usr/local/3proxy/conf -name 3proxy.full 3proxy.full
|
||||||
#
|
#
|
||||||
# /path/to/local/config/directory in this example must conrain 3proxy.cfg
|
# /path/to/local/config/directory in this example must conrain 3proxy.cfg
|
||||||
# if you need 3proxy to be executed without chroot with root permissions, replace /etc/3proxy/3proxy.cfg by e.g. mounting config
|
# if you need 3proxy to be executed without chroot with root permissions
|
||||||
|
# replace /etc/3proxy/3proxy.cfg by e.g. mounting config
|
||||||
# dir to /etc/3proxy ot by providing config file /etc/3proxy/3proxy.cfg
|
# dir to /etc/3proxy ot by providing config file /etc/3proxy/3proxy.cfg
|
||||||
|
# some plugins like SSLPLugin / pamauth also conflict with chroot and must
|
||||||
|
# be started prior to chroot.
|
||||||
# docker run -p 3129:3129 -v /path/to/local/config/directory:/etc/3proxy -name 3proxy.full 3proxy.full
|
# docker run -p 3129:3129 -v /path/to/local/config/directory:/etc/3proxy -name 3proxy.full 3proxy.full
|
||||||
#
|
#
|
||||||
# use "log" without pathname in config to log to stdout.
|
# use "log" without pathname in config to log to stdout.
|
||||||
@ -24,9 +27,7 @@
|
|||||||
FROM gcc AS buildenv
|
FROM gcc AS buildenv
|
||||||
COPY . 3proxy
|
COPY . 3proxy
|
||||||
RUN cd 3proxy &&\
|
RUN cd 3proxy &&\
|
||||||
echo "">> Makefile.Linux &&\
|
apt update && apt install libssl-dev libpam-dev libpcre2-dev &&\
|
||||||
echo PLUGINS = StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin SSLPlugin>>Makefile.Linux &&\
|
|
||||||
echo LIBS = -l:libcrypto.a -l:libssl.a -ldl >>Makefile.Linux &&\
|
|
||||||
make -f Makefile.Linux &&\
|
make -f Makefile.Linux &&\
|
||||||
strip bin/3proxy &&\
|
strip bin/3proxy &&\
|
||||||
strip bin/StringsPlugin.ld.so &&\
|
strip bin/StringsPlugin.ld.so &&\
|
||||||
|
|||||||
@ -7,16 +7,16 @@
|
|||||||
BUILDDIR = ../bin/
|
BUILDDIR = ../bin/
|
||||||
CC ?= cc
|
CC ?= cc
|
||||||
|
|
||||||
CFLAGS += -c -fno-strict-aliasing -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL
|
CFLAGS := -c -fno-strict-aliasing -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL $(CFLAGS)
|
||||||
COUT = -o
|
COUT = -o
|
||||||
LN ?= ${CC}
|
LN ?= ${CC}
|
||||||
LDFLAGS += -pthread -fno-strict-aliasing
|
LDFLAGS += -pthread -fno-strict-aliasing
|
||||||
# -lpthreads may be reuiured on some platforms instead of -pthreads
|
# -lpthreads may be reuiured on some platforms instead of -pthreads
|
||||||
# -ldl or -lld may be required for some platforms
|
# -ldl or -lld may be required for some platforms
|
||||||
DCFLAGS = -fPIC
|
DCFLAGS ?= -fPIC
|
||||||
DLFLAGS = -shared
|
DLFLAGS ?= -shared
|
||||||
|
LIBS ?=
|
||||||
DLSUFFICS = .so
|
DLSUFFICS = .so
|
||||||
LIBS =
|
|
||||||
LIBSPREFIX = -l
|
LIBSPREFIX = -l
|
||||||
LIBSSUFFIX =
|
LIBSSUFFIX =
|
||||||
LNOUT = -o
|
LNOUT = -o
|
||||||
@ -29,7 +29,19 @@ AFTERCLEAN = (find . -type f -name "*.o" -delete && find src/ -type f -name "Mak
|
|||||||
TYPECOMMAND = cat
|
TYPECOMMAND = cat
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.FreeBSD
|
MAKEFILE = Makefile.FreeBSD
|
||||||
PLUGINS = StringsPlugin TrafficPlugin PCREPlugin PamAuth TransparentPlugin
|
PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin
|
||||||
|
OPENSSL_CHECK = $(shell echo "\#include <openssl/ssl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l crypto -l ssl -o testssl - 2>/dev/null && rm testssl && echo true||echo false)
|
||||||
|
ifeq ($(OPENSSL_CHECK), true)
|
||||||
|
PLUGINS += SSLPlugin
|
||||||
|
endif
|
||||||
|
PAM_CHECK = $(shell echo "\#include <security/pam_appl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pam -o testpam - 2>/dev/null && rm testpam && echo true||echo false)
|
||||||
|
ifeq ($(PAM_CHECK), true)
|
||||||
|
PLUGINS += PamAuth
|
||||||
|
endif
|
||||||
|
PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include <pcre2.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false)
|
||||||
|
ifeq ($(PCRE_CHECK), true)
|
||||||
|
PLUGINS += PCREPlugin
|
||||||
|
endif
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
|
|||||||
@ -8,14 +8,14 @@
|
|||||||
# library support. Add -DSAFESQL for poorely written ODBC library / drivers.
|
# library support. Add -DSAFESQL for poorely written ODBC library / drivers.
|
||||||
|
|
||||||
BUILDDIR = ../bin/
|
BUILDDIR = ../bin/
|
||||||
CC = gcc
|
CC ?= gcc
|
||||||
|
|
||||||
CFLAGS = -g -fPIC -O2 -fno-strict-aliasing -c -pthread -DWITHSPLICE -D_GNU_SOURCE -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER
|
CFLAGS := -g -fPIC -O2 -fno-strict-aliasing -c -pthread -DWITHSPLICE -D_GNU_SOURCE -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER $(CFLAGS)
|
||||||
COUT = -o
|
COUT = -o
|
||||||
LN = $(CC)
|
LN ?= ${CC}
|
||||||
DCFLAGS =
|
DCFLAGS ?=
|
||||||
LDFLAGS = -fPIC -O2 -fno-strict-aliasing -pthread
|
LDFLAGS ?= -fPIC -O2 -fno-strict-aliasing -pthread
|
||||||
DLFLAGS = -shared
|
DLFLAGS ?= -shared
|
||||||
DLSUFFICS = .ld.so
|
DLSUFFICS = .ld.so
|
||||||
# -lpthreads may be reuqired on some platforms instead of -pthreads
|
# -lpthreads may be reuqired on some platforms instead of -pthreads
|
||||||
LIBSPREFIX = -l
|
LIBSPREFIX = -l
|
||||||
@ -33,10 +33,21 @@ MAKEFILE = Makefile.Linux
|
|||||||
# PamAuth requires libpam, you may require pam-devel package to be installed
|
# PamAuth requires libpam, you may require pam-devel package to be installed
|
||||||
# SSLPlugin requires -lcrypto -lssl
|
# SSLPlugin requires -lcrypto -lssl
|
||||||
#LIBS = -lcrypto -lssl -ldl
|
#LIBS = -lcrypto -lssl -ldl
|
||||||
LIBS = -ldl
|
LIBS ?= -ldl
|
||||||
#PLUGINS = SSLPlugin StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin PamAuth
|
#PLUGINS = SSLPlugin StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin PamAuth
|
||||||
PLUGINS = StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin
|
PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin
|
||||||
|
OPENSSL_CHECK = $(shell echo "\#include <openssl/ssl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l crypto -l ssl -o testssl - 2>/dev/null && rm testssl && echo true||echo false)
|
||||||
|
ifeq ($(OPENSSL_CHECK), true)
|
||||||
|
PLUGINS += SSLPlugin
|
||||||
|
endif
|
||||||
|
PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include <pcre2.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false)
|
||||||
|
ifeq ($(PCRE_CHECK), true)
|
||||||
|
PLUGINS += PCREPlugin
|
||||||
|
endif
|
||||||
|
PAM_CHECK = $(shell echo "\#include <security/pam_appl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pam -o testpam - 2>/dev/null && rm testpam && echo true||echo false)
|
||||||
|
ifeq ($(PAM_CHECK), true)
|
||||||
|
PLUGINS += PamAuth
|
||||||
|
endif
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
allplugins:
|
allplugins:
|
||||||
|
|||||||
@ -29,7 +29,7 @@ AFTERCLEAN = (find . -type f -name "*.o" -delete && find src/ -type f -name "Mak
|
|||||||
TYPECOMMAND = cat
|
TYPECOMMAND = cat
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.Solaris
|
MAKEFILE = Makefile.Solaris
|
||||||
PLUGINS = StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin
|
PLUGINS = StringsPlugin TrafficPlugin
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ AFTERCLEAN = (find . -type f -name "*.o" -delete && find src/ -type f -name "Mak
|
|||||||
TYPECOMMAND = cat
|
TYPECOMMAND = cat
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.Solaris-gcc
|
MAKEFILE = Makefile.Solaris-gcc
|
||||||
PLUGINS = StringsPlugin TrafficPlugin PCREPlugin
|
PLUGINS = StringsPlugin TrafficPlugin
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
|
|||||||
@ -1,33 +0,0 @@
|
|||||||
#
|
|
||||||
# 3 proxy Makefile for Intel C compiler for Windows (for both make and nmake)
|
|
||||||
#
|
|
||||||
# You can try to remove -DWITH_STD_MALLOC to CFLAGS to use optimized malloc
|
|
||||||
# libraries
|
|
||||||
#
|
|
||||||
# Add /DSAFESQL to CFLAGS if you are using poorely written/tested ODBC driver
|
|
||||||
|
|
||||||
|
|
||||||
BUILDDIR = ../bin/
|
|
||||||
CC = icl
|
|
||||||
CFLAGS = /nologo /MD /W3 /G6 /GX /O2 /D "WITH_STD_MALLOC" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /Fp"proxy.pch" /YX /FD /c
|
|
||||||
COUT = /Fo
|
|
||||||
LN = xilink
|
|
||||||
LDFLAGS = /nologo /subsystem:console /incremental:no /machine:I386
|
|
||||||
LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib
|
|
||||||
DLFLAGS = /DLL
|
|
||||||
DLSUFFICS = .dll
|
|
||||||
LNOUT = /out:
|
|
||||||
EXESUFFICS = .exe
|
|
||||||
OBJSUFFICS = .obj
|
|
||||||
DEFINEOPTION = /D
|
|
||||||
COMPFILES = *.pch *.idb
|
|
||||||
REMOVECOMMAND = del 2>NUL
|
|
||||||
TYPECOMMAND = type
|
|
||||||
COMPATLIBS =
|
|
||||||
MAKEFILE = Makefile.intl
|
|
||||||
PLUGINS = WindowsAuthentication TrafficPlugin PCREPlugin
|
|
||||||
|
|
||||||
include Makefile.inc
|
|
||||||
|
|
||||||
allplugins:
|
|
||||||
for /D %%i in ($(PLUGINS)) do (copy Makefile Makefile.var plugins\%%i && cd plugins\%%i && nmake && del *.obj *.idb &&cd ..\..)
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
#
|
|
||||||
# 3 proxy Makefile for GCC/windows
|
|
||||||
#
|
|
||||||
# You can try to remove -DWITH_STD_MALLOC to CFLAGS to use optimized malloc
|
|
||||||
# libraries
|
|
||||||
#
|
|
||||||
# remove -DNOODBC from CFLAGS and add -lodbc to LDFLAGS to compile with ODBC
|
|
||||||
# library support
|
|
||||||
|
|
||||||
|
|
||||||
BUILDDIR = ../bin/
|
|
||||||
CC = clang
|
|
||||||
CFLAGS = -O2 -fno-strict-aliasing -c -pthread -DWITH_STD_MALLOC -DWITH_WSAPOLL
|
|
||||||
COUT = -o
|
|
||||||
LN = $(CC)
|
|
||||||
LDFLAGS = -O2 -fno-strict-aliasing -s
|
|
||||||
DLFLAGS = -shared
|
|
||||||
DLSUFFICS = .dll
|
|
||||||
LIBS = -lws2_32 -lodbc32 -ladvapi32 -luser32 -lcrypto -lssl
|
|
||||||
LIBSPREFIX = -l
|
|
||||||
LIBSSUFFIX =
|
|
||||||
LNOUT = -o
|
|
||||||
EXESUFFICS = .exe
|
|
||||||
OBJSUFFICS = .o
|
|
||||||
DEFINEOPTION = -D
|
|
||||||
COMPFILES = *.tmp
|
|
||||||
REMOVECOMMAND = rm -f
|
|
||||||
AFTERCLEAN = find src/ -type f -name "*.o" -delete && find src/ -type f -name "Makefile.var" -delete && find bin/ -type f -executable -delete
|
|
||||||
TYPECOMMAND = cat
|
|
||||||
COMPATLIBS =
|
|
||||||
MAKEFILE = Makefile.llvm
|
|
||||||
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin PCREPlugin SSLPlugin
|
|
||||||
VERFILE := 3proxy.res $(VERFILE)
|
|
||||||
VERSION := $(VERSION)
|
|
||||||
VERSIONDEP := 3proxy.res $(VERSIONDEP)
|
|
||||||
BUILDDATE := $(BUILDDATE)
|
|
||||||
AFTERCLEAN = (find . -type f -name "*.o" -delete && find . -type f -name "*.res" -delete && find src/ -type f -name "Makefile.var" -delete && find bin/ -type f -executable -delete) || true
|
|
||||||
|
|
||||||
include Makefile.inc
|
|
||||||
|
|
||||||
3proxy.res:
|
|
||||||
llvm-rc 3proxy.rc
|
|
||||||
|
|
||||||
allplugins:
|
|
||||||
@list='$(PLUGINS)'; for p in $$list; do cp Makefile Makefile.var plugins/$$p; cd plugins/$$p ; make ; cd ../.. ; done
|
|
||||||
|
|
||||||
@ -14,8 +14,7 @@ LN = link
|
|||||||
LDFLAGS = /nologo /subsystem:console /incremental:no /machine:I386
|
LDFLAGS = /nologo /subsystem:console /incremental:no /machine:I386
|
||||||
DLFLAGS = /DLL
|
DLFLAGS = /DLL
|
||||||
DLSUFFICS = .dll
|
DLSUFFICS = .dll
|
||||||
LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib Crypt32.lib libcrypto.lib libssl.lib
|
LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib Crypt32.lib
|
||||||
LIBSOLD = libeay32MT.lib ssleay32MT.lib
|
|
||||||
LIBSPREFIX =
|
LIBSPREFIX =
|
||||||
LIBSSUFFIX = .lib
|
LIBSSUFFIX = .lib
|
||||||
LIBEXT = .lib
|
LIBEXT = .lib
|
||||||
@ -28,7 +27,7 @@ REMOVECOMMAND = del
|
|||||||
TYPECOMMAND = type
|
TYPECOMMAND = type
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.msvc
|
MAKEFILE = Makefile.msvc
|
||||||
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin PCREPlugin FilePlugin SSLPlugin
|
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin FilePlugin SSLPlugin PCREPlugin
|
||||||
VERFILE = 3proxy.res $(VERFILE)
|
VERFILE = 3proxy.res $(VERFILE)
|
||||||
VERSION = $(VERSION)
|
VERSION = $(VERSION)
|
||||||
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
||||||
|
|||||||
@ -10,14 +10,13 @@ MAKEFILE = Makefile.msvc64
|
|||||||
|
|
||||||
BUILDDIR = ../bin64/
|
BUILDDIR = ../bin64/
|
||||||
CC = cl
|
CC = cl
|
||||||
CFLAGS = /nologo /MT /W3 /Ox /EHs- /GS /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_SSL" /D "WITH_WSAPOLL" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRINTF_INT64_MODIFIER=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE)
|
CFLAGS = /nologo /MT /W3 /Ox /EHs- /GS /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_SSL" /D "WITH_WSAPOLL" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRINTF_INT64_MODIFIER=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE) $(CFLAGS)
|
||||||
COUT = /Fo
|
COUT = /Fo
|
||||||
LN = link
|
LN = link
|
||||||
LDFLAGS = /nologo /subsystem:console /incremental:no /machine:x64
|
LDFLAGS = /nologo /subsystem:console /incremental:no /machine:x64
|
||||||
DLFLAGS = /DLL
|
DLFLAGS = /DLL
|
||||||
DLSUFFICS = .dll
|
DLSUFFICS = .dll
|
||||||
LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib Crypt32.lib libcrypto.lib libssl.lib
|
LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib Crypt32.lib $(LIBS)
|
||||||
LIBSOLD = libeay32.lib ssleay32.lib
|
|
||||||
LIBSPREFIX =
|
LIBSPREFIX =
|
||||||
LIBSSUFFIX = .lib
|
LIBSSUFFIX = .lib
|
||||||
LIBEXT = .lib
|
LIBEXT = .lib
|
||||||
@ -31,7 +30,7 @@ TYPECOMMAND = type
|
|||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
VERFILE = 3proxy.res $(VERFILE)
|
VERFILE = 3proxy.res $(VERFILE)
|
||||||
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
||||||
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin PCREPlugin FilePlugin SSLPlugin
|
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin FilePlugin SSLPlugin PCREPlugin
|
||||||
AFTERCLEAN = del src\*.res
|
AFTERCLEAN = del src\*.res
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|||||||
@ -14,7 +14,7 @@ LN = link
|
|||||||
LDFLAGS = /nologo /subsystem:console /incremental:no /machine:arm64
|
LDFLAGS = /nologo /subsystem:console /incremental:no /machine:arm64
|
||||||
DLFLAGS = /DLL
|
DLFLAGS = /DLL
|
||||||
DLSUFFICS = .dll
|
DLSUFFICS = .dll
|
||||||
LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib libcrypto.lib libssl.lib
|
LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib
|
||||||
LIBSOLD =
|
LIBSOLD =
|
||||||
LIBSPREFIX =
|
LIBSPREFIX =
|
||||||
LIBSSUFFIX = .lib
|
LIBSSUFFIX = .lib
|
||||||
@ -28,7 +28,7 @@ REMOVECOMMAND = del 2>NUL >NUL
|
|||||||
TYPECOMMAND = type
|
TYPECOMMAND = type
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.msvcARM64
|
MAKEFILE = Makefile.msvcARM64
|
||||||
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin PCREPlugin FilePlugin SSLPlugin
|
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin FilePlugin SSLPlugin PCREPlugin
|
||||||
VERFILE = 3proxy.res $(VERFILE)
|
VERFILE = 3proxy.res $(VERFILE)
|
||||||
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
||||||
AFTERCLEAN = del src\*.res
|
AFTERCLEAN = del src\*.res
|
||||||
|
|||||||
@ -25,7 +25,7 @@ REMOVECOMMAND = del 2>NUL >NUL
|
|||||||
TYPECOMMAND = type
|
TYPECOMMAND = type
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.msvc
|
MAKEFILE = Makefile.msvc
|
||||||
PLUGINS = WindowsAuthentication TrafficPlugin StringsPlugin PCREPlugin
|
PLUGINS = WindowsAuthentication TrafficPlugin StringsPlugin
|
||||||
|
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|||||||
@ -10,11 +10,11 @@
|
|||||||
BUILDDIR = ../bin/
|
BUILDDIR = ../bin/
|
||||||
CC = mips-openwrt-linux-gcc
|
CC = mips-openwrt-linux-gcc
|
||||||
|
|
||||||
CFLAGS = -g -O2 -fno-strict-aliasing -c -pthread -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER
|
CFLAGS ?= -g -O2 -fno-strict-aliasing -c -pthread -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER
|
||||||
COUT = -o
|
COUT = -o
|
||||||
LN = $(CC)
|
LN = $(CC)
|
||||||
DCFLAGS = -fPIC
|
DCFLAGS = -fPIC
|
||||||
LDFLAGS = -O2 -fno-strict-aliasing -pthread -s
|
LDFLAGS ?= -O2 -fno-strict-aliasing -pthread -s
|
||||||
DLFLAGS = -shared
|
DLFLAGS = -shared
|
||||||
DLSUFFICS = .ld.so
|
DLSUFFICS = .ld.so
|
||||||
# -lpthreads may be reuqired on some platforms instead of -pthreads
|
# -lpthreads may be reuqired on some platforms instead of -pthreads
|
||||||
@ -31,11 +31,21 @@ TYPECOMMAND = cat
|
|||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.openwrt-mips
|
MAKEFILE = Makefile.openwrt-mips
|
||||||
# PamAuth requires libpam, you may require pam-devel package to be installed
|
# PamAuth requires libpam, you may require pam-devel package to be installed
|
||||||
# SSLPlugin requires -lcrypto -lssl
|
LIBS ?= -ldl
|
||||||
#LIBS = -lcrypto -lssl -ldl
|
|
||||||
LIBS = -ldl
|
|
||||||
#PLUGINS = SSLPlugin StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin PamAuth
|
#PLUGINS = SSLPlugin StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin PamAuth
|
||||||
PLUGINS = StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin
|
PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin
|
||||||
|
OPENSSL_CHECK = $(shell echo "\#include <openssl/ssl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l crypto -l ssl -o testssl - 2>/dev/null && rm testssl && echo true||echo false)
|
||||||
|
ifeq ($(OPENSSL_CHECK), true)
|
||||||
|
PLUGINS += SSLPlugin
|
||||||
|
endif
|
||||||
|
PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include <pcre2.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false)
|
||||||
|
ifeq ($(PCRE_CHECK), true)
|
||||||
|
PLUGINS += PCREPlugin
|
||||||
|
endif
|
||||||
|
PAM_CHECK = $(shell echo "\#include <security/pam_appl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pam -o testpam - 2>/dev/null && rm testpam && echo true||echo false)
|
||||||
|
ifeq ($(PAM_CHECK), true)
|
||||||
|
PLUGINS += PamAuth
|
||||||
|
endif
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
|
|||||||
@ -8,21 +8,21 @@
|
|||||||
# library support. Add -DSAFESQL for poorely written ODBC library / drivers.
|
# library support. Add -DSAFESQL for poorely written ODBC library / drivers.
|
||||||
|
|
||||||
BUILDDIR = ../bin/
|
BUILDDIR = ../bin/
|
||||||
CC = gcc
|
CC ?= gcc
|
||||||
|
|
||||||
# you may need -L/usr/pkg/lib for older NetBSD versions
|
# you may need -L/usr/pkg/lib for older NetBSD versions
|
||||||
CFLAGS = -g -O2 -fno-strict-aliasing -c -pthread -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL
|
CFLAGS := -g -O2 -fno-strict-aliasing -c -pthread -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL $(CFLAGS)
|
||||||
COUT = -o
|
COUT = -o
|
||||||
LN = $(CC)
|
LN ?= $(CC)
|
||||||
LDFLAGS = -O2 -fno-strict-aliasing -pthread
|
LDFLAGS ?= -O2 -fno-strict-aliasing -pthread
|
||||||
# -lpthreads may be reuqired on some platforms instead of -pthreads
|
# -lpthreads may be reuqired on some platforms instead of -pthreads
|
||||||
# -ldl or -lld may be required for some platforms
|
# -ldl or -lld may be required for some platforms
|
||||||
DCFLAGS = -fPIC
|
DCFLAGS ?= -fPIC
|
||||||
DLFLAGS = -shared
|
DLFLAGS ?= -shared
|
||||||
DLSUFFICS = .ld.so
|
DLSUFFICS ?= .ld.so
|
||||||
LIBS =
|
LIBS ?=
|
||||||
LIBSPREFIX = -l
|
LIBSPREFIX ?= -l
|
||||||
LIBSSUFFIX =
|
LIBSSUFFIX ?=
|
||||||
LNOUT = -o
|
LNOUT = -o
|
||||||
EXESUFFICS =
|
EXESUFFICS =
|
||||||
OBJSUFFICS = .o
|
OBJSUFFICS = .o
|
||||||
@ -33,8 +33,19 @@ AFTERCLEAN = (find . -type f -name "*.o" -delete && find src/ -type f -name "Mak
|
|||||||
TYPECOMMAND = cat
|
TYPECOMMAND = cat
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.unix
|
MAKEFILE = Makefile.unix
|
||||||
PLUGINS = StringsPlugin TrafficPlugin PCREPlugin PamAuth TransparentPlugin
|
PLUGINS ?= StringsPlugin TrafficPlugin TransparentPlugin
|
||||||
|
OPENSSL_CHECK = $(shell echo "\#include <openssl/ssl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l crypto -l ssl -o testssl - 2>/dev/null && rm testssl && echo true||echo false)
|
||||||
|
ifeq ($(OPENSSL_CHECK), true)
|
||||||
|
PLUGINS += SSLPlugin
|
||||||
|
endif
|
||||||
|
PAM_CHECK = $(shell echo "\#include <security/pam_appl.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pam -o testpam - 2>/dev/null && rm testpam && echo true||echo false)
|
||||||
|
ifeq ($(PAM_CHECK), true)
|
||||||
|
PLUGINS += PamAuth
|
||||||
|
endif
|
||||||
|
PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include <pcre2.h>\\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false)
|
||||||
|
ifeq ($(PCRE_CHECK), true)
|
||||||
|
PLUGINS += PCREPlugin
|
||||||
|
endif
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
|
|||||||
@ -28,7 +28,7 @@ REMOVECOMMAND = del 2>NUL >NUL
|
|||||||
TYPECOMMAND = type
|
TYPECOMMAND = type
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.watcom
|
MAKEFILE = Makefile.watcom
|
||||||
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin PCREPlugin
|
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin
|
||||||
VERFILE = $(VERFILE)
|
VERFILE = $(VERFILE)
|
||||||
VERSION = $(VERSION)
|
VERSION = $(VERSION)
|
||||||
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
VERSIONDEP = 3proxy.res $(VERSIONDEP)
|
||||||
|
|||||||
29
Makefile.win
29
Makefile.win
@ -9,14 +9,14 @@
|
|||||||
|
|
||||||
|
|
||||||
BUILDDIR = ../bin/
|
BUILDDIR = ../bin/
|
||||||
CC = gcc
|
CC ?= gcc
|
||||||
CFLAGS = -O2 -s -c -mthreads -DWITH_STD_MALLOC -DWITH_WSAPOLL
|
CFLAGS := -O2 -s -c -mthreads -DWITH_STD_MALLOC -DWITH_WSAPOLL $(CFLAGS)
|
||||||
COUT = -o
|
COUT = -o
|
||||||
LN = gcc
|
LN ?= $(CC)
|
||||||
LDFLAGS = -O2 -s -mthreads
|
LDFLAGS ?= -O2 -s -mthreads
|
||||||
DLFLAGS = -shared
|
DLFLAGS ?= -shared
|
||||||
DLSUFFICS = .dll
|
DLSUFFICS = .dll
|
||||||
LIBS = -lws2_32 -lodbc32 -ladvapi32 -luser32 -lcrypto -lssl
|
LIBS := -lws2_32 -lodbc32 -ladvapi32 -luser32 $(LIBS)
|
||||||
LIBSPREFIX = -l
|
LIBSPREFIX = -l
|
||||||
LIBSSUFFIX =
|
LIBSSUFFIX =
|
||||||
LNOUT = -o
|
LNOUT = -o
|
||||||
@ -28,13 +28,28 @@ REMOVECOMMAND = rm -f
|
|||||||
TYPECOMMAND = cat
|
TYPECOMMAND = cat
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.win
|
MAKEFILE = Makefile.win
|
||||||
PLUGINS = utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin PCREPlugin SSLPLugin
|
PLUGINS := utf8tocp1251 WindowsAuthentication TrafficPlugin StringsPlugin
|
||||||
VERFILE := 3proxyres.o $(VERFILE)
|
VERFILE := 3proxyres.o $(VERFILE)
|
||||||
VERSION := $(VERSION)
|
VERSION := $(VERSION)
|
||||||
VERSIONDEP := 3proxyres.o $(VERSIONDEP)
|
VERSIONDEP := 3proxyres.o $(VERSIONDEP)
|
||||||
BUILDDATE := $(BUILDDATE)
|
BUILDDATE := $(BUILDDATE)
|
||||||
AFTERCLEAN = (find . -type f -name "*.o" -delete && find . -type f -name "*.res" -delete && find src/ -type f -name "Makefile.var" -delete && find bin/ -type f -executable -delete) || true
|
AFTERCLEAN = (find . -type f -name "*.o" -delete && find . -type f -name "*.res" -delete && find src/ -type f -name "Makefile.var" -delete && find bin/ -type f -executable -delete) || true
|
||||||
|
|
||||||
|
ifndef OPENSSL_CHECK
|
||||||
|
OPENSSL_CHECK = $(shell echo "\#include <openssl/ssl.h>\\n int main(){return 0;}" | tr -d '\\\\' | cc -x c $(CFLAGS) $(LDFLAGS) -l crypto -l ssl -o testssl - 2>/dev/null && rm testssl && echo true||echo false)
|
||||||
|
ifeq ($(OPENSSL_CHECK), true)
|
||||||
|
PLUGINS += SSLPlugin
|
||||||
|
endif
|
||||||
|
PAM_CHECK = $(shell echo "\#include <security/pam_appl.h>\\n int main(){return 0;}" | tr -d '\\\\' | cc -x c $(CFLAGS) $(LDFLAGS) -l pam -o testpam - 2>/dev/null && rm testpam && echo true||echo false)
|
||||||
|
ifeq ($(PAM_CHECK), true)
|
||||||
|
PLUGINS += PamAuth
|
||||||
|
endif
|
||||||
|
PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n#include <pcre2.h>\\n int main(){return 0;}" | tr -d '\\\\' | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false)
|
||||||
|
ifeq ($(PCRE_CHECK), true)
|
||||||
|
PLUGINS += PCREPlugin
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
3proxyres.o:
|
3proxyres.o:
|
||||||
|
|||||||
@ -26,7 +26,7 @@ REMOVECOMMAND = rm -f
|
|||||||
TYPECOMMAND = more
|
TYPECOMMAND = more
|
||||||
COMPATLIBS =
|
COMPATLIBS =
|
||||||
MAKEFILE = Makefile.winCE
|
MAKEFILE = Makefile.winCE
|
||||||
PLUGINS = TrafficPlugin StringsPlugin PCREPlugin
|
PLUGINS = TrafficPlugin StringsPlugin
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
|
|||||||
2
README
2
README
@ -141,7 +141,7 @@ make
|
|||||||
+ All access control entries now support weekday and time limitations
|
+ All access control entries now support weekday and time limitations
|
||||||
+ Hostnames and * templates are supported instead of IP address
|
+ Hostnames and * templates are supported instead of IP address
|
||||||
5. Extensions
|
5. Extensions
|
||||||
+ Regular expression filtering (with PCRE) via PCREPlugin
|
+ Regular expression filtering (with PCRE2) via PCREPlugin
|
||||||
+ Authentication with Windows username/password (cleartext only)
|
+ Authentication with Windows username/password (cleartext only)
|
||||||
+ SSL/TLS decryptions with certificate spoofing
|
+ SSL/TLS decryptions with certificate spoofing
|
||||||
+ Transparent redirection support for Linux and *BSD
|
+ Transparent redirection support for Linux and *BSD
|
||||||
|
|||||||
@ -13,9 +13,6 @@
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#ifdef WITH_SSL
|
|
||||||
#include <openssl/applink.c>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
11
src/auth.c
11
src/auth.c
@ -608,7 +608,7 @@ unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nb
|
|||||||
param->bandlims[i]->nexttime - now : 0;
|
param->bandlims[i]->nexttime - now : 0;
|
||||||
sleeptime = (nsleeptime > sleeptime)? nsleeptime : sleeptime;
|
sleeptime = (nsleeptime > sleeptime)? nsleeptime : sleeptime;
|
||||||
param->bandlims[i]->basetime = sec;
|
param->bandlims[i]->basetime = sec;
|
||||||
param->bandlims[i]->nexttime = msec + nsleeptime + ((nbytesin > 512)? ((nbytesin+32)/64)*(((64*8*1000000)/param->bandlims[i]->rate)) : ((nbytesin+1) * (8*1000000))/param->bandlims[i]->rate);
|
param->bandlims[i]->nexttime = msec + nsleeptime + (((uint64_t)nbytesin * 8 * 1000000) / param->bandlims[i]->rate);
|
||||||
}
|
}
|
||||||
for(i=0; nbytesout && i<MAXBANDLIMS && param->bandlimsout[i]; i++){
|
for(i=0; nbytesout && i<MAXBANDLIMS && param->bandlimsout[i]; i++){
|
||||||
if( !param->bandlimsout[i]->basetime ||
|
if( !param->bandlimsout[i]->basetime ||
|
||||||
@ -895,9 +895,16 @@ int doauth(struct clientparam * param){
|
|||||||
if(ret > 9) return ret;
|
if(ret > 9) return ret;
|
||||||
}
|
}
|
||||||
if(!res){
|
if(!res){
|
||||||
return alwaysauth(param);
|
ret = alwaysauth(param);
|
||||||
|
if (param->afterauthfilters){
|
||||||
|
FILTER_ACTION action;
|
||||||
|
|
||||||
|
action = handleafterauthflt(param);
|
||||||
|
if(action != PASS) return 19;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
118
src/common.c
118
src/common.c
@ -92,45 +92,85 @@ char *rotations[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct extparam conf = {
|
int timeouts[12] = {
|
||||||
{0, 0},
|
1, /* SINGLEBYTE_S */
|
||||||
{1, 5, 30, 60, 180, 1800, 15, 60, 15, 5, 0, 0},
|
5, /* SINGLEBYTE_L */
|
||||||
NULL,
|
30, /* STRING_S */
|
||||||
NULL,
|
60, /* STRING_L */
|
||||||
NULL, NULL,
|
180, /* CONNECTION_S */
|
||||||
NULL,
|
1800, /* CONNECTION_L */
|
||||||
NULL,
|
15, /* DNS_TO */
|
||||||
NULL,
|
60, /* CHAIN_TO */
|
||||||
|
15, /* CONNECT_TO */
|
||||||
|
5, /* CONNBACK_TO */
|
||||||
0,
|
0,
|
||||||
-1, 0, 0, 0, 0,
|
0
|
||||||
0, 500, 0, 0, 0, 0, 0, 0, 2,
|
};
|
||||||
0, 0, 0,
|
|
||||||
6, 600,
|
struct extparam conf = {
|
||||||
1048576,
|
.threadinit = {0, 0},
|
||||||
NULL, NULL,
|
.timeouts = timeouts,
|
||||||
NONE, NONE,
|
.acl = NULL,
|
||||||
NULL,
|
.conffile = NULL,
|
||||||
|
.bandlimiter = NULL,
|
||||||
|
.bandlimiterout = NULL,
|
||||||
|
.connlimiter = NULL,
|
||||||
|
.trafcounter = NULL,
|
||||||
|
.services = NULL,
|
||||||
|
.stacksize = 0,
|
||||||
|
.counterd = -1,
|
||||||
|
.haveerror = 0,
|
||||||
|
.rotate = 0,
|
||||||
|
.paused = 0,
|
||||||
|
.archiverc = 0,
|
||||||
|
.demon = 0,
|
||||||
|
.maxchild = 500,
|
||||||
|
.backlog = 0,
|
||||||
|
.needreload = 0,
|
||||||
|
.timetoexit = 0,
|
||||||
|
.version = 0,
|
||||||
|
.noforce = 0,
|
||||||
|
.bandlimver = 0,
|
||||||
|
.parentretries = 2,
|
||||||
|
.authcachetype = 6,
|
||||||
|
.authcachetime = 600,
|
||||||
|
.filtermaxsize = 1048576,
|
||||||
|
.gracetraf = 0,
|
||||||
|
.gracenum = 0,
|
||||||
|
.gracedelay = 0,
|
||||||
|
.maxseg = 0,
|
||||||
|
.logname = NULL,
|
||||||
|
.archiver = NULL,
|
||||||
|
.logtype = NONE,
|
||||||
|
.countertype = NONE,
|
||||||
|
.counterfile = NULL,
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
{AF_INET},{AF_INET6},{AF_INET},
|
.intsa = {AF_INET},
|
||||||
|
.extsa6 = {AF_INET6},
|
||||||
|
.extsa = {AF_INET},
|
||||||
#else
|
#else
|
||||||
{AF_INET},{AF_INET},
|
.intsa = {AF_INET},
|
||||||
|
.extsa = {AF_INET},
|
||||||
#endif
|
#endif
|
||||||
NULL,
|
.pwl = NULL,
|
||||||
NULL,
|
.authenticate = NULL,
|
||||||
doconnect,
|
.authfunc = doconnect,
|
||||||
lognone,
|
.logfunc = lognone,
|
||||||
NULL,
|
.bandlimfunc = NULL,
|
||||||
NULL,
|
.trafcountfunc = NULL,
|
||||||
NULL, NULL,
|
.logtarget = NULL,
|
||||||
NULL,
|
.logformat = NULL,
|
||||||
NULL,
|
.fmon = NULL,
|
||||||
NULL,
|
.filters = NULL,
|
||||||
NULL,
|
.authfuncs = NULL,
|
||||||
NULL,
|
.stdlog = NULL,
|
||||||
NULL,
|
.demanddialprog = NULL,
|
||||||
(time_t)0, (time_t)0,
|
.stringtable = NULL,
|
||||||
0,0,
|
.logtime = (time_t)0,
|
||||||
'@',
|
.time = (time_t)0,
|
||||||
|
.logdumpsrv = 0,
|
||||||
|
.logdumpcli = 0,
|
||||||
|
.delimchar = '@',
|
||||||
};
|
};
|
||||||
|
|
||||||
int numservers=0;
|
int numservers=0;
|
||||||
@ -247,6 +287,7 @@ int
|
|||||||
return shutdown(s, how);
|
return shutdown(s, how);
|
||||||
}
|
}
|
||||||
int WINAPI def_closesocket(void* state, SOCKET s){
|
int WINAPI def_closesocket(void* state, SOCKET s){
|
||||||
|
usleep(SLEEPTIME);
|
||||||
return closesocket(s);
|
return closesocket(s);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -574,6 +615,13 @@ int doconnect(struct clientparam * param){
|
|||||||
size = sizeof(param->sinsl);
|
size = sizeof(param->sinsl);
|
||||||
if(param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &size)==-1) {return (15);}
|
if(param->srv->so._getsockname(param->sostate, param->remsock, (struct sockaddr *)¶m->sinsl, &size)==-1) {return (15);}
|
||||||
}
|
}
|
||||||
|
if (param->nconnectfilters){
|
||||||
|
FILTER_ACTION action;
|
||||||
|
|
||||||
|
action = handleconnectflt(param);
|
||||||
|
if(action != PASS) return 19;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
34
src/conf.c
34
src/conf.c
@ -105,6 +105,10 @@ unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsign
|
|||||||
struct tm *ts;
|
struct tm *ts;
|
||||||
|
|
||||||
ts = localtime(&t);
|
ts = localtime(&t);
|
||||||
|
if(strlen((char *)name) >= 4096){
|
||||||
|
*buf = 0;
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
if(strchr((char *)name, '%')){
|
if(strchr((char *)name, '%')){
|
||||||
struct clientparam fakecli;
|
struct clientparam fakecli;
|
||||||
|
|
||||||
@ -466,6 +470,11 @@ static int h_rotate(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int h_maxseg(int argc, unsigned char **argv){
|
||||||
|
conf.maxseg = atoi((char *)argv[1]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int h_logformat(int argc, unsigned char **argv){
|
static int h_logformat(int argc, unsigned char **argv){
|
||||||
unsigned char * old = conf.logformat;
|
unsigned char * old = conf.logformat;
|
||||||
conf.logformat = (unsigned char *)mystrdup((char *)argv[1]);
|
conf.logformat = (unsigned char *)mystrdup((char *)argv[1]);
|
||||||
@ -900,7 +909,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
if(argc > 0 && strcmp("*", (char *)argv[0])) {
|
if(argc > 0 && strcmp("*", (char *)argv[0])) {
|
||||||
arg = argv[0];
|
arg = argv[0];
|
||||||
arg = (unsigned char *)strtok((char *)arg, ",");
|
arg = (unsigned char *)strtok((char *)arg, ",");
|
||||||
do {
|
if(arg) do {
|
||||||
if(!acl->users) {
|
if(!acl->users) {
|
||||||
acl->users = userl = myalloc(sizeof(struct userlist));
|
acl->users = userl = myalloc(sizeof(struct userlist));
|
||||||
}
|
}
|
||||||
@ -919,7 +928,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
}
|
}
|
||||||
if(argc > 1 && strcmp("*", (char *)argv[1])) {
|
if(argc > 1 && strcmp("*", (char *)argv[1])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[1], ",");
|
arg = (unsigned char *)strtok((char *)argv[1], ",");
|
||||||
do {
|
if(arg) do {
|
||||||
if(!acl->src) {
|
if(!acl->src) {
|
||||||
acl->src = ipl = myalloc(sizeof(struct iplist));
|
acl->src = ipl = myalloc(sizeof(struct iplist));
|
||||||
}
|
}
|
||||||
@ -940,7 +949,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
}
|
}
|
||||||
if(argc > 2 && strcmp("*", (char *)argv[2])) {
|
if(argc > 2 && strcmp("*", (char *)argv[2])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[2], ",");
|
arg = (unsigned char *)strtok((char *)argv[2], ",");
|
||||||
do {
|
if(arg) do {
|
||||||
int arglen;
|
int arglen;
|
||||||
unsigned char *pattern;
|
unsigned char *pattern;
|
||||||
struct iplist tmpip={NULL};
|
struct iplist tmpip={NULL};
|
||||||
@ -997,7 +1006,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
}
|
}
|
||||||
if(argc > 3 && strcmp("*", (char *)argv[3])) {
|
if(argc > 3 && strcmp("*", (char *)argv[3])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[3], ",");
|
arg = (unsigned char *)strtok((char *)argv[3], ",");
|
||||||
do {
|
if(arg) do {
|
||||||
if(!acl->ports) {
|
if(!acl->ports) {
|
||||||
acl->ports = portl = myalloc(sizeof(struct portlist));
|
acl->ports = portl = myalloc(sizeof(struct portlist));
|
||||||
}
|
}
|
||||||
@ -1020,7 +1029,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
}
|
}
|
||||||
if(argc > 4 && strcmp("*", (char *)argv[4])) {
|
if(argc > 4 && strcmp("*", (char *)argv[4])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[4], ",");
|
arg = (unsigned char *)strtok((char *)argv[4], ",");
|
||||||
do {
|
if(arg) do {
|
||||||
if(!strcmp((char *)arg, "CONNECT")){
|
if(!strcmp((char *)arg, "CONNECT")){
|
||||||
acl->operation |= CONNECT;
|
acl->operation |= CONNECT;
|
||||||
}
|
}
|
||||||
@ -1645,11 +1654,12 @@ struct commands commandhandlers[]={
|
|||||||
{commandhandlers+61, "force", h_force, 1, 1},
|
{commandhandlers+61, "force", h_force, 1, 1},
|
||||||
{commandhandlers+62, "noforce", h_noforce, 1, 1},
|
{commandhandlers+62, "noforce", h_noforce, 1, 1},
|
||||||
{commandhandlers+63, "parentretries", h_parentretries, 2, 2},
|
{commandhandlers+63, "parentretries", h_parentretries, 2, 2},
|
||||||
{commandhandlers+64, "auto", h_proxy, 1, 0},
|
{commandhandlers+64, "auto", h_proxy, 1, 0},
|
||||||
{commandhandlers+65, "backlog", h_backlog, 2, 2},
|
{commandhandlers+65, "backlog", h_backlog, 2, 2},
|
||||||
{commandhandlers+66, "tlspr", h_proxy, 1, 0},
|
{commandhandlers+66, "tlspr", h_proxy, 1, 0},
|
||||||
|
{commandhandlers+67, "maxseg", h_maxseg, 2, 2},
|
||||||
#ifndef NORADIUS
|
#ifndef NORADIUS
|
||||||
{commandhandlers+67, "radius", h_radius, 3, 0},
|
{commandhandlers+68, "radius", h_radius, 3, 0},
|
||||||
#endif
|
#endif
|
||||||
{specificcommands, "", h_noop, 1, 0}
|
{specificcommands, "", h_noop, 1, 0}
|
||||||
};
|
};
|
||||||
@ -1676,7 +1686,7 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha
|
|||||||
}
|
}
|
||||||
switch(*str){
|
switch(*str){
|
||||||
case '\0':
|
case '\0':
|
||||||
if(comment) return -1;
|
if(comment || incbegin) return -1;
|
||||||
argm[argc] = 0;
|
argm[argc] = 0;
|
||||||
return argc;
|
return argc;
|
||||||
case '$':
|
case '$':
|
||||||
@ -1703,14 +1713,14 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha
|
|||||||
argc--;
|
argc--;
|
||||||
if((fd = open((char *)incbegin+1, O_RDONLY)) <= 0){
|
if((fd = open((char *)incbegin+1, O_RDONLY)) <= 0){
|
||||||
fprintf(stderr, "Failed to open %s\n", incbegin+1);
|
fprintf(stderr, "Failed to open %s\n", incbegin+1);
|
||||||
break;
|
return -1;
|
||||||
}
|
}
|
||||||
if((*bufsize - *inbuf) <STRINGBUF){
|
if((*bufsize - *inbuf) <STRINGBUF){
|
||||||
*bufsize += STRINGBUF;
|
*bufsize += STRINGBUF;
|
||||||
if(!(buf = myrealloc(buf, *bufsize))){
|
if(!(buf = myrealloc(buf, *bufsize))){
|
||||||
fprintf(stderr, "Failed to allocate memory for %s\n", incbegin+1);
|
fprintf(stderr, "Failed to allocate memory for %s\n", incbegin+1);
|
||||||
close(fd);
|
close(fd);
|
||||||
break;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
len = 0;
|
len = 0;
|
||||||
@ -1721,7 +1731,7 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha
|
|||||||
if((res = read(fd, buf+*inbuf+len, STRINGBUF-(1+len))) <= 0) {
|
if((res = read(fd, buf+*inbuf+len, STRINGBUF-(1+len))) <= 0) {
|
||||||
perror((char *)incbegin+1);
|
perror((char *)incbegin+1);
|
||||||
close(fd);
|
close(fd);
|
||||||
break;
|
return -1;
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
buf[*inbuf+res+len] = 0;
|
buf[*inbuf+res+len] = 0;
|
||||||
|
|||||||
@ -749,7 +749,7 @@ static struct property prop_server[] = {
|
|||||||
|
|
||||||
static struct property prop_client[] = {
|
static struct property prop_client[] = {
|
||||||
{prop_client + 1, "servicetype", ef_client_type, TYPE_STRING, "type of the client"},
|
{prop_client + 1, "servicetype", ef_client_type, TYPE_STRING, "type of the client"},
|
||||||
{prop_client + 2, "threadid", ef_client_threadid, TYPE_INTEGER, "process thread id"},
|
{prop_client + 2, "threadid", ef_client_threadid, TYPE_UNSIGNED64, "process thread id"},
|
||||||
{prop_client + 3, "starttime", ef_client_starttime, TYPE_DATETIME, "client started seconds"},
|
{prop_client + 3, "starttime", ef_client_starttime, TYPE_DATETIME, "client started seconds"},
|
||||||
{prop_client + 4, "starttime_msec", ef_client_starttime_msec, TYPE_UNSIGNED, "client started milliseconds"},
|
{prop_client + 4, "starttime_msec", ef_client_starttime_msec, TYPE_UNSIGNED, "client started milliseconds"},
|
||||||
{prop_client + 5, "redirected", ef_client_redirected, TYPE_INTEGER, "number of redirections"},
|
{prop_client + 5, "redirected", ef_client_redirected, TYPE_INTEGER, "number of redirections"},
|
||||||
|
|||||||
@ -80,10 +80,7 @@ static unsigned char PADDING[64] = {
|
|||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
(a) = ROTATE_LEFT ((a), (s)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
void md4_calc(output, input, inlen)
|
void md4_calc(unsigned char *output, unsigned char *input, unsigned inlen)
|
||||||
unsigned char *output;
|
|
||||||
unsigned char *input; /* input block */
|
|
||||||
unsigned int inlen; /* length of input block */
|
|
||||||
{
|
{
|
||||||
MD4_CTX context;
|
MD4_CTX context;
|
||||||
|
|
||||||
@ -94,8 +91,7 @@ unsigned int inlen; /* length of input block */
|
|||||||
|
|
||||||
/* MD4 initialization. Begins an MD4 operation, writing a new context.
|
/* MD4 initialization. Begins an MD4 operation, writing a new context.
|
||||||
*/
|
*/
|
||||||
void MD4Init (context)
|
void MD4Init ( MD4_CTX *context)
|
||||||
MD4_CTX *context; /* context */
|
|
||||||
{
|
{
|
||||||
context->count[0] = context->count[1] = 0;
|
context->count[0] = context->count[1] = 0;
|
||||||
|
|
||||||
@ -111,10 +107,7 @@ MD4_CTX *context; /* context */
|
|||||||
operation, processing another message block, and updating the
|
operation, processing another message block, and updating the
|
||||||
context.
|
context.
|
||||||
*/
|
*/
|
||||||
void MD4Update (context, input, inputLen)
|
void MD4Update (MD4_CTX *context, unsigned char *input, unsigned inputLen)
|
||||||
MD4_CTX *context; /* context */
|
|
||||||
unsigned char *input; /* input block */
|
|
||||||
unsigned int inputLen; /* length of input block */
|
|
||||||
{
|
{
|
||||||
unsigned int i, index, partLen;
|
unsigned int i, index, partLen;
|
||||||
|
|
||||||
@ -152,9 +145,7 @@ unsigned int inputLen; /* length of input block */
|
|||||||
/* MD4 finalization. Ends an MD4 message-digest operation, writing the
|
/* MD4 finalization. Ends an MD4 message-digest operation, writing the
|
||||||
the message digest and zeroizing the context.
|
the message digest and zeroizing the context.
|
||||||
*/
|
*/
|
||||||
void MD4Final (digest, context)
|
void MD4Final (unsigned char digest[16], MD4_CTX *context)
|
||||||
unsigned char digest[16]; /* message digest */
|
|
||||||
MD4_CTX *context; /* context */
|
|
||||||
{
|
{
|
||||||
unsigned char bits[8];
|
unsigned char bits[8];
|
||||||
unsigned int index, padLen;
|
unsigned int index, padLen;
|
||||||
@ -180,9 +171,7 @@ MD4_CTX *context; /* context */
|
|||||||
|
|
||||||
/* MD4 basic transformation. Transforms state based on block.
|
/* MD4 basic transformation. Transforms state based on block.
|
||||||
*/
|
*/
|
||||||
static void MD4Transform (state, block)
|
static void MD4Transform (UINT4 state[4], unsigned char block[64])
|
||||||
UINT4 state[4];
|
|
||||||
unsigned char block[64];
|
|
||||||
{
|
{
|
||||||
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
||||||
|
|
||||||
@ -255,10 +244,7 @@ unsigned char block[64];
|
|||||||
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
|
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
|
||||||
a multiple of 4.
|
a multiple of 4.
|
||||||
*/
|
*/
|
||||||
static void Encode (output, input, len)
|
static void Encode (unsigned char *output, UINT4 *input, unsigned len)
|
||||||
unsigned char *output;
|
|
||||||
UINT4 *input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@ -273,11 +259,8 @@ unsigned int len;
|
|||||||
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
|
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
|
||||||
a multiple of 4.
|
a multiple of 4.
|
||||||
*/
|
*/
|
||||||
static void Decode (output, input, len)
|
static void Decode (UINT4 *output, unsigned char *input, unsigned len)
|
||||||
|
|
||||||
UINT4 *output;
|
|
||||||
unsigned char *input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@ -288,10 +271,7 @@ unsigned int len;
|
|||||||
|
|
||||||
/* Note: Replace "for loop" with standard memcpy if possible.
|
/* Note: Replace "for loop" with standard memcpy if possible.
|
||||||
*/
|
*/
|
||||||
static void MD4_memcpy (output, input, len)
|
static void MD4_memcpy (POINTER output, POINTER input, unsigned len)
|
||||||
POINTER output;
|
|
||||||
POINTER input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@ -301,10 +281,7 @@ unsigned int len;
|
|||||||
|
|
||||||
/* Note: Replace "for loop" with standard memset if possible.
|
/* Note: Replace "for loop" with standard memset if possible.
|
||||||
*/
|
*/
|
||||||
static void MD4_memset (output, value, len)
|
static void MD4_memset (POINTER output, int value, unsigned len)
|
||||||
POINTER output;
|
|
||||||
int value;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
|||||||
@ -107,8 +107,7 @@ void librad_md5_calc(unsigned char *output, unsigned char *input,
|
|||||||
|
|
||||||
/* MD5 initialization. Begins an MD5 operation, writing a new context.
|
/* MD5 initialization. Begins an MD5 operation, writing a new context.
|
||||||
*/
|
*/
|
||||||
void MD5Init (context)
|
void MD5Init (MD5_CTX *context)
|
||||||
MD5_CTX *context; /* context */
|
|
||||||
{
|
{
|
||||||
context->count[0] = context->count[1] = 0;
|
context->count[0] = context->count[1] = 0;
|
||||||
/* Load magic initialization constants.
|
/* Load magic initialization constants.
|
||||||
@ -123,10 +122,7 @@ MD5_CTX *context; /* context */
|
|||||||
operation, processing another message block, and updating the
|
operation, processing another message block, and updating the
|
||||||
context.
|
context.
|
||||||
*/
|
*/
|
||||||
void MD5Update (context, input, inputLen)
|
void MD5Update (MD5_CTX *context, const unsigned char *input, unsigned inputLen)
|
||||||
MD5_CTX *context; /* context */
|
|
||||||
const unsigned char *input; /* input block */
|
|
||||||
unsigned int inputLen; /* length of input block */
|
|
||||||
{
|
{
|
||||||
unsigned int i, index, partLen;
|
unsigned int i, index, partLen;
|
||||||
|
|
||||||
@ -165,9 +161,7 @@ unsigned int inputLen; /* length of input block */
|
|||||||
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
|
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
|
||||||
the message digest and zeroizing the context.
|
the message digest and zeroizing the context.
|
||||||
*/
|
*/
|
||||||
void MD5Final (digest, context)
|
void MD5Final (unsigned char digest[16], MD5_CTX *context)
|
||||||
unsigned char digest[16]; /* message digest */
|
|
||||||
MD5_CTX *context; /* context */
|
|
||||||
{
|
{
|
||||||
unsigned char bits[8];
|
unsigned char bits[8];
|
||||||
unsigned int index, padLen;
|
unsigned int index, padLen;
|
||||||
@ -194,9 +188,7 @@ MD5_CTX *context; /* context */
|
|||||||
|
|
||||||
/* MD5 basic transformation. Transforms state based on block.
|
/* MD5 basic transformation. Transforms state based on block.
|
||||||
*/
|
*/
|
||||||
static void MD5Transform (state, block)
|
static void MD5Transform (UINT4 state[4], const unsigned char block[64])
|
||||||
UINT4 state[4];
|
|
||||||
const unsigned char block[64];
|
|
||||||
{
|
{
|
||||||
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
||||||
|
|
||||||
@ -287,10 +279,7 @@ const unsigned char block[64];
|
|||||||
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
|
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
|
||||||
a multiple of 4.
|
a multiple of 4.
|
||||||
*/
|
*/
|
||||||
static void Encode (output, input, len)
|
static void Encode (unsigned char *output, UINT4 *input, unsigned len)
|
||||||
unsigned char *output;
|
|
||||||
UINT4 *input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@ -305,10 +294,7 @@ unsigned int len;
|
|||||||
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
|
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
|
||||||
a multiple of 4.
|
a multiple of 4.
|
||||||
*/
|
*/
|
||||||
static void Decode (output, input, len)
|
static void Decode (UINT4 *output, const unsigned char *input, unsigned len)
|
||||||
UINT4 *output;
|
|
||||||
const unsigned char *input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@ -320,10 +306,7 @@ unsigned int len;
|
|||||||
/* Note: Replace "for loop" with standard memcpy if possible.
|
/* Note: Replace "for loop" with standard memcpy if possible.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void MD5_memcpy (output, input, len)
|
static void MD5_memcpy (POINTER output, CONSTPOINTER input, unsigned len)
|
||||||
POINTER output;
|
|
||||||
CONSTPOINTER input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@ -333,10 +316,7 @@ unsigned int len;
|
|||||||
|
|
||||||
/* Note: Replace "for loop" with standard memset if possible.
|
/* Note: Replace "for loop" with standard memset if possible.
|
||||||
*/
|
*/
|
||||||
static void MD5_memset (output, value, len)
|
static void MD5_memset (POINTER output, int value, unsigned len)
|
||||||
POINTER output;
|
|
||||||
int value;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
|||||||
@ -300,6 +300,8 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
case 0:
|
||||||
|
j--;
|
||||||
default:
|
default:
|
||||||
buf[i++] = format[j];
|
buf[i++] = format[j];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -833,6 +833,8 @@ static struct filter fp_filter = {
|
|||||||
fp_open,
|
fp_open,
|
||||||
fp_client,
|
fp_client,
|
||||||
fp_request,
|
fp_request,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
fp_hcli,
|
fp_hcli,
|
||||||
fp_hsrv,
|
fp_hsrv,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@ -1,62 +1,8 @@
|
|||||||
all: $(BUILDDIR)PCREPlugin$(DLSUFFICS)
|
all: $(BUILDDIR)PCREPlugin$(DLSUFFICS)
|
||||||
|
|
||||||
pcre_maketables$(OBJSUFFICS): pcre_maketables.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_maketables.c
|
|
||||||
|
|
||||||
pcre_table$(OBJSUFFICS): pcre_table.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_table.c
|
|
||||||
|
|
||||||
pcre_ucd$(OBJSUFFICS): pcre_ucd.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_ucd.c
|
|
||||||
|
|
||||||
pcre_compile$(OBJSUFFICS): pcre_compile.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_compile.c
|
|
||||||
|
|
||||||
pcre_config$(OBJSUFFICS): pcre_config.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_config.c
|
|
||||||
|
|
||||||
pcre_dfa_exec$(OBJSUFFICS): pcre_dfa_exec.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_dfa_exec.c
|
|
||||||
|
|
||||||
pcre_exec$(OBJSUFFICS): pcre_exec.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_exec.c
|
|
||||||
|
|
||||||
pcre_fullinfo$(OBJSUFFICS): pcre_fullinfo.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_fullinfo.c
|
|
||||||
|
|
||||||
pcre_get$(OBJSUFFICS): pcre_get.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_get.c
|
|
||||||
|
|
||||||
pcre_globals$(OBJSUFFICS): pcre_globals.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_globals.c
|
|
||||||
|
|
||||||
pcre_newline$(OBJSUFFICS): pcre_newline.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_newline.c
|
|
||||||
|
|
||||||
pcre_ord2utf8$(OBJSUFFICS): pcre_ord2utf8.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_ord2utf8.c
|
|
||||||
|
|
||||||
pcre_refcount$(OBJSUFFICS): pcre_refcount.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_refcount.c
|
|
||||||
|
|
||||||
pcre_study$(OBJSUFFICS): pcre_study.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_study.c
|
|
||||||
|
|
||||||
pcre_tables$(OBJSUFFICS): pcre_tables.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_tables.c
|
|
||||||
|
|
||||||
pcre_valid_utf8$(OBJSUFFICS): pcre_valid_utf8.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_valid_utf8.c
|
|
||||||
|
|
||||||
pcre_version$(OBJSUFFICS): pcre_version.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_version.c
|
|
||||||
|
|
||||||
pcre_xclass$(OBJSUFFICS): pcre_xclass.c
|
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_xclass.c
|
|
||||||
|
|
||||||
pcre_plugin$(OBJSUFFICS): pcre_plugin.c
|
pcre_plugin$(OBJSUFFICS): pcre_plugin.c
|
||||||
$(CC) $(DCFLAGS) $(CFLAGS) pcre_plugin.c
|
$(CC) $(DCFLAGS) $(CFLAGS) pcre_plugin.c
|
||||||
|
|
||||||
$(BUILDDIR)PCREPlugin$(DLSUFFICS): pcre_compile$(OBJSUFFICS) pcre_config$(OBJSUFFICS) pcre_dfa_exec$(OBJSUFFICS) pcre_exec$(OBJSUFFICS) pcre_fullinfo$(OBJSUFFICS) pcre_get$(OBJSUFFICS) pcre_globals$(OBJSUFFICS) pcre_newline$(OBJSUFFICS) pcre_ord2utf8$(OBJSUFFICS) pcre_refcount$(OBJSUFFICS) pcre_study$(OBJSUFFICS) pcre_tables$(OBJSUFFICS) pcre_valid_utf8$(OBJSUFFICS) pcre_version$(OBJSUFFICS) pcre_xclass$(OBJSUFFICS) pcre_plugin$(OBJSUFFICS) pcre_maketables$(OBJSUFFICS) pcre_ucd$(OBJSUFFICS) pcre_table$(OBJSUFFICS)
|
$(BUILDDIR)PCREPlugin$(DLSUFFICS): pcre_plugin$(OBJSUFFICS)
|
||||||
$(LN) $(LNOUT)../../$(BUILDDIR)PCREPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) pcre_compile$(OBJSUFFICS) pcre_config$(OBJSUFFICS) pcre_dfa_exec$(OBJSUFFICS) pcre_exec$(OBJSUFFICS) pcre_fullinfo$(OBJSUFFICS) pcre_get$(OBJSUFFICS) pcre_globals$(OBJSUFFICS) pcre_newline$(OBJSUFFICS) pcre_ord2utf8$(OBJSUFFICS) pcre_refcount$(OBJSUFFICS) pcre_study$(OBJSUFFICS) pcre_tables$(OBJSUFFICS) pcre_valid_utf8$(OBJSUFFICS) pcre_version$(OBJSUFFICS) pcre_xclass$(OBJSUFFICS) pcre_plugin$(OBJSUFFICS) pcre_maketables$(OBJSUFFICS) pcre_ucd$(OBJSUFFICS) pcre_table$(OBJSUFFICS)
|
$(LN) $(LNOUT)../../$(BUILDDIR)PCREPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) pcre_plugin$(OBJSUFFICS) $(LIBSPREFIX)pcre2-8$(LIBSSUFFIX)
|
||||||
|
|
||||||
|
|||||||
@ -1,352 +0,0 @@
|
|||||||
#define PCRE_STATIC
|
|
||||||
/* config.h. Generated from config.h.in by configure. */
|
|
||||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* PCRE is written in Standard C, but there are a few non-standard things it
|
|
||||||
can cope with, allowing it to run on SunOS4 and other "close to standard"
|
|
||||||
systems.
|
|
||||||
|
|
||||||
In environments that support the GNU autotools, config.h.in is converted into
|
|
||||||
config.h by the "configure" script. In environments that use CMake,
|
|
||||||
config-cmake.in is converted into config.h. If you are going to build PCRE "by
|
|
||||||
hand" without using "configure" or CMake, you should copy the distributed
|
|
||||||
config.h.generic to config.h, and edit the macro definitions to be the way you
|
|
||||||
need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
|
|
||||||
so that config.h is included at the start of every source.
|
|
||||||
|
|
||||||
Alternatively, you can avoid editing by using -D on the compiler command line
|
|
||||||
to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
|
|
||||||
but if you do, default values will be taken from config.h for non-boolean
|
|
||||||
macros that are not defined on the command line.
|
|
||||||
|
|
||||||
Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined
|
|
||||||
(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
|
|
||||||
macros are listed as a commented #undef in config.h.generic. Macros such as
|
|
||||||
MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
|
|
||||||
surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
|
|
||||||
|
|
||||||
PCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
|
|
||||||
HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
|
|
||||||
sure both macros are undefined; an emulation function will then be used. */
|
|
||||||
|
|
||||||
/* By default, the \R escape sequence matches any Unicode line ending
|
|
||||||
character or sequence of characters. If BSR_ANYCRLF is defined (to any
|
|
||||||
value), this is changed so that backslash-R matches only CR, LF, or CRLF.
|
|
||||||
The build-time default can be overridden by the user of PCRE at runtime. */
|
|
||||||
/* #undef BSR_ANYCRLF */
|
|
||||||
|
|
||||||
/* If you are compiling for a system that uses EBCDIC instead of ASCII
|
|
||||||
character codes, define this macro to any value. You must also edit the
|
|
||||||
NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).
|
|
||||||
On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is
|
|
||||||
automatically adjusted. When EBCDIC is set, PCRE assumes that all input
|
|
||||||
strings are in EBCDIC. If you do not define this macro, PCRE will assume
|
|
||||||
input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build
|
|
||||||
a version of PCRE that supports both EBCDIC and UTF-8/16/32. */
|
|
||||||
/* #undef EBCDIC */
|
|
||||||
|
|
||||||
/* In an EBCDIC environment, define this macro to any value to arrange for the
|
|
||||||
NL character to be 0x25 instead of the default 0x15. NL plays the role that
|
|
||||||
LF does in an ASCII/Unicode environment. The value must also be set in the
|
|
||||||
NEWLINE macro below. On systems that can use "configure" or CMake to set
|
|
||||||
EBCDIC_NL25, the adjustment of NEWLINE is automatic. */
|
|
||||||
/* #undef EBCDIC_NL25 */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `bcopy' function. */
|
|
||||||
/* #undef HAVE_BCOPY */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <bits/type_traits.h> header file. */
|
|
||||||
/* #undef HAVE_BITS_TYPE_TRAITS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <bzlib.h> header file. */
|
|
||||||
/* #undef HAVE_BZLIB_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dirent.h> header file. */
|
|
||||||
/* #undef HAVE_DIRENT_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
/* #undef HAVE_DLFCN_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <editline/readline.h> header file. */
|
|
||||||
/* #undef HAVE_EDITLINE_READLINE_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <edit/readline/readline.h> header file. */
|
|
||||||
/* #undef HAVE_EDIT_READLINE_READLINE_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
/* #undef HAVE_INTTYPES_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <limits.h> header file. */
|
|
||||||
/* #undef HAVE_LIMITS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `long long'. */
|
|
||||||
/* #undef HAVE_LONG_LONG */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memmove' function. */
|
|
||||||
/* #undef HAVE_MEMMOVE */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
/* #undef HAVE_MEMORY_H */
|
|
||||||
|
|
||||||
/* Define if you have POSIX threads libraries and header files. */
|
|
||||||
/* #undef HAVE_PTHREAD */
|
|
||||||
|
|
||||||
/* Have PTHREAD_PRIO_INHERIT. */
|
|
||||||
/* #undef HAVE_PTHREAD_PRIO_INHERIT */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <readline/history.h> header file. */
|
|
||||||
/* #undef HAVE_READLINE_HISTORY_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <readline/readline.h> header file. */
|
|
||||||
/* #undef HAVE_READLINE_READLINE_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
/* #undef HAVE_STDINT_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
/* #undef HAVE_STDLIB_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strerror' function. */
|
|
||||||
/* #undef HAVE_STRERROR */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string> header file. */
|
|
||||||
/* #undef HAVE_STRING */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
/* #undef HAVE_STRINGS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
/* #undef HAVE_STRING_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have `strtoimax'. */
|
|
||||||
/* #undef HAVE_STRTOIMAX */
|
|
||||||
|
|
||||||
/* Define to 1 if you have `strtoll'. */
|
|
||||||
/* #undef HAVE_STRTOLL */
|
|
||||||
|
|
||||||
/* Define to 1 if you have `strtoq'. */
|
|
||||||
/* #undef HAVE_STRTOQ */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
/* #undef HAVE_SYS_STAT_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
/* #undef HAVE_SYS_TYPES_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <type_traits.h> header file. */
|
|
||||||
/* #undef HAVE_TYPE_TRAITS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
/* #undef HAVE_UNISTD_H */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `unsigned long long'. */
|
|
||||||
/* #undef HAVE_UNSIGNED_LONG_LONG */
|
|
||||||
|
|
||||||
/* Define to 1 if the compiler supports simple visibility declarations. */
|
|
||||||
/* #undef HAVE_VISIBILITY */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <windows.h> header file. */
|
|
||||||
/* #undef HAVE_WINDOWS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <zlib.h> header file. */
|
|
||||||
/* #undef HAVE_ZLIB_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have `_strtoi64'. */
|
|
||||||
/* #undef HAVE__STRTOI64 */
|
|
||||||
|
|
||||||
/* The value of LINK_SIZE determines the number of bytes used to store links
|
|
||||||
as offsets within the compiled regex. The default is 2, which allows for
|
|
||||||
compiled patterns up to 64K long. This covers the vast majority of cases.
|
|
||||||
However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows
|
|
||||||
for longer patterns in extreme cases. */
|
|
||||||
#ifndef LINK_SIZE
|
|
||||||
#define LINK_SIZE 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
|
||||||
/* This is ignored unless you are using libtool. */
|
|
||||||
#ifndef LT_OBJDIR
|
|
||||||
#define LT_OBJDIR ".libs/"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The value of MATCH_LIMIT determines the default number of times the
|
|
||||||
internal match() function can be called during a single execution of
|
|
||||||
pcre_exec(). There is a runtime interface for setting a different limit.
|
|
||||||
The limit exists in order to catch runaway regular expressions that take
|
|
||||||
for ever to determine that they do not match. The default is set very large
|
|
||||||
so that it does not accidentally catch legitimate cases. */
|
|
||||||
#ifndef MATCH_LIMIT
|
|
||||||
#define MATCH_LIMIT 10000000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The above limit applies to all calls of match(), whether or not they
|
|
||||||
increase the recursion depth. In some environments it is desirable to limit
|
|
||||||
the depth of recursive calls of match() more strictly, in order to restrict
|
|
||||||
the maximum amount of stack (or heap, if NO_RECURSE is defined) that is
|
|
||||||
used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of
|
|
||||||
match(). To have any useful effect, it must be less than the value of
|
|
||||||
MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is
|
|
||||||
a runtime method for setting a different limit. */
|
|
||||||
#ifndef MATCH_LIMIT_RECURSION
|
|
||||||
#define MATCH_LIMIT_RECURSION MATCH_LIMIT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This limit is parameterized just in case anybody ever wants to change it.
|
|
||||||
Care must be taken if it is increased, because it guards against integer
|
|
||||||
overflow caused by enormously large patterns. */
|
|
||||||
#ifndef MAX_NAME_COUNT
|
|
||||||
#define MAX_NAME_COUNT 10000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This limit is parameterized just in case anybody ever wants to change it.
|
|
||||||
Care must be taken if it is increased, because it guards against integer
|
|
||||||
overflow caused by enormously large patterns. */
|
|
||||||
#ifndef MAX_NAME_SIZE
|
|
||||||
#define MAX_NAME_SIZE 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The value of NEWLINE determines the default newline character sequence.
|
|
||||||
PCRE client programs can override this by selecting other values at run
|
|
||||||
time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338
|
|
||||||
(CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or
|
|
||||||
3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and
|
|
||||||
0x25) that are used as the NL line terminator that is equivalent to ASCII
|
|
||||||
LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY),
|
|
||||||
or -2 (ANYCRLF). */
|
|
||||||
#ifndef NEWLINE
|
|
||||||
#define NEWLINE 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 any value 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 obtain memory from the heap. For more
|
|
||||||
detail, see the comments and other stuff just above the match() function.
|
|
||||||
*/
|
|
||||||
/* #undef NO_RECURSE */
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#define PACKAGE "pcre"
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#define PACKAGE_BUGREPORT ""
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#define PACKAGE_NAME "PCRE"
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#define PACKAGE_STRING "PCRE 8.39"
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#define PACKAGE_TARNAME "pcre"
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#define PACKAGE_URL ""
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#define PACKAGE_VERSION "8.39"
|
|
||||||
|
|
||||||
/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
|
|
||||||
parentheses (of any kind) in a pattern. This limits the amount of system
|
|
||||||
stack that is used while compiling a pattern. */
|
|
||||||
#ifndef PARENS_NEST_LIMIT
|
|
||||||
#define PARENS_NEST_LIMIT 250
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The value of PCREGREP_BUFSIZE determines the size of buffer used by
|
|
||||||
pcregrep to hold parts of the file it is searching. This is also the
|
|
||||||
minimum value. The actual amount of memory used by pcregrep is three times
|
|
||||||
this number, because it allows for the buffering of "before" and "after"
|
|
||||||
lines. */
|
|
||||||
#ifndef PCREGREP_BUFSIZE
|
|
||||||
#define PCREGREP_BUFSIZE 20480
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If you are compiling for a system other than a Unix-like system or
|
|
||||||
Win32, and it needs some magic to be inserted before the definition
|
|
||||||
of a function that is exported by the library, define this macro to
|
|
||||||
contain the relevant magic. If you do not define this macro, a suitable
|
|
||||||
__declspec value is used for Windows systems; in other environments
|
|
||||||
"extern" is used for a C compiler and "extern C" for a C++ compiler.
|
|
||||||
This macro apears at the start of every exported function that is part
|
|
||||||
of the external API. It does not appear on functions that are "external"
|
|
||||||
in the C sense, but which are internal to the library. */
|
|
||||||
/* #undef PCRE_EXP_DEFN */
|
|
||||||
|
|
||||||
/* Define to any value if linking statically (TODO: make nice with Libtool) */
|
|
||||||
/* #undef PCRE_STATIC */
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
used is defined by POSIX_MALLOC_THRESHOLD. */
|
|
||||||
#ifndef POSIX_MALLOC_THRESHOLD
|
|
||||||
#define POSIX_MALLOC_THRESHOLD 10
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
|
||||||
your system. */
|
|
||||||
/* #undef PTHREAD_CREATE_JOINABLE */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
/* #undef STDC_HEADERS */
|
|
||||||
|
|
||||||
/* Define to any value to enable support for Just-In-Time compiling. */
|
|
||||||
/* #undef SUPPORT_JIT */
|
|
||||||
|
|
||||||
/* Define to any value to allow pcregrep to be linked with libbz2, so that it
|
|
||||||
is able to handle .bz2 files. */
|
|
||||||
/* #undef SUPPORT_LIBBZ2 */
|
|
||||||
|
|
||||||
/* Define to any value to allow pcretest to be linked with libedit. */
|
|
||||||
/* #undef SUPPORT_LIBEDIT */
|
|
||||||
|
|
||||||
/* Define to any value to allow pcretest to be linked with libreadline. */
|
|
||||||
/* #undef SUPPORT_LIBREADLINE */
|
|
||||||
|
|
||||||
/* Define to any value to allow pcregrep to be linked with libz, so that it is
|
|
||||||
able to handle .gz files. */
|
|
||||||
/* #undef SUPPORT_LIBZ */
|
|
||||||
|
|
||||||
/* Define to any value to enable the 16 bit PCRE library. */
|
|
||||||
/* #undef SUPPORT_PCRE16 */
|
|
||||||
|
|
||||||
/* Define to any value to enable the 32 bit PCRE library. */
|
|
||||||
/* #undef SUPPORT_PCRE32 */
|
|
||||||
|
|
||||||
/* Define to any value to enable the 8 bit PCRE library. */
|
|
||||||
/* #undef SUPPORT_PCRE8 */
|
|
||||||
|
|
||||||
/* Define to any value to enable JIT support in pcregrep. */
|
|
||||||
/* #undef SUPPORT_PCREGREP_JIT */
|
|
||||||
|
|
||||||
/* Define to any value to enable support for Unicode properties. */
|
|
||||||
/* #undef SUPPORT_UCP */
|
|
||||||
|
|
||||||
/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding.
|
|
||||||
This will work even in an EBCDIC environment, but it is incompatible with
|
|
||||||
the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or*
|
|
||||||
ASCII/UTF-8/16/32, but not both at once. */
|
|
||||||
/* #undef SUPPORT_UTF */
|
|
||||||
|
|
||||||
/* Define to any value for valgrind support to find invalid memory reads. */
|
|
||||||
/* #undef SUPPORT_VALGRIND */
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#ifndef VERSION
|
|
||||||
#define VERSION "8.39"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
|
||||||
/* #undef const */
|
|
||||||
|
|
||||||
/* Define to the type of a signed integer type of width exactly 64 bits if
|
|
||||||
such a type exists and the standard includes do not define it. */
|
|
||||||
/* #undef int64_t */
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
/* #undef size_t */
|
|
||||||
@ -1,677 +0,0 @@
|
|||||||
/*************************************************
|
|
||||||
* Perl-Compatible Regular Expressions *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This is the public header file for the PCRE library, to be #included by
|
|
||||||
applications that call the PCRE functions.
|
|
||||||
|
|
||||||
Copyright (c) 1997-2014 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 current PCRE version information. */
|
|
||||||
|
|
||||||
#define PCRE_MAJOR 8
|
|
||||||
#define PCRE_MINOR 39
|
|
||||||
#define PCRE_PRERELEASE
|
|
||||||
#define PCRE_DATE 2016-06-14
|
|
||||||
|
|
||||||
/* When an application links to a PCRE DLL in Windows, the symbols that are
|
|
||||||
imported have to be identified as such. When building PCRE, the appropriate
|
|
||||||
export setting is defined in pcre_internal.h, which includes this file. So we
|
|
||||||
don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */
|
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(PCRE_STATIC)
|
|
||||||
# ifndef PCRE_EXP_DECL
|
|
||||||
# define PCRE_EXP_DECL extern __declspec(dllimport)
|
|
||||||
# endif
|
|
||||||
# ifdef __cplusplus
|
|
||||||
# ifndef PCRECPP_EXP_DECL
|
|
||||||
# define PCRECPP_EXP_DECL extern __declspec(dllimport)
|
|
||||||
# endif
|
|
||||||
# ifndef PCRECPP_EXP_DEFN
|
|
||||||
# define PCRECPP_EXP_DEFN __declspec(dllimport)
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* By default, we use the standard "extern" declarations. */
|
|
||||||
|
|
||||||
#ifndef PCRE_EXP_DECL
|
|
||||||
# ifdef __cplusplus
|
|
||||||
# define PCRE_EXP_DECL extern "C"
|
|
||||||
# else
|
|
||||||
# define PCRE_EXP_DECL extern
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
# ifndef PCRECPP_EXP_DECL
|
|
||||||
# define PCRECPP_EXP_DECL extern
|
|
||||||
# endif
|
|
||||||
# ifndef PCRECPP_EXP_DEFN
|
|
||||||
# define PCRECPP_EXP_DEFN
|
|
||||||
# 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
|
|
||||||
|
|
||||||
/* Public options. Some are compile-time only, some are run-time only, and some
|
|
||||||
are both. Most of the compile-time options are saved with the compiled regex so
|
|
||||||
that they can be inspected during studying (and therefore JIT compiling). Note
|
|
||||||
that pcre_study() has its own set of options. Originally, all the options
|
|
||||||
defined here used distinct bits. However, almost all the bits in a 32-bit word
|
|
||||||
are now used, so in order to conserve them, option bits that were previously
|
|
||||||
only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may
|
|
||||||
also be used for compile-time options that affect only compiling and are not
|
|
||||||
relevant for studying or JIT compiling.
|
|
||||||
|
|
||||||
Some options for pcre_compile() change its behaviour but do not affect the
|
|
||||||
behaviour of the execution functions. Other options are passed through to the
|
|
||||||
execution functions and affect their behaviour, with or without affecting the
|
|
||||||
behaviour of pcre_compile().
|
|
||||||
|
|
||||||
Options that can be passed to pcre_compile() are tagged Cx below, with these
|
|
||||||
variants:
|
|
||||||
|
|
||||||
C1 Affects compile only
|
|
||||||
C2 Does not affect compile; affects exec, dfa_exec
|
|
||||||
C3 Affects compile, exec, dfa_exec
|
|
||||||
C4 Affects compile, exec, dfa_exec, study
|
|
||||||
C5 Affects compile, exec, study
|
|
||||||
|
|
||||||
Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with
|
|
||||||
E and D, respectively. They take precedence over C3, C4, and C5 settings passed
|
|
||||||
from pcre_compile(). Those that are compatible with JIT execution are flagged
|
|
||||||
with J. */
|
|
||||||
|
|
||||||
#define PCRE_CASELESS 0x00000001 /* C1 */
|
|
||||||
#define PCRE_MULTILINE 0x00000002 /* C1 */
|
|
||||||
#define PCRE_DOTALL 0x00000004 /* C1 */
|
|
||||||
#define PCRE_EXTENDED 0x00000008 /* C1 */
|
|
||||||
#define PCRE_ANCHORED 0x00000010 /* C4 E D */
|
|
||||||
#define PCRE_DOLLAR_ENDONLY 0x00000020 /* C2 */
|
|
||||||
#define PCRE_EXTRA 0x00000040 /* C1 */
|
|
||||||
#define PCRE_NOTBOL 0x00000080 /* E D J */
|
|
||||||
#define PCRE_NOTEOL 0x00000100 /* E D J */
|
|
||||||
#define PCRE_UNGREEDY 0x00000200 /* C1 */
|
|
||||||
#define PCRE_NOTEMPTY 0x00000400 /* E D J */
|
|
||||||
#define PCRE_UTF8 0x00000800 /* C4 ) */
|
|
||||||
#define PCRE_UTF16 0x00000800 /* C4 ) Synonyms */
|
|
||||||
#define PCRE_UTF32 0x00000800 /* C4 ) */
|
|
||||||
#define PCRE_NO_AUTO_CAPTURE 0x00001000 /* C1 */
|
|
||||||
#define PCRE_NO_UTF8_CHECK 0x00002000 /* C1 E D J ) */
|
|
||||||
#define PCRE_NO_UTF16_CHECK 0x00002000 /* C1 E D J ) Synonyms */
|
|
||||||
#define PCRE_NO_UTF32_CHECK 0x00002000 /* C1 E D J ) */
|
|
||||||
#define PCRE_AUTO_CALLOUT 0x00004000 /* C1 */
|
|
||||||
#define PCRE_PARTIAL_SOFT 0x00008000 /* E D J ) Synonyms */
|
|
||||||
#define PCRE_PARTIAL 0x00008000 /* E D J ) */
|
|
||||||
|
|
||||||
/* This pair use the same bit. */
|
|
||||||
#define PCRE_NEVER_UTF 0x00010000 /* C1 ) Overlaid */
|
|
||||||
#define PCRE_DFA_SHORTEST 0x00010000 /* D ) Overlaid */
|
|
||||||
|
|
||||||
/* This pair use the same bit. */
|
|
||||||
#define PCRE_NO_AUTO_POSSESS 0x00020000 /* C1 ) Overlaid */
|
|
||||||
#define PCRE_DFA_RESTART 0x00020000 /* D ) Overlaid */
|
|
||||||
|
|
||||||
#define PCRE_FIRSTLINE 0x00040000 /* C3 */
|
|
||||||
#define PCRE_DUPNAMES 0x00080000 /* C1 */
|
|
||||||
#define PCRE_NEWLINE_CR 0x00100000 /* C3 E D */
|
|
||||||
#define PCRE_NEWLINE_LF 0x00200000 /* C3 E D */
|
|
||||||
#define PCRE_NEWLINE_CRLF 0x00300000 /* C3 E D */
|
|
||||||
#define PCRE_NEWLINE_ANY 0x00400000 /* C3 E D */
|
|
||||||
#define PCRE_NEWLINE_ANYCRLF 0x00500000 /* C3 E D */
|
|
||||||
#define PCRE_BSR_ANYCRLF 0x00800000 /* C3 E D */
|
|
||||||
#define PCRE_BSR_UNICODE 0x01000000 /* C3 E D */
|
|
||||||
#define PCRE_JAVASCRIPT_COMPAT 0x02000000 /* C5 */
|
|
||||||
#define PCRE_NO_START_OPTIMIZE 0x04000000 /* C2 E D ) Synonyms */
|
|
||||||
#define PCRE_NO_START_OPTIMISE 0x04000000 /* C2 E D ) */
|
|
||||||
#define PCRE_PARTIAL_HARD 0x08000000 /* E D J */
|
|
||||||
#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* E D J */
|
|
||||||
#define PCRE_UCP 0x20000000 /* C3 */
|
|
||||||
|
|
||||||
/* 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_OPCODE (-5)
|
|
||||||
#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */
|
|
||||||
#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) /* Same for 8/16/32 */
|
|
||||||
#define PCRE_ERROR_BADUTF16 (-10) /* Same for 8/16/32 */
|
|
||||||
#define PCRE_ERROR_BADUTF32 (-10) /* Same for 8/16/32 */
|
|
||||||
#define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Same for 8/16 */
|
|
||||||
#define PCRE_ERROR_BADUTF16_OFFSET (-11) /* Same for 8/16 */
|
|
||||||
#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)
|
|
||||||
#define PCRE_ERROR_RECURSIONLIMIT (-21)
|
|
||||||
#define PCRE_ERROR_NULLWSLIMIT (-22) /* No longer actually used */
|
|
||||||
#define PCRE_ERROR_BADNEWLINE (-23)
|
|
||||||
#define PCRE_ERROR_BADOFFSET (-24)
|
|
||||||
#define PCRE_ERROR_SHORTUTF8 (-25)
|
|
||||||
#define PCRE_ERROR_SHORTUTF16 (-25) /* Same for 8/16 */
|
|
||||||
#define PCRE_ERROR_RECURSELOOP (-26)
|
|
||||||
#define PCRE_ERROR_JIT_STACKLIMIT (-27)
|
|
||||||
#define PCRE_ERROR_BADMODE (-28)
|
|
||||||
#define PCRE_ERROR_BADENDIANNESS (-29)
|
|
||||||
#define PCRE_ERROR_DFA_BADRESTART (-30)
|
|
||||||
#define PCRE_ERROR_JIT_BADOPTION (-31)
|
|
||||||
#define PCRE_ERROR_BADLENGTH (-32)
|
|
||||||
#define PCRE_ERROR_UNSET (-33)
|
|
||||||
|
|
||||||
/* Specific error codes for UTF-8 validity checks */
|
|
||||||
|
|
||||||
#define PCRE_UTF8_ERR0 0
|
|
||||||
#define PCRE_UTF8_ERR1 1
|
|
||||||
#define PCRE_UTF8_ERR2 2
|
|
||||||
#define PCRE_UTF8_ERR3 3
|
|
||||||
#define PCRE_UTF8_ERR4 4
|
|
||||||
#define PCRE_UTF8_ERR5 5
|
|
||||||
#define PCRE_UTF8_ERR6 6
|
|
||||||
#define PCRE_UTF8_ERR7 7
|
|
||||||
#define PCRE_UTF8_ERR8 8
|
|
||||||
#define PCRE_UTF8_ERR9 9
|
|
||||||
#define PCRE_UTF8_ERR10 10
|
|
||||||
#define PCRE_UTF8_ERR11 11
|
|
||||||
#define PCRE_UTF8_ERR12 12
|
|
||||||
#define PCRE_UTF8_ERR13 13
|
|
||||||
#define PCRE_UTF8_ERR14 14
|
|
||||||
#define PCRE_UTF8_ERR15 15
|
|
||||||
#define PCRE_UTF8_ERR16 16
|
|
||||||
#define PCRE_UTF8_ERR17 17
|
|
||||||
#define PCRE_UTF8_ERR18 18
|
|
||||||
#define PCRE_UTF8_ERR19 19
|
|
||||||
#define PCRE_UTF8_ERR20 20
|
|
||||||
#define PCRE_UTF8_ERR21 21
|
|
||||||
#define PCRE_UTF8_ERR22 22 /* Unused (was non-character) */
|
|
||||||
|
|
||||||
/* Specific error codes for UTF-16 validity checks */
|
|
||||||
|
|
||||||
#define PCRE_UTF16_ERR0 0
|
|
||||||
#define PCRE_UTF16_ERR1 1
|
|
||||||
#define PCRE_UTF16_ERR2 2
|
|
||||||
#define PCRE_UTF16_ERR3 3
|
|
||||||
#define PCRE_UTF16_ERR4 4 /* Unused (was non-character) */
|
|
||||||
|
|
||||||
/* Specific error codes for UTF-32 validity checks */
|
|
||||||
|
|
||||||
#define PCRE_UTF32_ERR0 0
|
|
||||||
#define PCRE_UTF32_ERR1 1
|
|
||||||
#define PCRE_UTF32_ERR2 2 /* Unused (was non-character) */
|
|
||||||
#define PCRE_UTF32_ERR3 3
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
#define PCRE_INFO_OKPARTIAL 12
|
|
||||||
#define PCRE_INFO_JCHANGED 13
|
|
||||||
#define PCRE_INFO_HASCRORLF 14
|
|
||||||
#define PCRE_INFO_MINLENGTH 15
|
|
||||||
#define PCRE_INFO_JIT 16
|
|
||||||
#define PCRE_INFO_JITSIZE 17
|
|
||||||
#define PCRE_INFO_MAXLOOKBEHIND 18
|
|
||||||
#define PCRE_INFO_FIRSTCHARACTER 19
|
|
||||||
#define PCRE_INFO_FIRSTCHARACTERFLAGS 20
|
|
||||||
#define PCRE_INFO_REQUIREDCHAR 21
|
|
||||||
#define PCRE_INFO_REQUIREDCHARFLAGS 22
|
|
||||||
#define PCRE_INFO_MATCHLIMIT 23
|
|
||||||
#define PCRE_INFO_RECURSIONLIMIT 24
|
|
||||||
#define PCRE_INFO_MATCH_EMPTY 25
|
|
||||||
|
|
||||||
/* Request types for pcre_config(). Do not re-arrange, in order to remain
|
|
||||||
compatible. */
|
|
||||||
|
|
||||||
#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
|
|
||||||
#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7
|
|
||||||
#define PCRE_CONFIG_BSR 8
|
|
||||||
#define PCRE_CONFIG_JIT 9
|
|
||||||
#define PCRE_CONFIG_UTF16 10
|
|
||||||
#define PCRE_CONFIG_JITTARGET 11
|
|
||||||
#define PCRE_CONFIG_UTF32 12
|
|
||||||
#define PCRE_CONFIG_PARENS_LIMIT 13
|
|
||||||
|
|
||||||
/* Request types for pcre_study(). Do not re-arrange, in order to remain
|
|
||||||
compatible. */
|
|
||||||
|
|
||||||
#define PCRE_STUDY_JIT_COMPILE 0x0001
|
|
||||||
#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE 0x0002
|
|
||||||
#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 0x0004
|
|
||||||
#define PCRE_STUDY_EXTRA_NEEDED 0x0008
|
|
||||||
|
|
||||||
/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine
|
|
||||||
these bits, just add new ones on the end, in order to remain compatible. */
|
|
||||||
|
|
||||||
#define PCRE_EXTRA_STUDY_DATA 0x0001
|
|
||||||
#define PCRE_EXTRA_MATCH_LIMIT 0x0002
|
|
||||||
#define PCRE_EXTRA_CALLOUT_DATA 0x0004
|
|
||||||
#define PCRE_EXTRA_TABLES 0x0008
|
|
||||||
#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010
|
|
||||||
#define PCRE_EXTRA_MARK 0x0020
|
|
||||||
#define PCRE_EXTRA_EXECUTABLE_JIT 0x0040
|
|
||||||
|
|
||||||
/* Types */
|
|
||||||
|
|
||||||
struct real_pcre; /* declaration; the definition is private */
|
|
||||||
typedef struct real_pcre pcre;
|
|
||||||
|
|
||||||
struct real_pcre16; /* declaration; the definition is private */
|
|
||||||
typedef struct real_pcre16 pcre16;
|
|
||||||
|
|
||||||
struct real_pcre32; /* declaration; the definition is private */
|
|
||||||
typedef struct real_pcre32 pcre32;
|
|
||||||
|
|
||||||
struct real_pcre_jit_stack; /* declaration; the definition is private */
|
|
||||||
typedef struct real_pcre_jit_stack pcre_jit_stack;
|
|
||||||
|
|
||||||
struct real_pcre16_jit_stack; /* declaration; the definition is private */
|
|
||||||
typedef struct real_pcre16_jit_stack pcre16_jit_stack;
|
|
||||||
|
|
||||||
struct real_pcre32_jit_stack; /* declaration; the definition is private */
|
|
||||||
typedef struct real_pcre32_jit_stack pcre32_jit_stack;
|
|
||||||
|
|
||||||
/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain
|
|
||||||
a 16 bit wide signed data type. Otherwise it can be a dummy data type since
|
|
||||||
pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */
|
|
||||||
#ifndef PCRE_UCHAR16
|
|
||||||
#define PCRE_UCHAR16 unsigned short
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PCRE_SPTR16
|
|
||||||
#define PCRE_SPTR16 const PCRE_UCHAR16 *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain
|
|
||||||
a 32 bit wide signed data type. Otherwise it can be a dummy data type since
|
|
||||||
pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */
|
|
||||||
#ifndef PCRE_UCHAR32
|
|
||||||
#define PCRE_UCHAR32 unsigned int
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PCRE_SPTR32
|
|
||||||
#define PCRE_SPTR32 const PCRE_UCHAR32 *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* When PCRE is compiled as a C++ library, the subject pointer type can be
|
|
||||||
replaced with a custom type. For conventional use, the public interface is a
|
|
||||||
const char *. */
|
|
||||||
|
|
||||||
#ifndef PCRE_SPTR
|
|
||||||
#define PCRE_SPTR const char *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
unsigned long int match_limit_recursion; /* Max recursive calls to match() */
|
|
||||||
unsigned char **mark; /* For passing back a mark pointer */
|
|
||||||
void *executable_jit; /* Contains a pointer to a compiled jit code */
|
|
||||||
} pcre_extra;
|
|
||||||
|
|
||||||
/* Same structure as above, but with 16 bit char pointers. */
|
|
||||||
|
|
||||||
typedef struct pcre16_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 */
|
|
||||||
unsigned long int match_limit_recursion; /* Max recursive calls to match() */
|
|
||||||
PCRE_UCHAR16 **mark; /* For passing back a mark pointer */
|
|
||||||
void *executable_jit; /* Contains a pointer to a compiled jit code */
|
|
||||||
} pcre16_extra;
|
|
||||||
|
|
||||||
/* Same structure as above, but with 32 bit char pointers. */
|
|
||||||
|
|
||||||
typedef struct pcre32_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 */
|
|
||||||
unsigned long int match_limit_recursion; /* Max recursive calls to match() */
|
|
||||||
PCRE_UCHAR32 **mark; /* For passing back a mark pointer */
|
|
||||||
void *executable_jit; /* Contains a pointer to a compiled jit code */
|
|
||||||
} pcre32_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 */
|
|
||||||
PCRE_SPTR 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 */
|
|
||||||
/* ------------------- Added for Version 2 -------------------------- */
|
|
||||||
const unsigned char *mark; /* Pointer to current mark or NULL */
|
|
||||||
/* ------------------------------------------------------------------ */
|
|
||||||
} pcre_callout_block;
|
|
||||||
|
|
||||||
/* Same structure as above, but with 16 bit char pointers. */
|
|
||||||
|
|
||||||
typedef struct pcre16_callout_block {
|
|
||||||
int version; /* Identifies version of block */
|
|
||||||
/* ------------------------ Version 0 ------------------------------- */
|
|
||||||
int callout_number; /* Number compiled into pattern */
|
|
||||||
int *offset_vector; /* The offset vector */
|
|
||||||
PCRE_SPTR16 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 */
|
|
||||||
/* ------------------- Added for Version 2 -------------------------- */
|
|
||||||
const PCRE_UCHAR16 *mark; /* Pointer to current mark or NULL */
|
|
||||||
/* ------------------------------------------------------------------ */
|
|
||||||
} pcre16_callout_block;
|
|
||||||
|
|
||||||
/* Same structure as above, but with 32 bit char pointers. */
|
|
||||||
|
|
||||||
typedef struct pcre32_callout_block {
|
|
||||||
int version; /* Identifies version of block */
|
|
||||||
/* ------------------------ Version 0 ------------------------------- */
|
|
||||||
int callout_number; /* Number compiled into pattern */
|
|
||||||
int *offset_vector; /* The offset vector */
|
|
||||||
PCRE_SPTR32 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 */
|
|
||||||
/* ------------------- Added for Version 2 -------------------------- */
|
|
||||||
const PCRE_UCHAR32 *mark; /* Pointer to current mark or NULL */
|
|
||||||
/* ------------------------------------------------------------------ */
|
|
||||||
} pcre32_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_EXP_DECL void *(*pcre_malloc)(size_t);
|
|
||||||
PCRE_EXP_DECL void (*pcre_free)(void *);
|
|
||||||
PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);
|
|
||||||
PCRE_EXP_DECL void (*pcre_stack_free)(void *);
|
|
||||||
PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *);
|
|
||||||
PCRE_EXP_DECL int (*pcre_stack_guard)(void);
|
|
||||||
|
|
||||||
PCRE_EXP_DECL void *(*pcre16_malloc)(size_t);
|
|
||||||
PCRE_EXP_DECL void (*pcre16_free)(void *);
|
|
||||||
PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t);
|
|
||||||
PCRE_EXP_DECL void (*pcre16_stack_free)(void *);
|
|
||||||
PCRE_EXP_DECL int (*pcre16_callout)(pcre16_callout_block *);
|
|
||||||
PCRE_EXP_DECL int (*pcre16_stack_guard)(void);
|
|
||||||
|
|
||||||
PCRE_EXP_DECL void *(*pcre32_malloc)(size_t);
|
|
||||||
PCRE_EXP_DECL void (*pcre32_free)(void *);
|
|
||||||
PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t);
|
|
||||||
PCRE_EXP_DECL void (*pcre32_stack_free)(void *);
|
|
||||||
PCRE_EXP_DECL int (*pcre32_callout)(pcre32_callout_block *);
|
|
||||||
PCRE_EXP_DECL int (*pcre32_stack_guard)(void);
|
|
||||||
#else /* VPCOMPAT */
|
|
||||||
PCRE_EXP_DECL void *pcre_malloc(size_t);
|
|
||||||
PCRE_EXP_DECL void pcre_free(void *);
|
|
||||||
PCRE_EXP_DECL void *pcre_stack_malloc(size_t);
|
|
||||||
PCRE_EXP_DECL void pcre_stack_free(void *);
|
|
||||||
PCRE_EXP_DECL int pcre_callout(pcre_callout_block *);
|
|
||||||
PCRE_EXP_DECL int pcre_stack_guard(void);
|
|
||||||
|
|
||||||
PCRE_EXP_DECL void *pcre16_malloc(size_t);
|
|
||||||
PCRE_EXP_DECL void pcre16_free(void *);
|
|
||||||
PCRE_EXP_DECL void *pcre16_stack_malloc(size_t);
|
|
||||||
PCRE_EXP_DECL void pcre16_stack_free(void *);
|
|
||||||
PCRE_EXP_DECL int pcre16_callout(pcre16_callout_block *);
|
|
||||||
PCRE_EXP_DECL int pcre16_stack_guard(void);
|
|
||||||
|
|
||||||
PCRE_EXP_DECL void *pcre32_malloc(size_t);
|
|
||||||
PCRE_EXP_DECL void pcre32_free(void *);
|
|
||||||
PCRE_EXP_DECL void *pcre32_stack_malloc(size_t);
|
|
||||||
PCRE_EXP_DECL void pcre32_stack_free(void *);
|
|
||||||
PCRE_EXP_DECL int pcre32_callout(pcre32_callout_block *);
|
|
||||||
PCRE_EXP_DECL int pcre32_stack_guard(void);
|
|
||||||
#endif /* VPCOMPAT */
|
|
||||||
|
|
||||||
/* User defined callback which provides a stack just before the match starts. */
|
|
||||||
|
|
||||||
typedef pcre_jit_stack *(*pcre_jit_callback)(void *);
|
|
||||||
typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *);
|
|
||||||
typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *);
|
|
||||||
|
|
||||||
/* Exported PCRE functions */
|
|
||||||
|
|
||||||
PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,
|
|
||||||
const unsigned char *);
|
|
||||||
PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *,
|
|
||||||
const unsigned char *);
|
|
||||||
PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *,
|
|
||||||
const unsigned char *);
|
|
||||||
PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,
|
|
||||||
int *, const unsigned char *);
|
|
||||||
PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **,
|
|
||||||
int *, const unsigned char *);
|
|
||||||
PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **,
|
|
||||||
int *, const unsigned char *);
|
|
||||||
PCRE_EXP_DECL int pcre_config(int, void *);
|
|
||||||
PCRE_EXP_DECL int pcre16_config(int, void *);
|
|
||||||
PCRE_EXP_DECL int pcre32_config(int, void *);
|
|
||||||
PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *,
|
|
||||||
int *, int, const char *, char *, int);
|
|
||||||
PCRE_EXP_DECL int pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16,
|
|
||||||
int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int);
|
|
||||||
PCRE_EXP_DECL int pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32,
|
|
||||||
int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int);
|
|
||||||
PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int,
|
|
||||||
char *, int);
|
|
||||||
PCRE_EXP_DECL int pcre16_copy_substring(PCRE_SPTR16, int *, int, int,
|
|
||||||
PCRE_UCHAR16 *, int);
|
|
||||||
PCRE_EXP_DECL int pcre32_copy_substring(PCRE_SPTR32, int *, int, int,
|
|
||||||
PCRE_UCHAR32 *, int);
|
|
||||||
PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *,
|
|
||||||
const char *, int, int, int, int *, int , int *, int);
|
|
||||||
PCRE_EXP_DECL int pcre16_dfa_exec(const pcre16 *, const pcre16_extra *,
|
|
||||||
PCRE_SPTR16, int, int, int, int *, int , int *, int);
|
|
||||||
PCRE_EXP_DECL int pcre32_dfa_exec(const pcre32 *, const pcre32_extra *,
|
|
||||||
PCRE_SPTR32, int, int, int, int *, int , int *, int);
|
|
||||||
PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,
|
|
||||||
int, int, int, int *, int);
|
|
||||||
PCRE_EXP_DECL int pcre16_exec(const pcre16 *, const pcre16_extra *,
|
|
||||||
PCRE_SPTR16, int, int, int, int *, int);
|
|
||||||
PCRE_EXP_DECL int pcre32_exec(const pcre32 *, const pcre32_extra *,
|
|
||||||
PCRE_SPTR32, int, int, int, int *, int);
|
|
||||||
PCRE_EXP_DECL int pcre_jit_exec(const pcre *, const pcre_extra *,
|
|
||||||
PCRE_SPTR, int, int, int, int *, int,
|
|
||||||
pcre_jit_stack *);
|
|
||||||
PCRE_EXP_DECL int pcre16_jit_exec(const pcre16 *, const pcre16_extra *,
|
|
||||||
PCRE_SPTR16, int, int, int, int *, int,
|
|
||||||
pcre16_jit_stack *);
|
|
||||||
PCRE_EXP_DECL int pcre32_jit_exec(const pcre32 *, const pcre32_extra *,
|
|
||||||
PCRE_SPTR32, int, int, int, int *, int,
|
|
||||||
pcre32_jit_stack *);
|
|
||||||
PCRE_EXP_DECL void pcre_free_substring(const char *);
|
|
||||||
PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16);
|
|
||||||
PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32);
|
|
||||||
PCRE_EXP_DECL void pcre_free_substring_list(const char **);
|
|
||||||
PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *);
|
|
||||||
PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *);
|
|
||||||
PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int,
|
|
||||||
void *);
|
|
||||||
PCRE_EXP_DECL int pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int,
|
|
||||||
void *);
|
|
||||||
PCRE_EXP_DECL int pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int,
|
|
||||||
void *);
|
|
||||||
PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *,
|
|
||||||
int *, int, const char *, const char **);
|
|
||||||
PCRE_EXP_DECL int pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16,
|
|
||||||
int *, int, PCRE_SPTR16, PCRE_SPTR16 *);
|
|
||||||
PCRE_EXP_DECL int pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32,
|
|
||||||
int *, int, PCRE_SPTR32, PCRE_SPTR32 *);
|
|
||||||
PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *);
|
|
||||||
PCRE_EXP_DECL int pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16);
|
|
||||||
PCRE_EXP_DECL int pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32);
|
|
||||||
PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *,
|
|
||||||
char **, char **);
|
|
||||||
PCRE_EXP_DECL int pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16,
|
|
||||||
PCRE_UCHAR16 **, PCRE_UCHAR16 **);
|
|
||||||
PCRE_EXP_DECL int pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32,
|
|
||||||
PCRE_UCHAR32 **, PCRE_UCHAR32 **);
|
|
||||||
PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int,
|
|
||||||
const char **);
|
|
||||||
PCRE_EXP_DECL int pcre16_get_substring(PCRE_SPTR16, int *, int, int,
|
|
||||||
PCRE_SPTR16 *);
|
|
||||||
PCRE_EXP_DECL int pcre32_get_substring(PCRE_SPTR32, int *, int, int,
|
|
||||||
PCRE_SPTR32 *);
|
|
||||||
PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int,
|
|
||||||
const char ***);
|
|
||||||
PCRE_EXP_DECL int pcre16_get_substring_list(PCRE_SPTR16, int *, int,
|
|
||||||
PCRE_SPTR16 **);
|
|
||||||
PCRE_EXP_DECL int pcre32_get_substring_list(PCRE_SPTR32, int *, int,
|
|
||||||
PCRE_SPTR32 **);
|
|
||||||
PCRE_EXP_DECL const unsigned char *pcre_maketables(void);
|
|
||||||
PCRE_EXP_DECL const unsigned char *pcre16_maketables(void);
|
|
||||||
PCRE_EXP_DECL const unsigned char *pcre32_maketables(void);
|
|
||||||
PCRE_EXP_DECL int pcre_refcount(pcre *, int);
|
|
||||||
PCRE_EXP_DECL int pcre16_refcount(pcre16 *, int);
|
|
||||||
PCRE_EXP_DECL int pcre32_refcount(pcre32 *, int);
|
|
||||||
PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);
|
|
||||||
PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **);
|
|
||||||
PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **);
|
|
||||||
PCRE_EXP_DECL void pcre_free_study(pcre_extra *);
|
|
||||||
PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *);
|
|
||||||
PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *);
|
|
||||||
PCRE_EXP_DECL const char *pcre_version(void);
|
|
||||||
PCRE_EXP_DECL const char *pcre16_version(void);
|
|
||||||
PCRE_EXP_DECL const char *pcre32_version(void);
|
|
||||||
|
|
||||||
/* Utility functions for byte order swaps. */
|
|
||||||
PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *, pcre_extra *,
|
|
||||||
const unsigned char *);
|
|
||||||
PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *,
|
|
||||||
const unsigned char *);
|
|
||||||
PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *,
|
|
||||||
const unsigned char *);
|
|
||||||
PCRE_EXP_DECL int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *,
|
|
||||||
PCRE_SPTR16, int, int *, int);
|
|
||||||
PCRE_EXP_DECL int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *,
|
|
||||||
PCRE_SPTR32, int, int *, int);
|
|
||||||
|
|
||||||
/* JIT compiler related functions. */
|
|
||||||
|
|
||||||
PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int);
|
|
||||||
PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int);
|
|
||||||
PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int);
|
|
||||||
PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *);
|
|
||||||
PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *);
|
|
||||||
PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *);
|
|
||||||
PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *,
|
|
||||||
pcre_jit_callback, void *);
|
|
||||||
PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *,
|
|
||||||
pcre16_jit_callback, void *);
|
|
||||||
PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *,
|
|
||||||
pcre32_jit_callback, void *);
|
|
||||||
PCRE_EXP_DECL void pcre_jit_free_unused_memory(void);
|
|
||||||
PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void);
|
|
||||||
PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* End of pcre.h */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,191 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2012 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(). */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Keep the original link size. */
|
|
||||||
static int real_link_size = LINK_SIZE;
|
|
||||||
|
|
||||||
#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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_config(int what, void *where)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_config(int what, void *where)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_config(int what, void *where)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
switch (what)
|
|
||||||
{
|
|
||||||
case PCRE_CONFIG_UTF8:
|
|
||||||
#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
|
|
||||||
*((int *)where) = 0;
|
|
||||||
return PCRE_ERROR_BADOPTION;
|
|
||||||
#else
|
|
||||||
#if defined SUPPORT_UTF
|
|
||||||
*((int *)where) = 1;
|
|
||||||
#else
|
|
||||||
*((int *)where) = 0;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case PCRE_CONFIG_UTF16:
|
|
||||||
#if defined COMPILE_PCRE8 || defined COMPILE_PCRE32
|
|
||||||
*((int *)where) = 0;
|
|
||||||
return PCRE_ERROR_BADOPTION;
|
|
||||||
#else
|
|
||||||
#if defined SUPPORT_UTF
|
|
||||||
*((int *)where) = 1;
|
|
||||||
#else
|
|
||||||
*((int *)where) = 0;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case PCRE_CONFIG_UTF32:
|
|
||||||
#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
|
|
||||||
*((int *)where) = 0;
|
|
||||||
return PCRE_ERROR_BADOPTION;
|
|
||||||
#else
|
|
||||||
#if defined SUPPORT_UTF
|
|
||||||
*((int *)where) = 1;
|
|
||||||
#else
|
|
||||||
*((int *)where) = 0;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case PCRE_CONFIG_UNICODE_PROPERTIES:
|
|
||||||
#ifdef SUPPORT_UCP
|
|
||||||
*((int *)where) = 1;
|
|
||||||
#else
|
|
||||||
*((int *)where) = 0;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_JIT:
|
|
||||||
#ifdef SUPPORT_JIT
|
|
||||||
*((int *)where) = 1;
|
|
||||||
#else
|
|
||||||
*((int *)where) = 0;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_JITTARGET:
|
|
||||||
#ifdef SUPPORT_JIT
|
|
||||||
*((const char **)where) = PRIV(jit_get_target)();
|
|
||||||
#else
|
|
||||||
*((const char **)where) = NULL;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_NEWLINE:
|
|
||||||
*((int *)where) = NEWLINE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_BSR:
|
|
||||||
#ifdef BSR_ANYCRLF
|
|
||||||
*((int *)where) = 1;
|
|
||||||
#else
|
|
||||||
*((int *)where) = 0;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_LINK_SIZE:
|
|
||||||
*((int *)where) = real_link_size;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:
|
|
||||||
*((int *)where) = POSIX_MALLOC_THRESHOLD;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_PARENS_LIMIT:
|
|
||||||
*((unsigned long int *)where) = PARENS_NEST_LIMIT;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_MATCH_LIMIT:
|
|
||||||
*((unsigned long int *)where) = MATCH_LIMIT;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_CONFIG_MATCH_LIMIT_RECURSION:
|
|
||||||
*((unsigned long int *)where) = MATCH_LIMIT_RECURSION;
|
|
||||||
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 */
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,246 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2013 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. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data,
|
|
||||||
int what, void *where)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_fullinfo(const pcre16 *argument_re, const pcre16_extra *extra_data,
|
|
||||||
int what, void *where)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_fullinfo(const pcre32 *argument_re, const pcre32_extra *extra_data,
|
|
||||||
int what, void *where)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
|
|
||||||
/* Check that the first field in the block is the magic number. If it is not,
|
|
||||||
return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to
|
|
||||||
REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which
|
|
||||||
means that the pattern is likely compiled with different endianness. */
|
|
||||||
|
|
||||||
if (re->magic_number != MAGIC_NUMBER)
|
|
||||||
return re->magic_number == REVERSED_MAGIC_NUMBER?
|
|
||||||
PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;
|
|
||||||
|
|
||||||
/* Check that this pattern was compiled in the correct bit mode */
|
|
||||||
|
|
||||||
if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
|
|
||||||
|
|
||||||
switch (what)
|
|
||||||
{
|
|
||||||
case PCRE_INFO_OPTIONS:
|
|
||||||
*((unsigned long int *)where) = re->options & PUBLIC_COMPILE_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_JITSIZE:
|
|
||||||
#ifdef SUPPORT_JIT
|
|
||||||
*((size_t *)where) =
|
|
||||||
(extra_data != NULL &&
|
|
||||||
(extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
|
|
||||||
extra_data->executable_jit != NULL)?
|
|
||||||
PRIV(jit_get_size)(extra_data->executable_jit) : 0;
|
|
||||||
#else
|
|
||||||
*((size_t *)where) = 0;
|
|
||||||
#endif
|
|
||||||
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->flags & PCRE_FIRSTSET) != 0)? (int)re->first_char :
|
|
||||||
((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_FIRSTCHARACTER:
|
|
||||||
*((pcre_uint32 *)where) =
|
|
||||||
(re->flags & PCRE_FIRSTSET) != 0 ? re->first_char : 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_FIRSTCHARACTERFLAGS:
|
|
||||||
*((int *)where) =
|
|
||||||
((re->flags & PCRE_FIRSTSET) != 0) ? 1 :
|
|
||||||
((re->flags & PCRE_STARTLINE) != 0) ? 2 : 0;
|
|
||||||
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 pcre_uint8 **)where) =
|
|
||||||
(study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)?
|
|
||||||
((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_MINLENGTH:
|
|
||||||
*((int *)where) =
|
|
||||||
(study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)?
|
|
||||||
(int)(study->minlength) : -1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_JIT:
|
|
||||||
*((int *)where) = extra_data != NULL &&
|
|
||||||
(extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
|
|
||||||
extra_data->executable_jit != NULL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_LASTLITERAL:
|
|
||||||
*((int *)where) =
|
|
||||||
((re->flags & PCRE_REQCHSET) != 0)? (int)re->req_char : -1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_REQUIREDCHAR:
|
|
||||||
*((pcre_uint32 *)where) =
|
|
||||||
((re->flags & PCRE_REQCHSET) != 0) ? re->req_char : 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_REQUIREDCHARFLAGS:
|
|
||||||
*((int *)where) =
|
|
||||||
((re->flags & PCRE_REQCHSET) != 0);
|
|
||||||
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 pcre_uchar **)where) = (const pcre_uchar *)re + re->name_table_offset;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_DEFAULT_TABLES:
|
|
||||||
*((const pcre_uint8 **)where) = (const pcre_uint8 *)(PRIV(default_tables));
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* From release 8.00 this will always return TRUE because NOPARTIAL is
|
|
||||||
no longer ever set (the restrictions have been removed). */
|
|
||||||
|
|
||||||
case PCRE_INFO_OKPARTIAL:
|
|
||||||
*((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_JCHANGED:
|
|
||||||
*((int *)where) = (re->flags & PCRE_JCHANGED) != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_HASCRORLF:
|
|
||||||
*((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_MAXLOOKBEHIND:
|
|
||||||
*((int *)where) = re->max_lookbehind;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_MATCHLIMIT:
|
|
||||||
if ((re->flags & PCRE_MLSET) == 0) return PCRE_ERROR_UNSET;
|
|
||||||
*((pcre_uint32 *)where) = re->limit_match;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_RECURSIONLIMIT:
|
|
||||||
if ((re->flags & PCRE_RLSET) == 0) return PCRE_ERROR_UNSET;
|
|
||||||
*((pcre_uint32 *)where) = re->limit_recursion;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCRE_INFO_MATCH_EMPTY:
|
|
||||||
*((int *)where) = (re->flags & PCRE_MATCH_EMPTY) != 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: return PCRE_ERROR_BADOPTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_fullinfo.c */
|
|
||||||
@ -1,670 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2012 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 convenience functions for extracting substrings
|
|
||||||
from the subject string after a regex match has succeeded. The original idea
|
|
||||||
for these functions came from Scott Wimer. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Find number for named string *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function is used by the get_first_set() function below, as well
|
|
||||||
as being generally available. It assumes that names are unique.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
code the compiled regex
|
|
||||||
stringname the name whose number is required
|
|
||||||
|
|
||||||
Returns: the number of the named parentheses, or a negative number
|
|
||||||
(PCRE_ERROR_NOSUBSTRING) if not found
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_get_stringnumber(const pcre *code, const char *stringname)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_get_stringnumber(const pcre32 *code, PCRE_SPTR32 stringname)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
int entrysize;
|
|
||||||
int top, bot;
|
|
||||||
pcre_uchar *nametable;
|
|
||||||
|
|
||||||
#ifdef COMPILE_PCRE8
|
|
||||||
if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
|
|
||||||
return rc;
|
|
||||||
if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
|
|
||||||
if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
|
|
||||||
return rc;
|
|
||||||
if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
|
|
||||||
return rc;
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILE_PCRE16
|
|
||||||
if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
|
|
||||||
return rc;
|
|
||||||
if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
|
|
||||||
if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
|
|
||||||
return rc;
|
|
||||||
if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
|
|
||||||
return rc;
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILE_PCRE32
|
|
||||||
if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
|
|
||||||
return rc;
|
|
||||||
if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
|
|
||||||
if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
|
|
||||||
return rc;
|
|
||||||
if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
|
|
||||||
return rc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bot = 0;
|
|
||||||
while (top > bot)
|
|
||||||
{
|
|
||||||
int mid = (top + bot) / 2;
|
|
||||||
pcre_uchar *entry = nametable + entrysize*mid;
|
|
||||||
int c = STRCMP_UC_UC((pcre_uchar *)stringname,
|
|
||||||
(pcre_uchar *)(entry + IMM2_SIZE));
|
|
||||||
if (c == 0) return GET2(entry, 0);
|
|
||||||
if (c > 0) bot = mid + 1; else top = mid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Find (multiple) entries for named string *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This is used by the get_first_set() function below, as well as being
|
|
||||||
generally available. It is used when duplicated names are permitted.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
code the compiled regex
|
|
||||||
stringname the name whose entries required
|
|
||||||
firstptr where to put the pointer to the first entry
|
|
||||||
lastptr where to put the pointer to the last entry
|
|
||||||
|
|
||||||
Returns: the length of each entry, or a negative number
|
|
||||||
(PCRE_ERROR_NOSUBSTRING) if not found
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_get_stringtable_entries(const pcre *code, const char *stringname,
|
|
||||||
char **firstptr, char **lastptr)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname,
|
|
||||||
PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_get_stringtable_entries(const pcre32 *code, PCRE_SPTR32 stringname,
|
|
||||||
PCRE_UCHAR32 **firstptr, PCRE_UCHAR32 **lastptr)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
int entrysize;
|
|
||||||
int top, bot;
|
|
||||||
pcre_uchar *nametable, *lastentry;
|
|
||||||
|
|
||||||
#ifdef COMPILE_PCRE8
|
|
||||||
if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
|
|
||||||
return rc;
|
|
||||||
if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
|
|
||||||
if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
|
|
||||||
return rc;
|
|
||||||
if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
|
|
||||||
return rc;
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILE_PCRE16
|
|
||||||
if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
|
|
||||||
return rc;
|
|
||||||
if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
|
|
||||||
if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
|
|
||||||
return rc;
|
|
||||||
if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
|
|
||||||
return rc;
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILE_PCRE32
|
|
||||||
if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
|
|
||||||
return rc;
|
|
||||||
if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
|
|
||||||
if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
|
|
||||||
return rc;
|
|
||||||
if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
|
|
||||||
return rc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
lastentry = nametable + entrysize * (top - 1);
|
|
||||||
bot = 0;
|
|
||||||
while (top > bot)
|
|
||||||
{
|
|
||||||
int mid = (top + bot) / 2;
|
|
||||||
pcre_uchar *entry = nametable + entrysize*mid;
|
|
||||||
int c = STRCMP_UC_UC((pcre_uchar *)stringname,
|
|
||||||
(pcre_uchar *)(entry + IMM2_SIZE));
|
|
||||||
if (c == 0)
|
|
||||||
{
|
|
||||||
pcre_uchar *first = entry;
|
|
||||||
pcre_uchar *last = entry;
|
|
||||||
while (first > nametable)
|
|
||||||
{
|
|
||||||
if (STRCMP_UC_UC((pcre_uchar *)stringname,
|
|
||||||
(pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break;
|
|
||||||
first -= entrysize;
|
|
||||||
}
|
|
||||||
while (last < lastentry)
|
|
||||||
{
|
|
||||||
if (STRCMP_UC_UC((pcre_uchar *)stringname,
|
|
||||||
(pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break;
|
|
||||||
last += entrysize;
|
|
||||||
}
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
*firstptr = (char *)first;
|
|
||||||
*lastptr = (char *)last;
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
*firstptr = (PCRE_UCHAR16 *)first;
|
|
||||||
*lastptr = (PCRE_UCHAR16 *)last;
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
*firstptr = (PCRE_UCHAR32 *)first;
|
|
||||||
*lastptr = (PCRE_UCHAR32 *)last;
|
|
||||||
#endif
|
|
||||||
return entrysize;
|
|
||||||
}
|
|
||||||
if (c > 0) bot = mid + 1; else top = mid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Find first set of multiple named strings *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function allows for duplicate names in the table of named substrings.
|
|
||||||
It returns the number of the first one that was set in a pattern match.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
code the compiled regex
|
|
||||||
stringname the name of the capturing substring
|
|
||||||
ovector the vector of matched substrings
|
|
||||||
stringcount number of captured substrings
|
|
||||||
|
|
||||||
Returns: the number of the first that is set,
|
|
||||||
or the number of the last one if none are set,
|
|
||||||
or a negative number on error
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
static int
|
|
||||||
get_first_set(const pcre *code, const char *stringname, int *ovector,
|
|
||||||
int stringcount)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
static int
|
|
||||||
get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector,
|
|
||||||
int stringcount)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
static int
|
|
||||||
get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector,
|
|
||||||
int stringcount)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
const REAL_PCRE *re = (const REAL_PCRE *)code;
|
|
||||||
int entrysize;
|
|
||||||
pcre_uchar *entry;
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
char *first, *last;
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_UCHAR16 *first, *last;
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_UCHAR32 *first, *last;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
|
|
||||||
return pcre_get_stringnumber(code, stringname);
|
|
||||||
entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
|
|
||||||
return pcre16_get_stringnumber(code, stringname);
|
|
||||||
entrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last);
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
|
|
||||||
return pcre32_get_stringnumber(code, stringname);
|
|
||||||
entrysize = pcre32_get_stringtable_entries(code, stringname, &first, &last);
|
|
||||||
#endif
|
|
||||||
if (entrysize <= 0) return entrysize;
|
|
||||||
for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)
|
|
||||||
{
|
|
||||||
int n = GET2(entry, 0);
|
|
||||||
if (n < stringcount && ovector[n*2] >= 0) return n;
|
|
||||||
}
|
|
||||||
return GET2(entry, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Copy captured string to given buffer *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function copies a single captured substring into a given buffer.
|
|
||||||
Note that we use memcpy() rather than strncpy() in case there are binary zeros
|
|
||||||
in the string.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
subject the subject string that was matched
|
|
||||||
ovector pointer to the offsets table
|
|
||||||
stringcount the number of substrings that were captured
|
|
||||||
(i.e. the yield of the pcre_exec call, unless
|
|
||||||
that was zero, in which case it should be 1/3
|
|
||||||
of the offset table size)
|
|
||||||
stringnumber the number of the required substring
|
|
||||||
buffer where to put the substring
|
|
||||||
size the size of the buffer
|
|
||||||
|
|
||||||
Returns: if successful:
|
|
||||||
the length of the copied string, not including the zero
|
|
||||||
that is put on the end; can be zero
|
|
||||||
if not successful:
|
|
||||||
PCRE_ERROR_NOMEMORY (-6) buffer too small
|
|
||||||
PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_copy_substring(const char *subject, int *ovector, int stringcount,
|
|
||||||
int stringnumber, char *buffer, int size)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
|
|
||||||
int stringnumber, PCRE_UCHAR16 *buffer, int size)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
|
|
||||||
int stringnumber, PCRE_UCHAR32 *buffer, int size)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int yield;
|
|
||||||
if (stringnumber < 0 || stringnumber >= stringcount)
|
|
||||||
return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
stringnumber *= 2;
|
|
||||||
yield = ovector[stringnumber+1] - ovector[stringnumber];
|
|
||||||
if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
|
|
||||||
memcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield));
|
|
||||||
buffer[yield] = 0;
|
|
||||||
return yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Copy named captured string to given buffer *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function copies a single captured substring into a given buffer,
|
|
||||||
identifying it by name. If the regex permits duplicate names, the first
|
|
||||||
substring that is set is chosen.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
code the compiled regex
|
|
||||||
subject the subject string that was matched
|
|
||||||
ovector pointer to the offsets table
|
|
||||||
stringcount the number of substrings that were captured
|
|
||||||
(i.e. the yield of the pcre_exec call, unless
|
|
||||||
that was zero, in which case it should be 1/3
|
|
||||||
of the offset table size)
|
|
||||||
stringname the name of the required substring
|
|
||||||
buffer where to put the substring
|
|
||||||
size the size of the buffer
|
|
||||||
|
|
||||||
Returns: if successful:
|
|
||||||
the length of the copied string, not including the zero
|
|
||||||
that is put on the end; can be zero
|
|
||||||
if not successful:
|
|
||||||
PCRE_ERROR_NOMEMORY (-6) buffer too small
|
|
||||||
PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_copy_named_substring(const pcre *code, const char *subject,
|
|
||||||
int *ovector, int stringcount, const char *stringname,
|
|
||||||
char *buffer, int size)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
|
|
||||||
int *ovector, int stringcount, PCRE_SPTR16 stringname,
|
|
||||||
PCRE_UCHAR16 *buffer, int size)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
|
|
||||||
int *ovector, int stringcount, PCRE_SPTR32 stringname,
|
|
||||||
PCRE_UCHAR32 *buffer, int size)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int n = get_first_set(code, stringname, ovector, stringcount);
|
|
||||||
if (n <= 0) return n;
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size);
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
return pcre32_copy_substring(subject, ovector, stringcount, n, buffer, size);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Copy all captured strings to new store *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function gets one chunk of store and builds a list of pointers and all
|
|
||||||
of the captured substrings in it. A NULL pointer is put on the end of the list.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
subject the subject string that was matched
|
|
||||||
ovector pointer to the offsets table
|
|
||||||
stringcount the number of substrings that were captured
|
|
||||||
(i.e. the yield of the pcre_exec call, unless
|
|
||||||
that was zero, in which case it should be 1/3
|
|
||||||
of the offset table size)
|
|
||||||
listptr set to point to the list of pointers
|
|
||||||
|
|
||||||
Returns: if successful: 0
|
|
||||||
if not successful:
|
|
||||||
PCRE_ERROR_NOMEMORY (-6) failed to get store
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
|
|
||||||
const char ***listptr)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount,
|
|
||||||
PCRE_SPTR16 **listptr)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_get_substring_list(PCRE_SPTR32 subject, int *ovector, int stringcount,
|
|
||||||
PCRE_SPTR32 **listptr)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int size = sizeof(pcre_uchar *);
|
|
||||||
int double_count = stringcount * 2;
|
|
||||||
pcre_uchar **stringlist;
|
|
||||||
pcre_uchar *p;
|
|
||||||
|
|
||||||
for (i = 0; i < double_count; i += 2)
|
|
||||||
{
|
|
||||||
size += sizeof(pcre_uchar *) + IN_UCHARS(1);
|
|
||||||
if (ovector[i+1] > ovector[i]) size += IN_UCHARS(ovector[i+1] - ovector[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
stringlist = (pcre_uchar **)(PUBL(malloc))(size);
|
|
||||||
if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
*listptr = (const char **)stringlist;
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
*listptr = (PCRE_SPTR16 *)stringlist;
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
*listptr = (PCRE_SPTR32 *)stringlist;
|
|
||||||
#endif
|
|
||||||
p = (pcre_uchar *)(stringlist + stringcount + 1);
|
|
||||||
|
|
||||||
for (i = 0; i < double_count; i += 2)
|
|
||||||
{
|
|
||||||
int len = (ovector[i+1] > ovector[i])? (ovector[i+1] - ovector[i]) : 0;
|
|
||||||
memcpy(p, subject + ovector[i], IN_UCHARS(len));
|
|
||||||
*stringlist++ = p;
|
|
||||||
p += len;
|
|
||||||
*p++ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*stringlist = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Free store obtained by get_substring_list *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function exists for the benefit of people calling PCRE from non-C
|
|
||||||
programs that can call its functions, but not free() or (PUBL(free))()
|
|
||||||
directly.
|
|
||||||
|
|
||||||
Argument: the result of a previous pcre_get_substring_list()
|
|
||||||
Returns: nothing
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
|
|
||||||
pcre_free_substring_list(const char **pointer)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
|
|
||||||
pcre16_free_substring_list(PCRE_SPTR16 *pointer)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
|
|
||||||
pcre32_free_substring_list(PCRE_SPTR32 *pointer)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
(PUBL(free))((void *)pointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Copy captured string to new store *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function copies a single captured substring into a piece of new
|
|
||||||
store
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
subject the subject string that was matched
|
|
||||||
ovector pointer to the offsets table
|
|
||||||
stringcount the number of substrings that were captured
|
|
||||||
(i.e. the yield of the pcre_exec call, unless
|
|
||||||
that was zero, in which case it should be 1/3
|
|
||||||
of the offset table size)
|
|
||||||
stringnumber the number of the required substring
|
|
||||||
stringptr where to put a pointer to the substring
|
|
||||||
|
|
||||||
Returns: if successful:
|
|
||||||
the length of the string, not including the zero that
|
|
||||||
is put on the end; can be zero
|
|
||||||
if not successful:
|
|
||||||
PCRE_ERROR_NOMEMORY (-6) failed to get store
|
|
||||||
PCRE_ERROR_NOSUBSTRING (-7) substring not present
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_get_substring(const char *subject, int *ovector, int stringcount,
|
|
||||||
int stringnumber, const char **stringptr)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
|
|
||||||
int stringnumber, PCRE_SPTR16 *stringptr)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
|
|
||||||
int stringnumber, PCRE_SPTR32 *stringptr)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int yield;
|
|
||||||
pcre_uchar *substring;
|
|
||||||
if (stringnumber < 0 || stringnumber >= stringcount)
|
|
||||||
return PCRE_ERROR_NOSUBSTRING;
|
|
||||||
stringnumber *= 2;
|
|
||||||
yield = ovector[stringnumber+1] - ovector[stringnumber];
|
|
||||||
substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1));
|
|
||||||
if (substring == NULL) return PCRE_ERROR_NOMEMORY;
|
|
||||||
memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield));
|
|
||||||
substring[yield] = 0;
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
*stringptr = (const char *)substring;
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
*stringptr = (PCRE_SPTR16)substring;
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
*stringptr = (PCRE_SPTR32)substring;
|
|
||||||
#endif
|
|
||||||
return yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Copy named captured string to new store *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function copies a single captured substring, identified by name, into
|
|
||||||
new store. If the regex permits duplicate names, the first substring that is
|
|
||||||
set is chosen.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
code the compiled regex
|
|
||||||
subject the subject string that was matched
|
|
||||||
ovector pointer to the offsets table
|
|
||||||
stringcount the number of substrings that were captured
|
|
||||||
(i.e. the yield of the pcre_exec call, unless
|
|
||||||
that was zero, in which case it should be 1/3
|
|
||||||
of the offset table size)
|
|
||||||
stringname the name of the required substring
|
|
||||||
stringptr where to put the pointer
|
|
||||||
|
|
||||||
Returns: if successful:
|
|
||||||
the length of the copied string, not including the zero
|
|
||||||
that is put on the end; can be zero
|
|
||||||
if not successful:
|
|
||||||
PCRE_ERROR_NOMEMORY (-6) couldn't get memory
|
|
||||||
PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_get_named_substring(const pcre *code, const char *subject,
|
|
||||||
int *ovector, int stringcount, const char *stringname,
|
|
||||||
const char **stringptr)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
|
|
||||||
int *ovector, int stringcount, PCRE_SPTR16 stringname,
|
|
||||||
PCRE_SPTR16 *stringptr)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
|
|
||||||
int *ovector, int stringcount, PCRE_SPTR32 stringname,
|
|
||||||
PCRE_SPTR32 *stringptr)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int n = get_first_set(code, stringname, ovector, stringcount);
|
|
||||||
if (n <= 0) return n;
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
return pcre16_get_substring(subject, ovector, stringcount, n, stringptr);
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
return pcre32_get_substring(subject, ovector, stringcount, n, stringptr);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Free store obtained by get_substring *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function exists for the benefit of people calling PCRE from non-C
|
|
||||||
programs that can call its functions, but not free() or (PUBL(free))()
|
|
||||||
directly.
|
|
||||||
|
|
||||||
Argument: the result of a previous pcre_get_substring()
|
|
||||||
Returns: nothing
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
|
|
||||||
pcre_free_substring(const char *pointer)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
|
|
||||||
pcre16_free_substring(PCRE_SPTR16 pointer)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
|
|
||||||
pcre32_free_substring(PCRE_SPTR32 pointer)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
(PUBL(free))((void *)pointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_get.c */
|
|
||||||
@ -1,87 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2014 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.
|
|
||||||
|
|
||||||
For MS Visual Studio and Symbian OS, there are problems in initializing these
|
|
||||||
variables to non-local functions. In these cases, therefore, an indirection via
|
|
||||||
a local function is used.
|
|
||||||
|
|
||||||
Also, when compiling for Virtual Pascal, things are done differently, and
|
|
||||||
global variables are not used. */
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
#if defined _MSC_VER || defined __SYMBIAN32__
|
|
||||||
static void* LocalPcreMalloc(size_t aSize)
|
|
||||||
{
|
|
||||||
return malloc(aSize);
|
|
||||||
}
|
|
||||||
static void LocalPcreFree(void* aPtr)
|
|
||||||
{
|
|
||||||
free(aPtr);
|
|
||||||
}
|
|
||||||
PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = LocalPcreMalloc;
|
|
||||||
PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = LocalPcreFree;
|
|
||||||
PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = LocalPcreMalloc;
|
|
||||||
PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = LocalPcreFree;
|
|
||||||
PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL;
|
|
||||||
PCRE_EXP_DATA_DEFN int (*PUBL(stack_guard))(void) = NULL;
|
|
||||||
|
|
||||||
#elif !defined VPCOMPAT
|
|
||||||
PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = malloc;
|
|
||||||
PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = free;
|
|
||||||
PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = malloc;
|
|
||||||
PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = free;
|
|
||||||
PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL;
|
|
||||||
PCRE_EXP_DATA_DEFN int (*PUBL(stack_guard))(void) = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* End of pcre_globals.c */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,144 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2007 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_maketables(), which builds
|
|
||||||
character tables for PCRE in the current locale. The file is compiled on its
|
|
||||||
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
|
|
||||||
# ifdef HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
|
||||||
# endif
|
|
||||||
# include "pcre_internal.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Create PCRE character tables *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function builds a set of character tables for use by PCRE and returns
|
|
||||||
a pointer to them. They are build using the ctype functions, and consequently
|
|
||||||
their contents will depend upon the current locale setting. When compiled as
|
|
||||||
part of the library, the store is obtained via pcre_malloc(), but when compiled
|
|
||||||
inside dftables, use malloc().
|
|
||||||
|
|
||||||
Arguments: none
|
|
||||||
Returns: pointer to the contiguous block of data
|
|
||||||
*/
|
|
||||||
|
|
||||||
const unsigned char *
|
|
||||||
pcre_maketables(void)
|
|
||||||
{
|
|
||||||
unsigned char *yield, *p;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
#ifndef DFTABLES
|
|
||||||
yield = (unsigned char*)(pcre_malloc)(tables_length);
|
|
||||||
#else
|
|
||||||
yield = (unsigned char*)malloc(tables_length);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (yield == NULL) return NULL;
|
|
||||||
p = yield;
|
|
||||||
|
|
||||||
/* First comes the lower casing table */
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) *p++ = tolower(i);
|
|
||||||
|
|
||||||
/* Next the case-flipping table */
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
|
|
||||||
|
|
||||||
/* Then the character class tables. Don't try to be clever and save effort on
|
|
||||||
exclusive ones - in some locales things may be different. Note that the table
|
|
||||||
for "space" includes everything "isspace" gives, including VT in the default
|
|
||||||
locale. This makes it work for the POSIX class [:space:]. Note also that it is
|
|
||||||
possible for a character to be alnum or alpha without being lower or upper,
|
|
||||||
such as "male and female ordinals" (\xAA and \xBA) in the fr_FR locale (at
|
|
||||||
least under Debian Linux's locales as of 12/2005). So we must test for alnum
|
|
||||||
specially. */
|
|
||||||
|
|
||||||
memset(p, 0, cbit_length);
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
if (isdigit(i)) p[cbit_digit + i/8] |= 1 << (i&7);
|
|
||||||
if (isupper(i)) p[cbit_upper + i/8] |= 1 << (i&7);
|
|
||||||
if (islower(i)) p[cbit_lower + i/8] |= 1 << (i&7);
|
|
||||||
if (isalnum(i)) p[cbit_word + i/8] |= 1 << (i&7);
|
|
||||||
if (i == '_') p[cbit_word + i/8] |= 1 << (i&7);
|
|
||||||
if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7);
|
|
||||||
if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
|
|
||||||
if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7);
|
|
||||||
if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7);
|
|
||||||
if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7);
|
|
||||||
if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7);
|
|
||||||
}
|
|
||||||
p += cbit_length;
|
|
||||||
|
|
||||||
/* Finally, the character type table. In this, we exclude VT from the white
|
|
||||||
space chars, because Perl doesn't recognize it as such for \s and for comments
|
|
||||||
within regexes. */
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
int x = 0;
|
|
||||||
if (i != 0x0b && isspace(i)) x += ctype_space;
|
|
||||||
if (isalpha(i)) x += ctype_letter;
|
|
||||||
if (isdigit(i)) x += ctype_digit;
|
|
||||||
if (isxdigit(i)) x += ctype_xdigit;
|
|
||||||
if (isalnum(i) || i == '_') x += ctype_word;
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_maketables.c */
|
|
||||||
@ -1,211 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2012 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 internal functions for testing newlines when more than
|
|
||||||
one kind of newline is to be recognized. When a newline is found, its length is
|
|
||||||
returned. In principle, we could implement several newline "types", each
|
|
||||||
referring to a different set of newline characters. At present, PCRE supports
|
|
||||||
only NLTYPE_FIXED, which gets handled without these functions, NLTYPE_ANYCRLF,
|
|
||||||
and NLTYPE_ANY. The full list of Unicode newline characters is taken from
|
|
||||||
http://unicode.org/unicode/reports/tr18/. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Check for newline at given position *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* It is guaranteed that the initial value of ptr is less than the end of the
|
|
||||||
string that is being processed.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ptr pointer to possible newline
|
|
||||||
type the newline type
|
|
||||||
endptr pointer to the end of the string
|
|
||||||
lenptr where to return the length
|
|
||||||
utf TRUE if in utf mode
|
|
||||||
|
|
||||||
Returns: TRUE or FALSE
|
|
||||||
*/
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
PRIV(is_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR endptr, int *lenptr,
|
|
||||||
BOOL utf)
|
|
||||||
{
|
|
||||||
pcre_uint32 c;
|
|
||||||
(void)utf;
|
|
||||||
#ifdef SUPPORT_UTF
|
|
||||||
if (utf)
|
|
||||||
{
|
|
||||||
GETCHAR(c, ptr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif /* SUPPORT_UTF */
|
|
||||||
c = *ptr;
|
|
||||||
|
|
||||||
/* Note that this function is called only for ANY or ANYCRLF. */
|
|
||||||
|
|
||||||
if (type == NLTYPE_ANYCRLF) switch(c)
|
|
||||||
{
|
|
||||||
case CHAR_LF: *lenptr = 1; return TRUE;
|
|
||||||
case CHAR_CR: *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1;
|
|
||||||
return TRUE;
|
|
||||||
default: return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NLTYPE_ANY */
|
|
||||||
|
|
||||||
else switch(c)
|
|
||||||
{
|
|
||||||
#ifdef EBCDIC
|
|
||||||
case CHAR_NEL:
|
|
||||||
#endif
|
|
||||||
case CHAR_LF:
|
|
||||||
case CHAR_VT:
|
|
||||||
case CHAR_FF: *lenptr = 1; return TRUE;
|
|
||||||
|
|
||||||
case CHAR_CR:
|
|
||||||
*lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1;
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
#ifndef EBCDIC
|
|
||||||
#ifdef COMPILE_PCRE8
|
|
||||||
case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE;
|
|
||||||
case 0x2028: /* LS */
|
|
||||||
case 0x2029: *lenptr = 3; return TRUE; /* PS */
|
|
||||||
#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */
|
|
||||||
case CHAR_NEL:
|
|
||||||
case 0x2028: /* LS */
|
|
||||||
case 0x2029: *lenptr = 1; return TRUE; /* PS */
|
|
||||||
#endif /* COMPILE_PCRE8 */
|
|
||||||
#endif /* Not EBCDIC */
|
|
||||||
|
|
||||||
default: return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Check for newline at previous position *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* It is guaranteed that the initial value of ptr is greater than the start of
|
|
||||||
the string that is being processed.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ptr pointer to possible newline
|
|
||||||
type the newline type
|
|
||||||
startptr pointer to the start of the string
|
|
||||||
lenptr where to return the length
|
|
||||||
utf TRUE if in utf mode
|
|
||||||
|
|
||||||
Returns: TRUE or FALSE
|
|
||||||
*/
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
PRIV(was_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR startptr, int *lenptr,
|
|
||||||
BOOL utf)
|
|
||||||
{
|
|
||||||
pcre_uint32 c;
|
|
||||||
(void)utf;
|
|
||||||
ptr--;
|
|
||||||
#ifdef SUPPORT_UTF
|
|
||||||
if (utf)
|
|
||||||
{
|
|
||||||
BACKCHAR(ptr);
|
|
||||||
GETCHAR(c, ptr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif /* SUPPORT_UTF */
|
|
||||||
c = *ptr;
|
|
||||||
|
|
||||||
/* Note that this function is called only for ANY or ANYCRLF. */
|
|
||||||
|
|
||||||
if (type == NLTYPE_ANYCRLF) switch(c)
|
|
||||||
{
|
|
||||||
case CHAR_LF:
|
|
||||||
*lenptr = (ptr > startptr && ptr[-1] == CHAR_CR)? 2 : 1;
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
case CHAR_CR: *lenptr = 1; return TRUE;
|
|
||||||
default: return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NLTYPE_ANY */
|
|
||||||
|
|
||||||
else switch(c)
|
|
||||||
{
|
|
||||||
case CHAR_LF:
|
|
||||||
*lenptr = (ptr > startptr && ptr[-1] == CHAR_CR)? 2 : 1;
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
#ifdef EBCDIC
|
|
||||||
case CHAR_NEL:
|
|
||||||
#endif
|
|
||||||
case CHAR_VT:
|
|
||||||
case CHAR_FF:
|
|
||||||
case CHAR_CR: *lenptr = 1; return TRUE;
|
|
||||||
|
|
||||||
#ifndef EBCDIC
|
|
||||||
#ifdef COMPILE_PCRE8
|
|
||||||
case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE;
|
|
||||||
case 0x2028: /* LS */
|
|
||||||
case 0x2029: *lenptr = 3; return TRUE; /* PS */
|
|
||||||
#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */
|
|
||||||
case CHAR_NEL:
|
|
||||||
case 0x2028: /* LS */
|
|
||||||
case 0x2029: *lenptr = 1; return TRUE; /* PS */
|
|
||||||
#endif /* COMPILE_PCRE8 */
|
|
||||||
#endif /* NotEBCDIC */
|
|
||||||
|
|
||||||
default: return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_newline.c */
|
|
||||||
@ -1,95 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2012 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 file contains a private PCRE function that converts an ordinal
|
|
||||||
character value into a UTF8 string. */
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define COMPILE_PCRE8
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Convert character value to UTF-8 *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function takes an integer value in the range 0 - 0x10ffff
|
|
||||||
and encodes it as a UTF-8 character in 1 to 4 pcre_uchars.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
cvalue the character value
|
|
||||||
buffer pointer to buffer for result - at least 6 pcre_uchars long
|
|
||||||
|
|
||||||
Returns: number of characters placed in the buffer
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned
|
|
||||||
int
|
|
||||||
PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer)
|
|
||||||
{
|
|
||||||
#ifdef SUPPORT_UTF
|
|
||||||
|
|
||||||
register int i, j;
|
|
||||||
|
|
||||||
for (i = 0; i < PRIV(utf8_table1_size); i++)
|
|
||||||
if ((int)cvalue <= PRIV(utf8_table1)[i]) break;
|
|
||||||
buffer += i;
|
|
||||||
for (j = i; j > 0; j--)
|
|
||||||
{
|
|
||||||
*buffer-- = 0x80 | (cvalue & 0x3f);
|
|
||||||
cvalue >>= 6;
|
|
||||||
}
|
|
||||||
*buffer = PRIV(utf8_table2)[i] | cvalue;
|
|
||||||
return i + 1;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
(void)(cvalue); /* Keep compiler happy; this function won't ever be */
|
|
||||||
(void)(buffer); /* called when SUPPORT_UTF is not defined. */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_ord2utf8.c */
|
|
||||||
@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
#include "../../structures.h"
|
#include "../../structures.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#define PCRE_STATIC
|
#define PCRE2_CODE_UNIT_WIDTH 8
|
||||||
#include "pcre.h"
|
#include <pcre2.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -35,46 +35,76 @@ static struct filter pcre_first_filter = {
|
|||||||
|
|
||||||
static struct filter *pcre_last_filter;
|
static struct filter *pcre_last_filter;
|
||||||
static int pcre_loaded = 0;
|
static int pcre_loaded = 0;
|
||||||
static int pcre_options = 0;
|
static uint32_t pcre_options = 0;
|
||||||
|
|
||||||
static struct pcreopt {
|
static struct pcreopt {
|
||||||
char * name;
|
char * name;
|
||||||
int value;
|
uint32_t value;
|
||||||
} pcreopts[]= {
|
} pcreopts[]= {
|
||||||
|
|
||||||
{"PCRE_CASELESS", 0x00000001},
|
{"PCRE2_ALLOW_EMPTY_CLASS", PCRE2_ALLOW_EMPTY_CLASS},
|
||||||
{"PCRE_MULTILINE", 0x00000002},
|
{"PCRE2_ALT_BSUX", PCRE2_ALT_BSUX},
|
||||||
{"PCRE_DOTALL", 0x00000004},
|
{"PCRE2_AUTO_CALLOUT", PCRE2_AUTO_CALLOUT},
|
||||||
{"PCRE_EXTENDED", 0x00000008},
|
{"PCRE2_CASELESS", PCRE2_CASELESS},
|
||||||
{"PCRE_ANCHORED", 0x00000010},
|
{"PCRE2_DOLLAR_ENDONLY", PCRE2_DOLLAR_ENDONLY},
|
||||||
{"PCRE_DOLLAR_ENDONLY", 0x00000020},
|
{"PCRE2_DOTALL", PCRE2_DOTALL},
|
||||||
{"PCRE_EXTRA", 0x00000040},
|
{"PCRE2_DUPNAMES", PCRE2_DUPNAMES},
|
||||||
{"PCRE_NOTBOL", 0x00000080},
|
{"PCRE2_EXTENDED", PCRE2_EXTENDED},
|
||||||
{"PCRE_NOTEOL", 0x00000100},
|
{"PCRE2_FIRSTLINE", PCRE2_FIRSTLINE},
|
||||||
{"PCRE_UNGREEDY", 0x00000200},
|
{"PCRE2_MATCH_UNSET_BACKREF", PCRE2_MATCH_UNSET_BACKREF},
|
||||||
{"PCRE_NOTEMPTY", 0x00000400},
|
{"PCRE2_MULTILINE", PCRE2_MULTILINE},
|
||||||
{"PCRE_UTF8", 0x00000800},
|
{"PCRE2_NEVER_UCP", PCRE2_NEVER_UCP},
|
||||||
{"PCRE_NO_AUTO_CAPTURE", 0x00001000},
|
{"PCRE2_NEVER_UTF", PCRE2_NEVER_UTF},
|
||||||
{"PCRE_NO_UTF8_CHECK", 0x00002000},
|
{"PCRE2_NO_AUTO_CAPTURE", PCRE2_NO_AUTO_CAPTURE},
|
||||||
{"PCRE_AUTO_CALLOUT", 0x00004000},
|
{"PCRE2_NO_AUTO_POSSESS", PCRE2_NO_AUTO_POSSESS},
|
||||||
{"PCRE_PARTIAL", 0x00008000},
|
{"PCRE2_NO_DOTSTAR_ANCHOR", PCRE2_NO_DOTSTAR_ANCHOR},
|
||||||
{"PCRE_DFA_SHORTEST", 0x00010000},
|
{"PCRE2_NO_START_OPTIMIZE", PCRE2_NO_START_OPTIMIZE},
|
||||||
{"PCRE_DFA_RESTART", 0x00020000},
|
{"PCRE2_UCP", PCRE2_UCP},
|
||||||
{"PCRE_FIRSTLINE", 0x00040000},
|
{"PCRE2_UNGREEDY", PCRE2_UNGREEDY},
|
||||||
{"PCRE_DUPNAMES", 0x00080000},
|
{"PCRE2_UTF", PCRE2_UTF},
|
||||||
{"PCRE_NEWLINE_CR", 0x00100000},
|
{"PCRE2_NEVER_BACKSLASH_C", PCRE2_NEVER_BACKSLASH_C},
|
||||||
{"PCRE_NEWLINE_LF", 0x00200000},
|
{"PCRE2_ALT_CIRCUMFLEX", PCRE2_ALT_CIRCUMFLEX},
|
||||||
{"PCRE_NEWLINE_CRLF", 0x00300000},
|
{"PCRE2_ALT_VERBNAMES", PCRE2_ALT_VERBNAMES},
|
||||||
{"PCRE_NEWLINE_ANY", 0x00400000},
|
{"PCRE2_USE_OFFSET_LIMIT", PCRE2_USE_OFFSET_LIMIT},
|
||||||
{"PCRE_NEWLINE_ANYCRLF", 0x00500000},
|
{"PCRE2_EXTENDED_MORE", PCRE2_EXTENDED_MORE},
|
||||||
{"PCRE_BSR_ANYCRLF", 0x00800000},
|
{"PCRE2_LITERAL", PCRE2_LITERAL},
|
||||||
{"PCRE_BSR_UNICODE", 0x01000000},
|
{"PCRE2_MATCH_INVALID_UTF", PCRE2_MATCH_INVALID_UTF},
|
||||||
|
|
||||||
|
{"PCRE_CASELESS", PCRE2_CASELESS},
|
||||||
|
{"PCRE_MULTILINE", PCRE2_MULTILINE},
|
||||||
|
{"PCRE_DOTALL", PCRE2_DOTALL},
|
||||||
|
{"PCRE_EXTENDED", PCRE2_EXTENDED},
|
||||||
|
{"PCRE_ANCHORED", PCRE2_ANCHORED},
|
||||||
|
{"PCRE_DOLLAR_ENDONLY", PCRE2_DOLLAR_ENDONLY},
|
||||||
|
{"PCRE_EXTRA", PCRE2_EXTENDED_MORE},
|
||||||
|
{"PCRE_NOTBOL", PCRE2_NOTBOL},
|
||||||
|
{"PCRE_NOTEOL", PCRE2_NOTEOL},
|
||||||
|
{"PCRE_UNGREEDY", PCRE2_UNGREEDY},
|
||||||
|
{"PCRE_NOTEMPTY", PCRE2_NOTEMPTY},
|
||||||
|
{"PCRE_UTF8", PCRE2_UTF},
|
||||||
|
{"PCRE_NO_AUTO_CAPTURE", PCRE2_NO_AUTO_CAPTURE},
|
||||||
|
{"PCRE_NO_UTF8_CHECK", PCRE2_MATCH_INVALID_UTF},
|
||||||
|
{"PCRE_AUTO_CALLOUT", PCRE2_AUTO_CALLOUT},
|
||||||
|
{"PCRE_PARTIAL", PCRE2_PARTIAL_SOFT},
|
||||||
|
{"PCRE_DFA_SHORTEST", PCRE2_DFA_SHORTEST},
|
||||||
|
{"PCRE_DFA_RESTART", PCRE2_DFA_RESTART},
|
||||||
|
{"PCRE_FIRSTLINE", PCRE2_FIRSTLINE},
|
||||||
|
{"PCRE_DUPNAMES", PCRE2_DUPNAMES},
|
||||||
|
{"PCRE_NEWLINE_CR", PCRE2_NEWLINE_CR},
|
||||||
|
{"PCRE_NEWLINE_LF", PCRE2_NEWLINE_LF},
|
||||||
|
{"PCRE_NEWLINE_CRLF", PCRE2_NEWLINE_CRLF},
|
||||||
|
{"PCRE_NEWLINE_ANY", PCRE2_NEWLINE_ANY},
|
||||||
|
{"PCRE_NEWLINE_ANYCRLF", PCRE2_NEWLINE_ANYCRLF},
|
||||||
|
{"PCRE_BSR_ANYCRLF", PCRE2_BSR_ANYCRLF},
|
||||||
|
{"PCRE_BSR_UNICODE", PCRE2_BSR_UNICODE},
|
||||||
|
|
||||||
{NULL, 0}
|
{NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pcre_filter_data {
|
struct pcre_filter_data {
|
||||||
int users;
|
int users;
|
||||||
pcre * re;
|
pcre2_code * re;
|
||||||
|
pcre2_match_data * match_data;
|
||||||
int action;
|
int action;
|
||||||
char * replace;
|
char * replace;
|
||||||
struct ace *acl;
|
struct ace *acl;
|
||||||
@ -84,7 +114,8 @@ static void pcre_data_free(struct pcre_filter_data *pcrefd){
|
|||||||
pthread_mutex_lock(&pcre_mutex);
|
pthread_mutex_lock(&pcre_mutex);
|
||||||
pcrefd->users--;
|
pcrefd->users--;
|
||||||
if(!pcrefd->users){
|
if(!pcrefd->users){
|
||||||
if(pcrefd->re) pl->freefunc(pcrefd->re);
|
if(pcrefd->match_data) pcre2_match_data_free(pcrefd->match_data);
|
||||||
|
if(pcrefd->re) pcre2_code_free(pcrefd->re);
|
||||||
if(pcrefd->acl) pl->freeacl(pcrefd->acl);
|
if(pcrefd->acl) pl->freeacl(pcrefd->acl);
|
||||||
if(pcrefd->replace) pl->freefunc(pcrefd->replace);
|
if(pcrefd->replace) pl->freefunc(pcrefd->replace);
|
||||||
pl->freefunc(pcrefd);
|
pl->freefunc(pcrefd);
|
||||||
@ -124,7 +155,7 @@ static FILTER_ACTION pcre_filter_client(void *fo, struct clientparam * param, vo
|
|||||||
}
|
}
|
||||||
|
|
||||||
static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
int ovector[48];
|
PCRE2_SIZE *ovector;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
struct ace *acl;
|
struct ace *acl;
|
||||||
int match = 0;
|
int match = 0;
|
||||||
@ -144,8 +175,9 @@ static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, uns
|
|||||||
if(!pcrefd->re) return pcrefd->action;
|
if(!pcrefd->re) return pcrefd->action;
|
||||||
for(; offset < *length_p; nreplaces++){
|
for(; offset < *length_p; nreplaces++){
|
||||||
|
|
||||||
count = pcre_exec(pcrefd->re, NULL, (char *)*buf_p, *length_p, offset, 0, ovector, 48);
|
count = pcre2_match(pcrefd->re, (PCRE2_SPTR)*buf_p, *length_p, offset, 0, pcrefd->match_data, NULL);
|
||||||
if(count <= 0) break;
|
if(count <= 0) break;
|
||||||
|
ovector = pcre2_get_ovector_pointer(pcrefd->match_data);
|
||||||
if(!(replace = pcrefd->replace) || param->nooverwritefilter) return pcrefd->action;
|
if(!(replace = pcrefd->replace) || param->nooverwritefilter) return pcrefd->action;
|
||||||
|
|
||||||
replen = *length_p - ovector[1];
|
replen = *length_p - ovector[1];
|
||||||
@ -221,10 +253,11 @@ static void pcre_filter_close(void *fo){
|
|||||||
|
|
||||||
static int h_pcre(int argc, unsigned char **argv){
|
static int h_pcre(int argc, unsigned char **argv){
|
||||||
int action = 0;
|
int action = 0;
|
||||||
pcre *re = NULL;
|
pcre2_code *re = NULL;
|
||||||
|
pcre2_match_data *match_data = NULL;
|
||||||
struct ace *acl;
|
struct ace *acl;
|
||||||
int offset = 4;
|
int errcode;
|
||||||
const char * errptr;
|
PCRE2_SIZE erroffset;
|
||||||
struct pcre_filter_data *flt;
|
struct pcre_filter_data *flt;
|
||||||
struct filter *newf;
|
struct filter *newf;
|
||||||
char *replace = NULL;
|
char *replace = NULL;
|
||||||
@ -236,7 +269,6 @@ static int h_pcre(int argc, unsigned char **argv){
|
|||||||
else return 1;
|
else return 1;
|
||||||
if(!strncmp((char *)argv[0], "pcre_rewrite", 12)) {
|
if(!strncmp((char *)argv[0], "pcre_rewrite", 12)) {
|
||||||
int i,j;
|
int i,j;
|
||||||
offset = 5;
|
|
||||||
replace = pl->strdupfunc((char *)argv[4]);
|
replace = pl->strdupfunc((char *)argv[4]);
|
||||||
if(!replace) return 9;
|
if(!replace) return 9;
|
||||||
for(i=0, j=0; replace[i]; i++, j++){
|
for(i=0, j=0; replace[i]; i++, j++){
|
||||||
@ -265,22 +297,30 @@ static int h_pcre(int argc, unsigned char **argv){
|
|||||||
}
|
}
|
||||||
replace[j] = 0;
|
replace[j] = 0;
|
||||||
}
|
}
|
||||||
if(!(acl = pl->make_ace(argc - offset, argv + offset))) return 2;
|
if(!(acl = pl->make_ace(argc - 4, argv + 4))) return 2;
|
||||||
acl->nolog = (strstr((char *)argv[2],"log") == 0);
|
acl->nolog = (strstr((char *)argv[2],"log") == 0);
|
||||||
if(*argv[3] && !(*argv[3] == '*' && !argv[3][1]) ){
|
if(*argv[3] && !(*argv[3] == '*' && !argv[3][1]) ){
|
||||||
re = pcre_compile((char *)argv[3], pcre_options, &errptr, &offset, NULL);
|
re = pcre2_compile((PCRE2_SPTR)argv[3], PCRE2_ZERO_TERMINATED, pcre_options, &errcode, &erroffset, NULL);
|
||||||
if(!re) {
|
if(!re) {
|
||||||
pl->freefunc(acl);
|
pl->freefunc(acl);
|
||||||
if(replace) pl->freefunc(replace);
|
if(replace) pl->freefunc(replace);
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
match_data = pcre2_match_data_create_from_pattern(re, NULL);
|
||||||
|
if(!match_data) {
|
||||||
|
pcre2_code_free(re);
|
||||||
|
pl->freefunc(acl);
|
||||||
|
if(replace) pl->freefunc(replace);
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
flt = pl->mallocfunc(sizeof(struct pcre_filter_data));
|
flt = pl->mallocfunc(sizeof(struct pcre_filter_data));
|
||||||
newf = pl->mallocfunc(sizeof(struct filter));
|
newf = pl->mallocfunc(sizeof(struct filter));
|
||||||
|
|
||||||
if(!flt || !newf) {
|
if(!flt || !newf) {
|
||||||
|
if(match_data) pcre2_match_data_free(match_data);
|
||||||
|
if(re) pcre2_code_free(re);
|
||||||
pl->freefunc(acl);
|
pl->freefunc(acl);
|
||||||
pl->freefunc(re);
|
|
||||||
if(replace) pl->freefunc(replace);
|
if(replace) pl->freefunc(replace);
|
||||||
if(flt) pl->freefunc(flt);
|
if(flt) pl->freefunc(flt);
|
||||||
return 4;
|
return 4;
|
||||||
@ -289,6 +329,114 @@ static int h_pcre(int argc, unsigned char **argv){
|
|||||||
memset(newf, 0, sizeof(struct filter));
|
memset(newf, 0, sizeof(struct filter));
|
||||||
flt->action = action;
|
flt->action = action;
|
||||||
flt->re = re;
|
flt->re = re;
|
||||||
|
flt->match_data = match_data;
|
||||||
|
flt->acl = acl;
|
||||||
|
flt->replace = replace;
|
||||||
|
flt->users = 1;
|
||||||
|
newf->instance = "pcre";
|
||||||
|
newf->data = flt;
|
||||||
|
newf->filter_open = pcre_filter_open;
|
||||||
|
newf->filter_client = pcre_filter_client;
|
||||||
|
if(strstr((char *)argv[1], "request"))newf->filter_request = pcre_filter_buffer;
|
||||||
|
if(strstr((char *)argv[1], "cliheader"))newf->filter_header_cli = pcre_filter_buffer;
|
||||||
|
if(strstr((char *)argv[1], "clidata"))newf->filter_data_cli = pcre_filter_buffer;
|
||||||
|
if(strstr((char *)argv[1], "srvheader"))newf->filter_header_srv = pcre_filter_buffer;
|
||||||
|
if(strstr((char *)argv[1], "srvdata"))newf->filter_data_srv = pcre_filter_buffer;
|
||||||
|
newf->filter_clear = pcre_filter_clear;
|
||||||
|
newf->filter_close = pcre_filter_close;
|
||||||
|
|
||||||
|
if(!pcre_last_filter){
|
||||||
|
newf->next = pcre_first_filter.next;
|
||||||
|
pcre_first_filter.next=newf;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newf->next = pcre_last_filter->next;
|
||||||
|
pcre_last_filter->next = newf;
|
||||||
|
}
|
||||||
|
pcre_last_filter=newf;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int h_pcre_rewrite(int argc, unsigned char **argv){
|
||||||
|
int action = 0;
|
||||||
|
pcre2_code *re = NULL;
|
||||||
|
pcre2_match_data *match_data = NULL;
|
||||||
|
struct ace *acl;
|
||||||
|
int errcode;
|
||||||
|
PCRE2_SIZE erroffset;
|
||||||
|
struct pcre_filter_data *flt;
|
||||||
|
struct filter *newf;
|
||||||
|
char *replace = NULL;
|
||||||
|
|
||||||
|
if(!strncmp((char *)argv[2], "allow",5)) action = PASS;
|
||||||
|
else if(!strncmp((char *)argv[2], "deny",4)) action = REJECT;
|
||||||
|
else if(!strncmp((char *)argv[2], "remove",6)) action = REMOVE;
|
||||||
|
else if(!strncmp((char *)argv[2], "dunno",5)) action = CONTINUE;
|
||||||
|
else return 1;
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
replace = pl->strdupfunc((char *)argv[4]);
|
||||||
|
if(!replace) return 9;
|
||||||
|
for(i=0, j=0; replace[i]; i++, j++){
|
||||||
|
if(replace[i] == '\\'){
|
||||||
|
switch(replace[i+1]){
|
||||||
|
case 'r':
|
||||||
|
i++;
|
||||||
|
replace[j] = '\r';
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
i++;
|
||||||
|
replace[j] = '\n';
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
i++;
|
||||||
|
replace[j] = 0;
|
||||||
|
break;
|
||||||
|
case '\\':
|
||||||
|
i++;
|
||||||
|
default:
|
||||||
|
replace[j] = '\\';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else replace[j] = replace[i];
|
||||||
|
}
|
||||||
|
replace[j] = 0;
|
||||||
|
}
|
||||||
|
if(!(acl = pl->make_ace(argc - 5, argv + 5))) return 2;
|
||||||
|
acl->nolog = (strstr((char *)argv[2],"log") == 0);
|
||||||
|
if(*argv[3] && !(*argv[3] == '*' && !argv[3][1]) ){
|
||||||
|
re = pcre2_compile((PCRE2_SPTR)argv[3], PCRE2_ZERO_TERMINATED, pcre_options, &errcode, &erroffset, NULL);
|
||||||
|
if(!re) {
|
||||||
|
pl->freefunc(acl);
|
||||||
|
if(replace) pl->freefunc(replace);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
match_data = pcre2_match_data_create_from_pattern(re, NULL);
|
||||||
|
if(!match_data) {
|
||||||
|
pcre2_code_free(re);
|
||||||
|
pl->freefunc(acl);
|
||||||
|
if(replace) pl->freefunc(replace);
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flt = pl->mallocfunc(sizeof(struct pcre_filter_data));
|
||||||
|
newf = pl->mallocfunc(sizeof(struct filter));
|
||||||
|
|
||||||
|
if(!flt || !newf) {
|
||||||
|
if(match_data) pcre2_match_data_free(match_data);
|
||||||
|
if(re) pcre2_code_free(re);
|
||||||
|
pl->freefunc(acl);
|
||||||
|
if(replace) pl->freefunc(replace);
|
||||||
|
if(flt) pl->freefunc(flt);
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
memset(flt, 0, sizeof(struct pcre_filter_data));
|
||||||
|
memset(newf, 0, sizeof(struct filter));
|
||||||
|
flt->action = action;
|
||||||
|
flt->re = re;
|
||||||
|
flt->match_data = match_data;
|
||||||
flt->acl = acl;
|
flt->acl = acl;
|
||||||
flt->replace = replace;
|
flt->replace = replace;
|
||||||
flt->users = 1;
|
flt->users = 1;
|
||||||
@ -343,14 +491,14 @@ static int h_pcre_options(int argc, unsigned char **argv){
|
|||||||
|
|
||||||
static struct commands pcre_commandhandlers[] = {
|
static struct commands pcre_commandhandlers[] = {
|
||||||
{pcre_commandhandlers+1, "pcre", h_pcre, 4, 0},
|
{pcre_commandhandlers+1, "pcre", h_pcre, 4, 0},
|
||||||
{pcre_commandhandlers+2, "pcre_rewrite", h_pcre, 5, 0},
|
{pcre_commandhandlers+2, "pcre_rewrite", h_pcre_rewrite, 5, 0},
|
||||||
{pcre_commandhandlers+3, "pcre_extend", h_pcre_extend, 2, 0},
|
{pcre_commandhandlers+3, "pcre_extend", h_pcre_extend, 2, 0},
|
||||||
{NULL, "pcre_options", h_pcre_options, 2, 0}
|
{NULL, "pcre_options", h_pcre_options, 2, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct symbol regexp_symbols[] = {
|
static struct symbol regexp_symbols[] = {
|
||||||
{regexp_symbols+1, "pcre_compile", (void*) pcre_compile},
|
{regexp_symbols+1, "pcre2_compile", (void*) pcre2_compile},
|
||||||
{regexp_symbols+2, "pcre_exec", (void*) pcre_exec},
|
{regexp_symbols+2, "pcre2_match", (void*) pcre2_match},
|
||||||
{NULL, "pcre_options", (void *)&pcre_options},
|
{NULL, "pcre_options", (void *)&pcre_options},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -367,8 +515,6 @@ PLUGINAPI int PLUGINCALL pcre_plugin (struct pluginlink * pluginlink,
|
|||||||
pl = pluginlink;
|
pl = pluginlink;
|
||||||
pcre_options = 0;
|
pcre_options = 0;
|
||||||
if(!pcre_loaded){
|
if(!pcre_loaded){
|
||||||
pcre_malloc = pl->mallocfunc;
|
|
||||||
pcre_free = pl->freefunc;
|
|
||||||
pcre_loaded = 1;
|
pcre_loaded = 1;
|
||||||
pthread_mutex_init(&pcre_mutex, NULL);
|
pthread_mutex_init(&pcre_mutex, NULL);
|
||||||
regexp_symbols[2].next = pl->symbols.next;
|
regexp_symbols[2].next = pl->symbols.next;
|
||||||
|
|||||||
@ -1,93 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2012 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. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre_refcount(pcre *argument_re, int adjust)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre16_refcount(pcre16 *argument_re, int adjust)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
||||||
pcre32_refcount(pcre32 *argument_re, int adjust)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
REAL_PCRE *re = (REAL_PCRE *)argument_re;
|
|
||||||
if (re == NULL) return PCRE_ERROR_NULL;
|
|
||||||
if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
|
|
||||||
if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
|
|
||||||
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 */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,194 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* Perl-Compatible Regular Expressions *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This file was automatically written by the dftables auxiliary
|
|
||||||
program. It contains character tables that are used when no external
|
|
||||||
tables are passed to PCRE by the application that calls it. The tables
|
|
||||||
are used only for characters whose code values are less than 256.
|
|
||||||
|
|
||||||
The following #includes are present because without them gcc 4.x may remove
|
|
||||||
the array definition from the final binary if PCRE is built into a static
|
|
||||||
library and dead code stripping is activated. This leads to link errors.
|
|
||||||
Pulling in the header ensures that the array gets flagged as "someone
|
|
||||||
outside this compilation unit might reference this" and so it will always
|
|
||||||
be supplied to the linker. */
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
const pcre_uint8 PRIV(default_tables)[] = {
|
|
||||||
|
|
||||||
/* This table is a lower casing table. */
|
|
||||||
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7,
|
|
||||||
8, 9, 10, 11, 12, 13, 14, 15,
|
|
||||||
16, 17, 18, 19, 20, 21, 22, 23,
|
|
||||||
24, 25, 26, 27, 28, 29, 30, 31,
|
|
||||||
32, 33, 34, 35, 36, 37, 38, 39,
|
|
||||||
40, 41, 42, 43, 44, 45, 46, 47,
|
|
||||||
48, 49, 50, 51, 52, 53, 54, 55,
|
|
||||||
56, 57, 58, 59, 60, 61, 62, 63,
|
|
||||||
64, 97, 98, 99,100,101,102,103,
|
|
||||||
104,105,106,107,108,109,110,111,
|
|
||||||
112,113,114,115,116,117,118,119,
|
|
||||||
120,121,122, 91, 92, 93, 94, 95,
|
|
||||||
96, 97, 98, 99,100,101,102,103,
|
|
||||||
104,105,106,107,108,109,110,111,
|
|
||||||
112,113,114,115,116,117,118,119,
|
|
||||||
120,121,122,123,124,125,126,127,
|
|
||||||
128,129,130,131,132,133,134,135,
|
|
||||||
136,137,138,139,140,141,142,143,
|
|
||||||
144,145,146,147,148,149,150,151,
|
|
||||||
152,153,154,155,156,157,158,159,
|
|
||||||
160,161,162,163,164,165,166,167,
|
|
||||||
168,169,170,171,172,173,174,175,
|
|
||||||
176,177,178,179,180,181,182,183,
|
|
||||||
184,185,186,187,188,189,190,191,
|
|
||||||
192,193,194,195,196,197,198,199,
|
|
||||||
200,201,202,203,204,205,206,207,
|
|
||||||
208,209,210,211,212,213,214,215,
|
|
||||||
216,217,218,219,220,221,222,223,
|
|
||||||
224,225,226,227,228,229,230,231,
|
|
||||||
232,233,234,235,236,237,238,239,
|
|
||||||
240,241,242,243,244,245,246,247,
|
|
||||||
248,249,250,251,252,253,254,255,
|
|
||||||
|
|
||||||
/* This table is a case flipping table. */
|
|
||||||
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7,
|
|
||||||
8, 9, 10, 11, 12, 13, 14, 15,
|
|
||||||
16, 17, 18, 19, 20, 21, 22, 23,
|
|
||||||
24, 25, 26, 27, 28, 29, 30, 31,
|
|
||||||
32, 33, 34, 35, 36, 37, 38, 39,
|
|
||||||
40, 41, 42, 43, 44, 45, 46, 47,
|
|
||||||
48, 49, 50, 51, 52, 53, 54, 55,
|
|
||||||
56, 57, 58, 59, 60, 61, 62, 63,
|
|
||||||
64, 97, 98, 99,100,101,102,103,
|
|
||||||
104,105,106,107,108,109,110,111,
|
|
||||||
112,113,114,115,116,117,118,119,
|
|
||||||
120,121,122, 91, 92, 93, 94, 95,
|
|
||||||
96, 65, 66, 67, 68, 69, 70, 71,
|
|
||||||
72, 73, 74, 75, 76, 77, 78, 79,
|
|
||||||
80, 81, 82, 83, 84, 85, 86, 87,
|
|
||||||
88, 89, 90,123,124,125,126,127,
|
|
||||||
128,129,130,131,132,133,134,135,
|
|
||||||
136,137,138,139,140,141,142,143,
|
|
||||||
144,145,146,147,148,149,150,151,
|
|
||||||
152,153,154,155,156,157,158,159,
|
|
||||||
160,161,162,163,164,165,166,167,
|
|
||||||
168,169,170,171,172,173,174,175,
|
|
||||||
176,177,178,179,180,181,182,183,
|
|
||||||
184,185,186,187,188,189,190,191,
|
|
||||||
192,193,194,195,196,197,198,199,
|
|
||||||
200,201,202,203,204,205,206,207,
|
|
||||||
208,209,210,211,212,213,214,215,
|
|
||||||
216,217,218,219,220,221,222,223,
|
|
||||||
224,225,226,227,228,229,230,231,
|
|
||||||
232,233,234,235,236,237,238,239,
|
|
||||||
240,241,242,243,244,245,246,247,
|
|
||||||
248,249,250,251,252,253,254,255,
|
|
||||||
|
|
||||||
/* This table contains bit maps for various character classes.
|
|
||||||
Each map is 32 bytes long and the bits run from the least
|
|
||||||
significant end of each byte. The classes that have their own
|
|
||||||
maps are: space, xdigit, digit, upper, lower, word, graph
|
|
||||||
print, punct, and cntrl. Other classes are built from combinations. */
|
|
||||||
|
|
||||||
0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
|
|
||||||
0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
|
|
||||||
0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,
|
|
||||||
0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
|
|
||||||
/* This table identifies various classes of character by individual bits:
|
|
||||||
0x01 white space character
|
|
||||||
0x02 letter
|
|
||||||
0x04 decimal digit
|
|
||||||
0x08 hexadecimal digit
|
|
||||||
0x10 alphanumeric or '_'
|
|
||||||
0x80 regular expression metacharacter or binary zero
|
|
||||||
*/
|
|
||||||
|
|
||||||
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */
|
|
||||||
0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
|
|
||||||
0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */
|
|
||||||
0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */
|
|
||||||
0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */
|
|
||||||
0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */
|
|
||||||
0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */
|
|
||||||
0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */
|
|
||||||
0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */
|
|
||||||
0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */
|
|
||||||
0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */
|
|
||||||
0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */
|
|
||||||
0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */
|
|
||||||
0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
|
|
||||||
|
|
||||||
/* End of pcre_chartables.c */
|
|
||||||
@ -1,728 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2012 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_INCLUDED
|
|
||||||
|
|
||||||
/* This module contains some fixed tables that are used by more than one of the
|
|
||||||
PCRE code modules. The tables are also #included by the pcretest program, which
|
|
||||||
uses macros to change their names from _pcre_xxx to xxxx, thereby avoiding name
|
|
||||||
clashes with the library. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
#endif /* PCRE_INCLUDED */
|
|
||||||
|
|
||||||
/* 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 pcre_internal.h. */
|
|
||||||
|
|
||||||
const pcre_uint8 PRIV(OP_lengths)[] = { OP_LENGTHS };
|
|
||||||
|
|
||||||
/* Tables of horizontal and vertical whitespace characters, suitable for
|
|
||||||
adding to classes. */
|
|
||||||
|
|
||||||
const pcre_uint32 PRIV(hspace_list)[] = { HSPACE_LIST };
|
|
||||||
const pcre_uint32 PRIV(vspace_list)[] = { VSPACE_LIST };
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Tables for UTF-8 support *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* These are the breakpoints for different numbers of bytes in a UTF-8
|
|
||||||
character. */
|
|
||||||
|
|
||||||
#if (defined SUPPORT_UTF && defined COMPILE_PCRE8) \
|
|
||||||
|| (defined PCRE_INCLUDED && (defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32))
|
|
||||||
|
|
||||||
/* These tables are also required by pcretest in 16- or 32-bit mode. */
|
|
||||||
|
|
||||||
const int PRIV(utf8_table1)[] =
|
|
||||||
{ 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
|
|
||||||
|
|
||||||
const int PRIV(utf8_table1_size) = sizeof(PRIV(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 PRIV(utf8_table2)[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
|
|
||||||
const int PRIV(utf8_table3)[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
|
|
||||||
|
|
||||||
/* Table of the number of extra bytes, indexed by the first byte masked with
|
|
||||||
0x3f. The highest number for a valid UTF-8 first byte is in fact 0x3d. */
|
|
||||||
|
|
||||||
const pcre_uint8 PRIV(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 };
|
|
||||||
|
|
||||||
#endif /* (SUPPORT_UTF && COMPILE_PCRE8) || (PCRE_INCLUDED && SUPPORT_PCRE[16|32])*/
|
|
||||||
|
|
||||||
#ifdef SUPPORT_UTF
|
|
||||||
|
|
||||||
/* Table to translate from particular type value to the general value. */
|
|
||||||
|
|
||||||
const pcre_uint32 PRIV(ucp_gentype)[] = {
|
|
||||||
ucp_C, ucp_C, ucp_C, ucp_C, ucp_C, /* Cc, Cf, Cn, Co, Cs */
|
|
||||||
ucp_L, ucp_L, ucp_L, ucp_L, ucp_L, /* Ll, Lu, Lm, Lo, Lt */
|
|
||||||
ucp_M, ucp_M, ucp_M, /* Mc, Me, Mn */
|
|
||||||
ucp_N, ucp_N, ucp_N, /* Nd, Nl, No */
|
|
||||||
ucp_P, ucp_P, ucp_P, ucp_P, ucp_P, /* Pc, Pd, Pe, Pf, Pi */
|
|
||||||
ucp_P, ucp_P, /* Ps, Po */
|
|
||||||
ucp_S, ucp_S, ucp_S, ucp_S, /* Sc, Sk, Sm, So */
|
|
||||||
ucp_Z, ucp_Z, ucp_Z /* Zl, Zp, Zs */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* This table encodes the rules for finding the end of an extended grapheme
|
|
||||||
cluster. Every code point has a grapheme break property which is one of the
|
|
||||||
ucp_gbXX values defined in ucp.h. The 2-dimensional table is indexed by the
|
|
||||||
properties of two adjacent code points. The left property selects a word from
|
|
||||||
the table, and the right property selects a bit from that word like this:
|
|
||||||
|
|
||||||
ucp_gbtable[left-property] & (1 << right-property)
|
|
||||||
|
|
||||||
The value is non-zero if a grapheme break is NOT permitted between the relevant
|
|
||||||
two code points. The breaking rules are as follows:
|
|
||||||
|
|
||||||
1. Break at the start and end of text (pretty obviously).
|
|
||||||
|
|
||||||
2. Do not break between a CR and LF; otherwise, break before and after
|
|
||||||
controls.
|
|
||||||
|
|
||||||
3. Do not break Hangul syllable sequences, the rules for which are:
|
|
||||||
|
|
||||||
L may be followed by L, V, LV or LVT
|
|
||||||
LV or V may be followed by V or T
|
|
||||||
LVT or T may be followed by T
|
|
||||||
|
|
||||||
4. Do not break before extending characters.
|
|
||||||
|
|
||||||
The next two rules are only for extended grapheme clusters (but that's what we
|
|
||||||
are implementing).
|
|
||||||
|
|
||||||
5. Do not break before SpacingMarks.
|
|
||||||
|
|
||||||
6. Do not break after Prepend characters.
|
|
||||||
|
|
||||||
7. Otherwise, break everywhere.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const pcre_uint32 PRIV(ucp_gbtable[]) = {
|
|
||||||
(1<<ucp_gbLF), /* 0 CR */
|
|
||||||
0, /* 1 LF */
|
|
||||||
0, /* 2 Control */
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark), /* 3 Extend */
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbPrepend)| /* 4 Prepend */
|
|
||||||
(1<<ucp_gbSpacingMark)|(1<<ucp_gbL)|
|
|
||||||
(1<<ucp_gbV)|(1<<ucp_gbT)|(1<<ucp_gbLV)|
|
|
||||||
(1<<ucp_gbLVT)|(1<<ucp_gbOther),
|
|
||||||
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark), /* 5 SpacingMark */
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbL)| /* 6 L */
|
|
||||||
(1<<ucp_gbL)|(1<<ucp_gbV)|(1<<ucp_gbLV)|(1<<ucp_gbLVT),
|
|
||||||
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbV)| /* 7 V */
|
|
||||||
(1<<ucp_gbT),
|
|
||||||
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbT), /* 8 T */
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbV)| /* 9 LV */
|
|
||||||
(1<<ucp_gbT),
|
|
||||||
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbT), /* 10 LVT */
|
|
||||||
(1<<ucp_gbRegionalIndicator), /* 11 RegionalIndicator */
|
|
||||||
(1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark) /* 12 Other */
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef SUPPORT_JIT
|
|
||||||
/* This table reverses PRIV(ucp_gentype). We can save the cost
|
|
||||||
of a memory load. */
|
|
||||||
|
|
||||||
const int PRIV(ucp_typerange)[] = {
|
|
||||||
ucp_Cc, ucp_Cs,
|
|
||||||
ucp_Ll, ucp_Lu,
|
|
||||||
ucp_Mc, ucp_Mn,
|
|
||||||
ucp_Nd, ucp_No,
|
|
||||||
ucp_Pc, ucp_Ps,
|
|
||||||
ucp_Sc, ucp_So,
|
|
||||||
ucp_Zl, ucp_Zs,
|
|
||||||
};
|
|
||||||
#endif /* SUPPORT_JIT */
|
|
||||||
|
|
||||||
/* The pcre_utt[] table below translates Unicode property names into type and
|
|
||||||
code values. It is searched by binary chop, so must be in collating sequence of
|
|
||||||
name. Originally, the table contained pointers to the name strings in the first
|
|
||||||
field of each entry. However, that leads to a large number of relocations when
|
|
||||||
a shared library is dynamically loaded. A significant reduction is made by
|
|
||||||
putting all the names into a single, large string and then using offsets in the
|
|
||||||
table itself. Maintenance is more error-prone, but frequent changes to this
|
|
||||||
data are unlikely.
|
|
||||||
|
|
||||||
July 2008: There is now a script called maint/GenerateUtt.py that can be used
|
|
||||||
to generate this data automatically instead of maintaining it by hand.
|
|
||||||
|
|
||||||
The script was updated in March 2009 to generate a new EBCDIC-compliant
|
|
||||||
version. Like all other character and string literals that are compared against
|
|
||||||
the regular expression pattern, we must use STR_ macros instead of literal
|
|
||||||
strings to make sure that UTF-8 support works on EBCDIC platforms. */
|
|
||||||
|
|
||||||
#define STRING_Any0 STR_A STR_n STR_y "\0"
|
|
||||||
#define STRING_Arabic0 STR_A STR_r STR_a STR_b STR_i STR_c "\0"
|
|
||||||
#define STRING_Armenian0 STR_A STR_r STR_m STR_e STR_n STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Avestan0 STR_A STR_v STR_e STR_s STR_t STR_a STR_n "\0"
|
|
||||||
#define STRING_Balinese0 STR_B STR_a STR_l STR_i STR_n STR_e STR_s STR_e "\0"
|
|
||||||
#define STRING_Bamum0 STR_B STR_a STR_m STR_u STR_m "\0"
|
|
||||||
#define STRING_Bassa_Vah0 STR_B STR_a STR_s STR_s STR_a STR_UNDERSCORE STR_V STR_a STR_h "\0"
|
|
||||||
#define STRING_Batak0 STR_B STR_a STR_t STR_a STR_k "\0"
|
|
||||||
#define STRING_Bengali0 STR_B STR_e STR_n STR_g STR_a STR_l STR_i "\0"
|
|
||||||
#define STRING_Bopomofo0 STR_B STR_o STR_p STR_o STR_m STR_o STR_f STR_o "\0"
|
|
||||||
#define STRING_Brahmi0 STR_B STR_r STR_a STR_h STR_m STR_i "\0"
|
|
||||||
#define STRING_Braille0 STR_B STR_r STR_a STR_i STR_l STR_l STR_e "\0"
|
|
||||||
#define STRING_Buginese0 STR_B STR_u STR_g STR_i STR_n STR_e STR_s STR_e "\0"
|
|
||||||
#define STRING_Buhid0 STR_B STR_u STR_h STR_i STR_d "\0"
|
|
||||||
#define STRING_C0 STR_C "\0"
|
|
||||||
#define STRING_Canadian_Aboriginal0 STR_C STR_a STR_n STR_a STR_d STR_i STR_a STR_n STR_UNDERSCORE STR_A STR_b STR_o STR_r STR_i STR_g STR_i STR_n STR_a STR_l "\0"
|
|
||||||
#define STRING_Carian0 STR_C STR_a STR_r STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Caucasian_Albanian0 STR_C STR_a STR_u STR_c STR_a STR_s STR_i STR_a STR_n STR_UNDERSCORE STR_A STR_l STR_b STR_a STR_n STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Cc0 STR_C STR_c "\0"
|
|
||||||
#define STRING_Cf0 STR_C STR_f "\0"
|
|
||||||
#define STRING_Chakma0 STR_C STR_h STR_a STR_k STR_m STR_a "\0"
|
|
||||||
#define STRING_Cham0 STR_C STR_h STR_a STR_m "\0"
|
|
||||||
#define STRING_Cherokee0 STR_C STR_h STR_e STR_r STR_o STR_k STR_e STR_e "\0"
|
|
||||||
#define STRING_Cn0 STR_C STR_n "\0"
|
|
||||||
#define STRING_Co0 STR_C STR_o "\0"
|
|
||||||
#define STRING_Common0 STR_C STR_o STR_m STR_m STR_o STR_n "\0"
|
|
||||||
#define STRING_Coptic0 STR_C STR_o STR_p STR_t STR_i STR_c "\0"
|
|
||||||
#define STRING_Cs0 STR_C STR_s "\0"
|
|
||||||
#define STRING_Cuneiform0 STR_C STR_u STR_n STR_e STR_i STR_f STR_o STR_r STR_m "\0"
|
|
||||||
#define STRING_Cypriot0 STR_C STR_y STR_p STR_r STR_i STR_o STR_t "\0"
|
|
||||||
#define STRING_Cyrillic0 STR_C STR_y STR_r STR_i STR_l STR_l STR_i STR_c "\0"
|
|
||||||
#define STRING_Deseret0 STR_D STR_e STR_s STR_e STR_r STR_e STR_t "\0"
|
|
||||||
#define STRING_Devanagari0 STR_D STR_e STR_v STR_a STR_n STR_a STR_g STR_a STR_r STR_i "\0"
|
|
||||||
#define STRING_Duployan0 STR_D STR_u STR_p STR_l STR_o STR_y STR_a STR_n "\0"
|
|
||||||
#define STRING_Egyptian_Hieroglyphs0 STR_E STR_g STR_y STR_p STR_t STR_i STR_a STR_n STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0"
|
|
||||||
#define STRING_Elbasan0 STR_E STR_l STR_b STR_a STR_s STR_a STR_n "\0"
|
|
||||||
#define STRING_Ethiopic0 STR_E STR_t STR_h STR_i STR_o STR_p STR_i STR_c "\0"
|
|
||||||
#define STRING_Georgian0 STR_G STR_e STR_o STR_r STR_g STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Glagolitic0 STR_G STR_l STR_a STR_g STR_o STR_l STR_i STR_t STR_i STR_c "\0"
|
|
||||||
#define STRING_Gothic0 STR_G STR_o STR_t STR_h STR_i STR_c "\0"
|
|
||||||
#define STRING_Grantha0 STR_G STR_r STR_a STR_n STR_t STR_h STR_a "\0"
|
|
||||||
#define STRING_Greek0 STR_G STR_r STR_e STR_e STR_k "\0"
|
|
||||||
#define STRING_Gujarati0 STR_G STR_u STR_j STR_a STR_r STR_a STR_t STR_i "\0"
|
|
||||||
#define STRING_Gurmukhi0 STR_G STR_u STR_r STR_m STR_u STR_k STR_h STR_i "\0"
|
|
||||||
#define STRING_Han0 STR_H STR_a STR_n "\0"
|
|
||||||
#define STRING_Hangul0 STR_H STR_a STR_n STR_g STR_u STR_l "\0"
|
|
||||||
#define STRING_Hanunoo0 STR_H STR_a STR_n STR_u STR_n STR_o STR_o "\0"
|
|
||||||
#define STRING_Hebrew0 STR_H STR_e STR_b STR_r STR_e STR_w "\0"
|
|
||||||
#define STRING_Hiragana0 STR_H STR_i STR_r STR_a STR_g STR_a STR_n STR_a "\0"
|
|
||||||
#define STRING_Imperial_Aramaic0 STR_I STR_m STR_p STR_e STR_r STR_i STR_a STR_l STR_UNDERSCORE STR_A STR_r STR_a STR_m STR_a STR_i STR_c "\0"
|
|
||||||
#define STRING_Inherited0 STR_I STR_n STR_h STR_e STR_r STR_i STR_t STR_e STR_d "\0"
|
|
||||||
#define STRING_Inscriptional_Pahlavi0 STR_I STR_n STR_s STR_c STR_r STR_i STR_p STR_t STR_i STR_o STR_n STR_a STR_l STR_UNDERSCORE STR_P STR_a STR_h STR_l STR_a STR_v STR_i "\0"
|
|
||||||
#define STRING_Inscriptional_Parthian0 STR_I STR_n STR_s STR_c STR_r STR_i STR_p STR_t STR_i STR_o STR_n STR_a STR_l STR_UNDERSCORE STR_P STR_a STR_r STR_t STR_h STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Javanese0 STR_J STR_a STR_v STR_a STR_n STR_e STR_s STR_e "\0"
|
|
||||||
#define STRING_Kaithi0 STR_K STR_a STR_i STR_t STR_h STR_i "\0"
|
|
||||||
#define STRING_Kannada0 STR_K STR_a STR_n STR_n STR_a STR_d STR_a "\0"
|
|
||||||
#define STRING_Katakana0 STR_K STR_a STR_t STR_a STR_k STR_a STR_n STR_a "\0"
|
|
||||||
#define STRING_Kayah_Li0 STR_K STR_a STR_y STR_a STR_h STR_UNDERSCORE STR_L STR_i "\0"
|
|
||||||
#define STRING_Kharoshthi0 STR_K STR_h STR_a STR_r STR_o STR_s STR_h STR_t STR_h STR_i "\0"
|
|
||||||
#define STRING_Khmer0 STR_K STR_h STR_m STR_e STR_r "\0"
|
|
||||||
#define STRING_Khojki0 STR_K STR_h STR_o STR_j STR_k STR_i "\0"
|
|
||||||
#define STRING_Khudawadi0 STR_K STR_h STR_u STR_d STR_a STR_w STR_a STR_d STR_i "\0"
|
|
||||||
#define STRING_L0 STR_L "\0"
|
|
||||||
#define STRING_L_AMPERSAND0 STR_L STR_AMPERSAND "\0"
|
|
||||||
#define STRING_Lao0 STR_L STR_a STR_o "\0"
|
|
||||||
#define STRING_Latin0 STR_L STR_a STR_t STR_i STR_n "\0"
|
|
||||||
#define STRING_Lepcha0 STR_L STR_e STR_p STR_c STR_h STR_a "\0"
|
|
||||||
#define STRING_Limbu0 STR_L STR_i STR_m STR_b STR_u "\0"
|
|
||||||
#define STRING_Linear_A0 STR_L STR_i STR_n STR_e STR_a STR_r STR_UNDERSCORE STR_A "\0"
|
|
||||||
#define STRING_Linear_B0 STR_L STR_i STR_n STR_e STR_a STR_r STR_UNDERSCORE STR_B "\0"
|
|
||||||
#define STRING_Lisu0 STR_L STR_i STR_s STR_u "\0"
|
|
||||||
#define STRING_Ll0 STR_L STR_l "\0"
|
|
||||||
#define STRING_Lm0 STR_L STR_m "\0"
|
|
||||||
#define STRING_Lo0 STR_L STR_o "\0"
|
|
||||||
#define STRING_Lt0 STR_L STR_t "\0"
|
|
||||||
#define STRING_Lu0 STR_L STR_u "\0"
|
|
||||||
#define STRING_Lycian0 STR_L STR_y STR_c STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Lydian0 STR_L STR_y STR_d STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_M0 STR_M "\0"
|
|
||||||
#define STRING_Mahajani0 STR_M STR_a STR_h STR_a STR_j STR_a STR_n STR_i "\0"
|
|
||||||
#define STRING_Malayalam0 STR_M STR_a STR_l STR_a STR_y STR_a STR_l STR_a STR_m "\0"
|
|
||||||
#define STRING_Mandaic0 STR_M STR_a STR_n STR_d STR_a STR_i STR_c "\0"
|
|
||||||
#define STRING_Manichaean0 STR_M STR_a STR_n STR_i STR_c STR_h STR_a STR_e STR_a STR_n "\0"
|
|
||||||
#define STRING_Mc0 STR_M STR_c "\0"
|
|
||||||
#define STRING_Me0 STR_M STR_e "\0"
|
|
||||||
#define STRING_Meetei_Mayek0 STR_M STR_e STR_e STR_t STR_e STR_i STR_UNDERSCORE STR_M STR_a STR_y STR_e STR_k "\0"
|
|
||||||
#define STRING_Mende_Kikakui0 STR_M STR_e STR_n STR_d STR_e STR_UNDERSCORE STR_K STR_i STR_k STR_a STR_k STR_u STR_i "\0"
|
|
||||||
#define STRING_Meroitic_Cursive0 STR_M STR_e STR_r STR_o STR_i STR_t STR_i STR_c STR_UNDERSCORE STR_C STR_u STR_r STR_s STR_i STR_v STR_e "\0"
|
|
||||||
#define STRING_Meroitic_Hieroglyphs0 STR_M STR_e STR_r STR_o STR_i STR_t STR_i STR_c STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0"
|
|
||||||
#define STRING_Miao0 STR_M STR_i STR_a STR_o "\0"
|
|
||||||
#define STRING_Mn0 STR_M STR_n "\0"
|
|
||||||
#define STRING_Modi0 STR_M STR_o STR_d STR_i "\0"
|
|
||||||
#define STRING_Mongolian0 STR_M STR_o STR_n STR_g STR_o STR_l STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Mro0 STR_M STR_r STR_o "\0"
|
|
||||||
#define STRING_Myanmar0 STR_M STR_y STR_a STR_n STR_m STR_a STR_r "\0"
|
|
||||||
#define STRING_N0 STR_N "\0"
|
|
||||||
#define STRING_Nabataean0 STR_N STR_a STR_b STR_a STR_t STR_a STR_e STR_a STR_n "\0"
|
|
||||||
#define STRING_Nd0 STR_N STR_d "\0"
|
|
||||||
#define STRING_New_Tai_Lue0 STR_N STR_e STR_w STR_UNDERSCORE STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_u STR_e "\0"
|
|
||||||
#define STRING_Nko0 STR_N STR_k STR_o "\0"
|
|
||||||
#define STRING_Nl0 STR_N STR_l "\0"
|
|
||||||
#define STRING_No0 STR_N STR_o "\0"
|
|
||||||
#define STRING_Ogham0 STR_O STR_g STR_h STR_a STR_m "\0"
|
|
||||||
#define STRING_Ol_Chiki0 STR_O STR_l STR_UNDERSCORE STR_C STR_h STR_i STR_k STR_i "\0"
|
|
||||||
#define STRING_Old_Italic0 STR_O STR_l STR_d STR_UNDERSCORE STR_I STR_t STR_a STR_l STR_i STR_c "\0"
|
|
||||||
#define STRING_Old_North_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_N STR_o STR_r STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Old_Permic0 STR_O STR_l STR_d STR_UNDERSCORE STR_P STR_e STR_r STR_m STR_i STR_c "\0"
|
|
||||||
#define STRING_Old_Persian0 STR_O STR_l STR_d STR_UNDERSCORE STR_P STR_e STR_r STR_s STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Old_South_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_u STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Old_Turkic0 STR_O STR_l STR_d STR_UNDERSCORE STR_T STR_u STR_r STR_k STR_i STR_c "\0"
|
|
||||||
#define STRING_Oriya0 STR_O STR_r STR_i STR_y STR_a "\0"
|
|
||||||
#define STRING_Osmanya0 STR_O STR_s STR_m STR_a STR_n STR_y STR_a "\0"
|
|
||||||
#define STRING_P0 STR_P "\0"
|
|
||||||
#define STRING_Pahawh_Hmong0 STR_P STR_a STR_h STR_a STR_w STR_h STR_UNDERSCORE STR_H STR_m STR_o STR_n STR_g "\0"
|
|
||||||
#define STRING_Palmyrene0 STR_P STR_a STR_l STR_m STR_y STR_r STR_e STR_n STR_e "\0"
|
|
||||||
#define STRING_Pau_Cin_Hau0 STR_P STR_a STR_u STR_UNDERSCORE STR_C STR_i STR_n STR_UNDERSCORE STR_H STR_a STR_u "\0"
|
|
||||||
#define STRING_Pc0 STR_P STR_c "\0"
|
|
||||||
#define STRING_Pd0 STR_P STR_d "\0"
|
|
||||||
#define STRING_Pe0 STR_P STR_e "\0"
|
|
||||||
#define STRING_Pf0 STR_P STR_f "\0"
|
|
||||||
#define STRING_Phags_Pa0 STR_P STR_h STR_a STR_g STR_s STR_UNDERSCORE STR_P STR_a "\0"
|
|
||||||
#define STRING_Phoenician0 STR_P STR_h STR_o STR_e STR_n STR_i STR_c STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Pi0 STR_P STR_i "\0"
|
|
||||||
#define STRING_Po0 STR_P STR_o "\0"
|
|
||||||
#define STRING_Ps0 STR_P STR_s "\0"
|
|
||||||
#define STRING_Psalter_Pahlavi0 STR_P STR_s STR_a STR_l STR_t STR_e STR_r STR_UNDERSCORE STR_P STR_a STR_h STR_l STR_a STR_v STR_i "\0"
|
|
||||||
#define STRING_Rejang0 STR_R STR_e STR_j STR_a STR_n STR_g "\0"
|
|
||||||
#define STRING_Runic0 STR_R STR_u STR_n STR_i STR_c "\0"
|
|
||||||
#define STRING_S0 STR_S "\0"
|
|
||||||
#define STRING_Samaritan0 STR_S STR_a STR_m STR_a STR_r STR_i STR_t STR_a STR_n "\0"
|
|
||||||
#define STRING_Saurashtra0 STR_S STR_a STR_u STR_r STR_a STR_s STR_h STR_t STR_r STR_a "\0"
|
|
||||||
#define STRING_Sc0 STR_S STR_c "\0"
|
|
||||||
#define STRING_Sharada0 STR_S STR_h STR_a STR_r STR_a STR_d STR_a "\0"
|
|
||||||
#define STRING_Shavian0 STR_S STR_h STR_a STR_v STR_i STR_a STR_n "\0"
|
|
||||||
#define STRING_Siddham0 STR_S STR_i STR_d STR_d STR_h STR_a STR_m "\0"
|
|
||||||
#define STRING_Sinhala0 STR_S STR_i STR_n STR_h STR_a STR_l STR_a "\0"
|
|
||||||
#define STRING_Sk0 STR_S STR_k "\0"
|
|
||||||
#define STRING_Sm0 STR_S STR_m "\0"
|
|
||||||
#define STRING_So0 STR_S STR_o "\0"
|
|
||||||
#define STRING_Sora_Sompeng0 STR_S STR_o STR_r STR_a STR_UNDERSCORE STR_S STR_o STR_m STR_p STR_e STR_n STR_g "\0"
|
|
||||||
#define STRING_Sundanese0 STR_S STR_u STR_n STR_d STR_a STR_n STR_e STR_s STR_e "\0"
|
|
||||||
#define STRING_Syloti_Nagri0 STR_S STR_y STR_l STR_o STR_t STR_i STR_UNDERSCORE STR_N STR_a STR_g STR_r STR_i "\0"
|
|
||||||
#define STRING_Syriac0 STR_S STR_y STR_r STR_i STR_a STR_c "\0"
|
|
||||||
#define STRING_Tagalog0 STR_T STR_a STR_g STR_a STR_l STR_o STR_g "\0"
|
|
||||||
#define STRING_Tagbanwa0 STR_T STR_a STR_g STR_b STR_a STR_n STR_w STR_a "\0"
|
|
||||||
#define STRING_Tai_Le0 STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_e "\0"
|
|
||||||
#define STRING_Tai_Tham0 STR_T STR_a STR_i STR_UNDERSCORE STR_T STR_h STR_a STR_m "\0"
|
|
||||||
#define STRING_Tai_Viet0 STR_T STR_a STR_i STR_UNDERSCORE STR_V STR_i STR_e STR_t "\0"
|
|
||||||
#define STRING_Takri0 STR_T STR_a STR_k STR_r STR_i "\0"
|
|
||||||
#define STRING_Tamil0 STR_T STR_a STR_m STR_i STR_l "\0"
|
|
||||||
#define STRING_Telugu0 STR_T STR_e STR_l STR_u STR_g STR_u "\0"
|
|
||||||
#define STRING_Thaana0 STR_T STR_h STR_a STR_a STR_n STR_a "\0"
|
|
||||||
#define STRING_Thai0 STR_T STR_h STR_a STR_i "\0"
|
|
||||||
#define STRING_Tibetan0 STR_T STR_i STR_b STR_e STR_t STR_a STR_n "\0"
|
|
||||||
#define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h "\0"
|
|
||||||
#define STRING_Tirhuta0 STR_T STR_i STR_r STR_h STR_u STR_t STR_a "\0"
|
|
||||||
#define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0"
|
|
||||||
#define STRING_Vai0 STR_V STR_a STR_i "\0"
|
|
||||||
#define STRING_Warang_Citi0 STR_W STR_a STR_r STR_a STR_n STR_g STR_UNDERSCORE STR_C STR_i STR_t STR_i "\0"
|
|
||||||
#define STRING_Xan0 STR_X STR_a STR_n "\0"
|
|
||||||
#define STRING_Xps0 STR_X STR_p STR_s "\0"
|
|
||||||
#define STRING_Xsp0 STR_X STR_s STR_p "\0"
|
|
||||||
#define STRING_Xuc0 STR_X STR_u STR_c "\0"
|
|
||||||
#define STRING_Xwd0 STR_X STR_w STR_d "\0"
|
|
||||||
#define STRING_Yi0 STR_Y STR_i "\0"
|
|
||||||
#define STRING_Z0 STR_Z "\0"
|
|
||||||
#define STRING_Zl0 STR_Z STR_l "\0"
|
|
||||||
#define STRING_Zp0 STR_Z STR_p "\0"
|
|
||||||
#define STRING_Zs0 STR_Z STR_s "\0"
|
|
||||||
|
|
||||||
const char PRIV(utt_names)[] =
|
|
||||||
STRING_Any0
|
|
||||||
STRING_Arabic0
|
|
||||||
STRING_Armenian0
|
|
||||||
STRING_Avestan0
|
|
||||||
STRING_Balinese0
|
|
||||||
STRING_Bamum0
|
|
||||||
STRING_Bassa_Vah0
|
|
||||||
STRING_Batak0
|
|
||||||
STRING_Bengali0
|
|
||||||
STRING_Bopomofo0
|
|
||||||
STRING_Brahmi0
|
|
||||||
STRING_Braille0
|
|
||||||
STRING_Buginese0
|
|
||||||
STRING_Buhid0
|
|
||||||
STRING_C0
|
|
||||||
STRING_Canadian_Aboriginal0
|
|
||||||
STRING_Carian0
|
|
||||||
STRING_Caucasian_Albanian0
|
|
||||||
STRING_Cc0
|
|
||||||
STRING_Cf0
|
|
||||||
STRING_Chakma0
|
|
||||||
STRING_Cham0
|
|
||||||
STRING_Cherokee0
|
|
||||||
STRING_Cn0
|
|
||||||
STRING_Co0
|
|
||||||
STRING_Common0
|
|
||||||
STRING_Coptic0
|
|
||||||
STRING_Cs0
|
|
||||||
STRING_Cuneiform0
|
|
||||||
STRING_Cypriot0
|
|
||||||
STRING_Cyrillic0
|
|
||||||
STRING_Deseret0
|
|
||||||
STRING_Devanagari0
|
|
||||||
STRING_Duployan0
|
|
||||||
STRING_Egyptian_Hieroglyphs0
|
|
||||||
STRING_Elbasan0
|
|
||||||
STRING_Ethiopic0
|
|
||||||
STRING_Georgian0
|
|
||||||
STRING_Glagolitic0
|
|
||||||
STRING_Gothic0
|
|
||||||
STRING_Grantha0
|
|
||||||
STRING_Greek0
|
|
||||||
STRING_Gujarati0
|
|
||||||
STRING_Gurmukhi0
|
|
||||||
STRING_Han0
|
|
||||||
STRING_Hangul0
|
|
||||||
STRING_Hanunoo0
|
|
||||||
STRING_Hebrew0
|
|
||||||
STRING_Hiragana0
|
|
||||||
STRING_Imperial_Aramaic0
|
|
||||||
STRING_Inherited0
|
|
||||||
STRING_Inscriptional_Pahlavi0
|
|
||||||
STRING_Inscriptional_Parthian0
|
|
||||||
STRING_Javanese0
|
|
||||||
STRING_Kaithi0
|
|
||||||
STRING_Kannada0
|
|
||||||
STRING_Katakana0
|
|
||||||
STRING_Kayah_Li0
|
|
||||||
STRING_Kharoshthi0
|
|
||||||
STRING_Khmer0
|
|
||||||
STRING_Khojki0
|
|
||||||
STRING_Khudawadi0
|
|
||||||
STRING_L0
|
|
||||||
STRING_L_AMPERSAND0
|
|
||||||
STRING_Lao0
|
|
||||||
STRING_Latin0
|
|
||||||
STRING_Lepcha0
|
|
||||||
STRING_Limbu0
|
|
||||||
STRING_Linear_A0
|
|
||||||
STRING_Linear_B0
|
|
||||||
STRING_Lisu0
|
|
||||||
STRING_Ll0
|
|
||||||
STRING_Lm0
|
|
||||||
STRING_Lo0
|
|
||||||
STRING_Lt0
|
|
||||||
STRING_Lu0
|
|
||||||
STRING_Lycian0
|
|
||||||
STRING_Lydian0
|
|
||||||
STRING_M0
|
|
||||||
STRING_Mahajani0
|
|
||||||
STRING_Malayalam0
|
|
||||||
STRING_Mandaic0
|
|
||||||
STRING_Manichaean0
|
|
||||||
STRING_Mc0
|
|
||||||
STRING_Me0
|
|
||||||
STRING_Meetei_Mayek0
|
|
||||||
STRING_Mende_Kikakui0
|
|
||||||
STRING_Meroitic_Cursive0
|
|
||||||
STRING_Meroitic_Hieroglyphs0
|
|
||||||
STRING_Miao0
|
|
||||||
STRING_Mn0
|
|
||||||
STRING_Modi0
|
|
||||||
STRING_Mongolian0
|
|
||||||
STRING_Mro0
|
|
||||||
STRING_Myanmar0
|
|
||||||
STRING_N0
|
|
||||||
STRING_Nabataean0
|
|
||||||
STRING_Nd0
|
|
||||||
STRING_New_Tai_Lue0
|
|
||||||
STRING_Nko0
|
|
||||||
STRING_Nl0
|
|
||||||
STRING_No0
|
|
||||||
STRING_Ogham0
|
|
||||||
STRING_Ol_Chiki0
|
|
||||||
STRING_Old_Italic0
|
|
||||||
STRING_Old_North_Arabian0
|
|
||||||
STRING_Old_Permic0
|
|
||||||
STRING_Old_Persian0
|
|
||||||
STRING_Old_South_Arabian0
|
|
||||||
STRING_Old_Turkic0
|
|
||||||
STRING_Oriya0
|
|
||||||
STRING_Osmanya0
|
|
||||||
STRING_P0
|
|
||||||
STRING_Pahawh_Hmong0
|
|
||||||
STRING_Palmyrene0
|
|
||||||
STRING_Pau_Cin_Hau0
|
|
||||||
STRING_Pc0
|
|
||||||
STRING_Pd0
|
|
||||||
STRING_Pe0
|
|
||||||
STRING_Pf0
|
|
||||||
STRING_Phags_Pa0
|
|
||||||
STRING_Phoenician0
|
|
||||||
STRING_Pi0
|
|
||||||
STRING_Po0
|
|
||||||
STRING_Ps0
|
|
||||||
STRING_Psalter_Pahlavi0
|
|
||||||
STRING_Rejang0
|
|
||||||
STRING_Runic0
|
|
||||||
STRING_S0
|
|
||||||
STRING_Samaritan0
|
|
||||||
STRING_Saurashtra0
|
|
||||||
STRING_Sc0
|
|
||||||
STRING_Sharada0
|
|
||||||
STRING_Shavian0
|
|
||||||
STRING_Siddham0
|
|
||||||
STRING_Sinhala0
|
|
||||||
STRING_Sk0
|
|
||||||
STRING_Sm0
|
|
||||||
STRING_So0
|
|
||||||
STRING_Sora_Sompeng0
|
|
||||||
STRING_Sundanese0
|
|
||||||
STRING_Syloti_Nagri0
|
|
||||||
STRING_Syriac0
|
|
||||||
STRING_Tagalog0
|
|
||||||
STRING_Tagbanwa0
|
|
||||||
STRING_Tai_Le0
|
|
||||||
STRING_Tai_Tham0
|
|
||||||
STRING_Tai_Viet0
|
|
||||||
STRING_Takri0
|
|
||||||
STRING_Tamil0
|
|
||||||
STRING_Telugu0
|
|
||||||
STRING_Thaana0
|
|
||||||
STRING_Thai0
|
|
||||||
STRING_Tibetan0
|
|
||||||
STRING_Tifinagh0
|
|
||||||
STRING_Tirhuta0
|
|
||||||
STRING_Ugaritic0
|
|
||||||
STRING_Vai0
|
|
||||||
STRING_Warang_Citi0
|
|
||||||
STRING_Xan0
|
|
||||||
STRING_Xps0
|
|
||||||
STRING_Xsp0
|
|
||||||
STRING_Xuc0
|
|
||||||
STRING_Xwd0
|
|
||||||
STRING_Yi0
|
|
||||||
STRING_Z0
|
|
||||||
STRING_Zl0
|
|
||||||
STRING_Zp0
|
|
||||||
STRING_Zs0;
|
|
||||||
|
|
||||||
const ucp_type_table PRIV(utt)[] = {
|
|
||||||
{ 0, PT_ANY, 0 },
|
|
||||||
{ 4, PT_SC, ucp_Arabic },
|
|
||||||
{ 11, PT_SC, ucp_Armenian },
|
|
||||||
{ 20, PT_SC, ucp_Avestan },
|
|
||||||
{ 28, PT_SC, ucp_Balinese },
|
|
||||||
{ 37, PT_SC, ucp_Bamum },
|
|
||||||
{ 43, PT_SC, ucp_Bassa_Vah },
|
|
||||||
{ 53, PT_SC, ucp_Batak },
|
|
||||||
{ 59, PT_SC, ucp_Bengali },
|
|
||||||
{ 67, PT_SC, ucp_Bopomofo },
|
|
||||||
{ 76, PT_SC, ucp_Brahmi },
|
|
||||||
{ 83, PT_SC, ucp_Braille },
|
|
||||||
{ 91, PT_SC, ucp_Buginese },
|
|
||||||
{ 100, PT_SC, ucp_Buhid },
|
|
||||||
{ 106, PT_GC, ucp_C },
|
|
||||||
{ 108, PT_SC, ucp_Canadian_Aboriginal },
|
|
||||||
{ 128, PT_SC, ucp_Carian },
|
|
||||||
{ 135, PT_SC, ucp_Caucasian_Albanian },
|
|
||||||
{ 154, PT_PC, ucp_Cc },
|
|
||||||
{ 157, PT_PC, ucp_Cf },
|
|
||||||
{ 160, PT_SC, ucp_Chakma },
|
|
||||||
{ 167, PT_SC, ucp_Cham },
|
|
||||||
{ 172, PT_SC, ucp_Cherokee },
|
|
||||||
{ 181, PT_PC, ucp_Cn },
|
|
||||||
{ 184, PT_PC, ucp_Co },
|
|
||||||
{ 187, PT_SC, ucp_Common },
|
|
||||||
{ 194, PT_SC, ucp_Coptic },
|
|
||||||
{ 201, PT_PC, ucp_Cs },
|
|
||||||
{ 204, PT_SC, ucp_Cuneiform },
|
|
||||||
{ 214, PT_SC, ucp_Cypriot },
|
|
||||||
{ 222, PT_SC, ucp_Cyrillic },
|
|
||||||
{ 231, PT_SC, ucp_Deseret },
|
|
||||||
{ 239, PT_SC, ucp_Devanagari },
|
|
||||||
{ 250, PT_SC, ucp_Duployan },
|
|
||||||
{ 259, PT_SC, ucp_Egyptian_Hieroglyphs },
|
|
||||||
{ 280, PT_SC, ucp_Elbasan },
|
|
||||||
{ 288, PT_SC, ucp_Ethiopic },
|
|
||||||
{ 297, PT_SC, ucp_Georgian },
|
|
||||||
{ 306, PT_SC, ucp_Glagolitic },
|
|
||||||
{ 317, PT_SC, ucp_Gothic },
|
|
||||||
{ 324, PT_SC, ucp_Grantha },
|
|
||||||
{ 332, PT_SC, ucp_Greek },
|
|
||||||
{ 338, PT_SC, ucp_Gujarati },
|
|
||||||
{ 347, PT_SC, ucp_Gurmukhi },
|
|
||||||
{ 356, PT_SC, ucp_Han },
|
|
||||||
{ 360, PT_SC, ucp_Hangul },
|
|
||||||
{ 367, PT_SC, ucp_Hanunoo },
|
|
||||||
{ 375, PT_SC, ucp_Hebrew },
|
|
||||||
{ 382, PT_SC, ucp_Hiragana },
|
|
||||||
{ 391, PT_SC, ucp_Imperial_Aramaic },
|
|
||||||
{ 408, PT_SC, ucp_Inherited },
|
|
||||||
{ 418, PT_SC, ucp_Inscriptional_Pahlavi },
|
|
||||||
{ 440, PT_SC, ucp_Inscriptional_Parthian },
|
|
||||||
{ 463, PT_SC, ucp_Javanese },
|
|
||||||
{ 472, PT_SC, ucp_Kaithi },
|
|
||||||
{ 479, PT_SC, ucp_Kannada },
|
|
||||||
{ 487, PT_SC, ucp_Katakana },
|
|
||||||
{ 496, PT_SC, ucp_Kayah_Li },
|
|
||||||
{ 505, PT_SC, ucp_Kharoshthi },
|
|
||||||
{ 516, PT_SC, ucp_Khmer },
|
|
||||||
{ 522, PT_SC, ucp_Khojki },
|
|
||||||
{ 529, PT_SC, ucp_Khudawadi },
|
|
||||||
{ 539, PT_GC, ucp_L },
|
|
||||||
{ 541, PT_LAMP, 0 },
|
|
||||||
{ 544, PT_SC, ucp_Lao },
|
|
||||||
{ 548, PT_SC, ucp_Latin },
|
|
||||||
{ 554, PT_SC, ucp_Lepcha },
|
|
||||||
{ 561, PT_SC, ucp_Limbu },
|
|
||||||
{ 567, PT_SC, ucp_Linear_A },
|
|
||||||
{ 576, PT_SC, ucp_Linear_B },
|
|
||||||
{ 585, PT_SC, ucp_Lisu },
|
|
||||||
{ 590, PT_PC, ucp_Ll },
|
|
||||||
{ 593, PT_PC, ucp_Lm },
|
|
||||||
{ 596, PT_PC, ucp_Lo },
|
|
||||||
{ 599, PT_PC, ucp_Lt },
|
|
||||||
{ 602, PT_PC, ucp_Lu },
|
|
||||||
{ 605, PT_SC, ucp_Lycian },
|
|
||||||
{ 612, PT_SC, ucp_Lydian },
|
|
||||||
{ 619, PT_GC, ucp_M },
|
|
||||||
{ 621, PT_SC, ucp_Mahajani },
|
|
||||||
{ 630, PT_SC, ucp_Malayalam },
|
|
||||||
{ 640, PT_SC, ucp_Mandaic },
|
|
||||||
{ 648, PT_SC, ucp_Manichaean },
|
|
||||||
{ 659, PT_PC, ucp_Mc },
|
|
||||||
{ 662, PT_PC, ucp_Me },
|
|
||||||
{ 665, PT_SC, ucp_Meetei_Mayek },
|
|
||||||
{ 678, PT_SC, ucp_Mende_Kikakui },
|
|
||||||
{ 692, PT_SC, ucp_Meroitic_Cursive },
|
|
||||||
{ 709, PT_SC, ucp_Meroitic_Hieroglyphs },
|
|
||||||
{ 730, PT_SC, ucp_Miao },
|
|
||||||
{ 735, PT_PC, ucp_Mn },
|
|
||||||
{ 738, PT_SC, ucp_Modi },
|
|
||||||
{ 743, PT_SC, ucp_Mongolian },
|
|
||||||
{ 753, PT_SC, ucp_Mro },
|
|
||||||
{ 757, PT_SC, ucp_Myanmar },
|
|
||||||
{ 765, PT_GC, ucp_N },
|
|
||||||
{ 767, PT_SC, ucp_Nabataean },
|
|
||||||
{ 777, PT_PC, ucp_Nd },
|
|
||||||
{ 780, PT_SC, ucp_New_Tai_Lue },
|
|
||||||
{ 792, PT_SC, ucp_Nko },
|
|
||||||
{ 796, PT_PC, ucp_Nl },
|
|
||||||
{ 799, PT_PC, ucp_No },
|
|
||||||
{ 802, PT_SC, ucp_Ogham },
|
|
||||||
{ 808, PT_SC, ucp_Ol_Chiki },
|
|
||||||
{ 817, PT_SC, ucp_Old_Italic },
|
|
||||||
{ 828, PT_SC, ucp_Old_North_Arabian },
|
|
||||||
{ 846, PT_SC, ucp_Old_Permic },
|
|
||||||
{ 857, PT_SC, ucp_Old_Persian },
|
|
||||||
{ 869, PT_SC, ucp_Old_South_Arabian },
|
|
||||||
{ 887, PT_SC, ucp_Old_Turkic },
|
|
||||||
{ 898, PT_SC, ucp_Oriya },
|
|
||||||
{ 904, PT_SC, ucp_Osmanya },
|
|
||||||
{ 912, PT_GC, ucp_P },
|
|
||||||
{ 914, PT_SC, ucp_Pahawh_Hmong },
|
|
||||||
{ 927, PT_SC, ucp_Palmyrene },
|
|
||||||
{ 937, PT_SC, ucp_Pau_Cin_Hau },
|
|
||||||
{ 949, PT_PC, ucp_Pc },
|
|
||||||
{ 952, PT_PC, ucp_Pd },
|
|
||||||
{ 955, PT_PC, ucp_Pe },
|
|
||||||
{ 958, PT_PC, ucp_Pf },
|
|
||||||
{ 961, PT_SC, ucp_Phags_Pa },
|
|
||||||
{ 970, PT_SC, ucp_Phoenician },
|
|
||||||
{ 981, PT_PC, ucp_Pi },
|
|
||||||
{ 984, PT_PC, ucp_Po },
|
|
||||||
{ 987, PT_PC, ucp_Ps },
|
|
||||||
{ 990, PT_SC, ucp_Psalter_Pahlavi },
|
|
||||||
{ 1006, PT_SC, ucp_Rejang },
|
|
||||||
{ 1013, PT_SC, ucp_Runic },
|
|
||||||
{ 1019, PT_GC, ucp_S },
|
|
||||||
{ 1021, PT_SC, ucp_Samaritan },
|
|
||||||
{ 1031, PT_SC, ucp_Saurashtra },
|
|
||||||
{ 1042, PT_PC, ucp_Sc },
|
|
||||||
{ 1045, PT_SC, ucp_Sharada },
|
|
||||||
{ 1053, PT_SC, ucp_Shavian },
|
|
||||||
{ 1061, PT_SC, ucp_Siddham },
|
|
||||||
{ 1069, PT_SC, ucp_Sinhala },
|
|
||||||
{ 1077, PT_PC, ucp_Sk },
|
|
||||||
{ 1080, PT_PC, ucp_Sm },
|
|
||||||
{ 1083, PT_PC, ucp_So },
|
|
||||||
{ 1086, PT_SC, ucp_Sora_Sompeng },
|
|
||||||
{ 1099, PT_SC, ucp_Sundanese },
|
|
||||||
{ 1109, PT_SC, ucp_Syloti_Nagri },
|
|
||||||
{ 1122, PT_SC, ucp_Syriac },
|
|
||||||
{ 1129, PT_SC, ucp_Tagalog },
|
|
||||||
{ 1137, PT_SC, ucp_Tagbanwa },
|
|
||||||
{ 1146, PT_SC, ucp_Tai_Le },
|
|
||||||
{ 1153, PT_SC, ucp_Tai_Tham },
|
|
||||||
{ 1162, PT_SC, ucp_Tai_Viet },
|
|
||||||
{ 1171, PT_SC, ucp_Takri },
|
|
||||||
{ 1177, PT_SC, ucp_Tamil },
|
|
||||||
{ 1183, PT_SC, ucp_Telugu },
|
|
||||||
{ 1190, PT_SC, ucp_Thaana },
|
|
||||||
{ 1197, PT_SC, ucp_Thai },
|
|
||||||
{ 1202, PT_SC, ucp_Tibetan },
|
|
||||||
{ 1210, PT_SC, ucp_Tifinagh },
|
|
||||||
{ 1219, PT_SC, ucp_Tirhuta },
|
|
||||||
{ 1227, PT_SC, ucp_Ugaritic },
|
|
||||||
{ 1236, PT_SC, ucp_Vai },
|
|
||||||
{ 1240, PT_SC, ucp_Warang_Citi },
|
|
||||||
{ 1252, PT_ALNUM, 0 },
|
|
||||||
{ 1256, PT_PXSPACE, 0 },
|
|
||||||
{ 1260, PT_SPACE, 0 },
|
|
||||||
{ 1264, PT_UCNC, 0 },
|
|
||||||
{ 1268, PT_WORD, 0 },
|
|
||||||
{ 1272, PT_SC, ucp_Yi },
|
|
||||||
{ 1275, PT_GC, ucp_Z },
|
|
||||||
{ 1277, PT_PC, ucp_Zl },
|
|
||||||
{ 1280, PT_PC, ucp_Zp },
|
|
||||||
{ 1283, PT_PC, ucp_Zs }
|
|
||||||
};
|
|
||||||
|
|
||||||
const int PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
|
|
||||||
|
|
||||||
#endif /* SUPPORT_UTF */
|
|
||||||
|
|
||||||
/* End of pcre_tables.c */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,302 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2013 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 for validating UTF-8 character
|
|
||||||
strings. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Validate a UTF-8 string *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* This function is called (optionally) at the start of compile or match, to
|
|
||||||
check that a supposed UTF-8 string is actually valid. The early check means
|
|
||||||
that subsequent code can assume it is dealing with a valid string. The check
|
|
||||||
can be turned off for maximum performance, but the consequences of supplying an
|
|
||||||
invalid string are then undefined.
|
|
||||||
|
|
||||||
Originally, this function checked according to RFC 2279, allowing for values in
|
|
||||||
the range 0 to 0x7fffffff, up to 6 bytes long, but ensuring that they were in
|
|
||||||
the canonical format. Once somebody had pointed out RFC 3629 to me (it
|
|
||||||
obsoletes 2279), additional restrictions were applied. The values are now
|
|
||||||
limited to be between 0 and 0x0010ffff, no more than 4 bytes long, and the
|
|
||||||
subrange 0xd000 to 0xdfff is excluded. However, the format of 5-byte and 6-byte
|
|
||||||
characters is still checked.
|
|
||||||
|
|
||||||
From release 8.13 more information about the details of the error are passed
|
|
||||||
back in the returned value:
|
|
||||||
|
|
||||||
PCRE_UTF8_ERR0 No error
|
|
||||||
PCRE_UTF8_ERR1 Missing 1 byte at the end of the string
|
|
||||||
PCRE_UTF8_ERR2 Missing 2 bytes at the end of the string
|
|
||||||
PCRE_UTF8_ERR3 Missing 3 bytes at the end of the string
|
|
||||||
PCRE_UTF8_ERR4 Missing 4 bytes at the end of the string
|
|
||||||
PCRE_UTF8_ERR5 Missing 5 bytes at the end of the string
|
|
||||||
PCRE_UTF8_ERR6 2nd-byte's two top bits are not 0x80
|
|
||||||
PCRE_UTF8_ERR7 3rd-byte's two top bits are not 0x80
|
|
||||||
PCRE_UTF8_ERR8 4th-byte's two top bits are not 0x80
|
|
||||||
PCRE_UTF8_ERR9 5th-byte's two top bits are not 0x80
|
|
||||||
PCRE_UTF8_ERR10 6th-byte's two top bits are not 0x80
|
|
||||||
PCRE_UTF8_ERR11 5-byte character is not permitted by RFC 3629
|
|
||||||
PCRE_UTF8_ERR12 6-byte character is not permitted by RFC 3629
|
|
||||||
PCRE_UTF8_ERR13 4-byte character with value > 0x10ffff is not permitted
|
|
||||||
PCRE_UTF8_ERR14 3-byte character with value 0xd000-0xdfff is not permitted
|
|
||||||
PCRE_UTF8_ERR15 Overlong 2-byte sequence
|
|
||||||
PCRE_UTF8_ERR16 Overlong 3-byte sequence
|
|
||||||
PCRE_UTF8_ERR17 Overlong 4-byte sequence
|
|
||||||
PCRE_UTF8_ERR18 Overlong 5-byte sequence (won't ever occur)
|
|
||||||
PCRE_UTF8_ERR19 Overlong 6-byte sequence (won't ever occur)
|
|
||||||
PCRE_UTF8_ERR20 Isolated 0x80 byte (not within UTF-8 character)
|
|
||||||
PCRE_UTF8_ERR21 Byte with the illegal value 0xfe or 0xff
|
|
||||||
PCRE_UTF8_ERR22 Unused (was non-character)
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
string points to the string
|
|
||||||
length length of string, or -1 if the string is zero-terminated
|
|
||||||
errp pointer to an error position offset variable
|
|
||||||
|
|
||||||
Returns: = 0 if the string is a valid UTF-8 string
|
|
||||||
> 0 otherwise, setting the offset of the bad character
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset)
|
|
||||||
{
|
|
||||||
#ifdef SUPPORT_UTF
|
|
||||||
register PCRE_PUCHAR p;
|
|
||||||
|
|
||||||
if (length < 0)
|
|
||||||
{
|
|
||||||
for (p = string; *p != 0; p++);
|
|
||||||
length = (int)(p - string);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (p = string; length-- > 0; p++)
|
|
||||||
{
|
|
||||||
register pcre_uchar ab, c, d;
|
|
||||||
|
|
||||||
c = *p;
|
|
||||||
if (c < 128) continue; /* ASCII character */
|
|
||||||
|
|
||||||
if (c < 0xc0) /* Isolated 10xx xxxx byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string);
|
|
||||||
return PCRE_UTF8_ERR20;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c >= 0xfe) /* Invalid 0xfe or 0xff bytes */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string);
|
|
||||||
return PCRE_UTF8_ERR21;
|
|
||||||
}
|
|
||||||
|
|
||||||
ab = PRIV(utf8_table4)[c & 0x3f]; /* Number of additional bytes */
|
|
||||||
if (length < ab)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string); /* Missing bytes */
|
|
||||||
return ab - length; /* Codes ERR1 to ERR5 */
|
|
||||||
}
|
|
||||||
length -= ab; /* Length remaining */
|
|
||||||
|
|
||||||
/* Check top bits in the second byte */
|
|
||||||
|
|
||||||
if (((d = *(++p)) & 0xc0) != 0x80)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 1;
|
|
||||||
return PCRE_UTF8_ERR6;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For each length, check that the remaining bytes start with the 0x80 bit
|
|
||||||
set and not the 0x40 bit. Then check for an overlong sequence, and for the
|
|
||||||
excluded range 0xd800 to 0xdfff. */
|
|
||||||
|
|
||||||
switch (ab)
|
|
||||||
{
|
|
||||||
/* 2-byte character. No further bytes to check for 0x80. Check first byte
|
|
||||||
for for xx00 000x (overlong sequence). */
|
|
||||||
|
|
||||||
case 1: if ((c & 0x3e) == 0)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 1;
|
|
||||||
return PCRE_UTF8_ERR15;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* 3-byte character. Check third byte for 0x80. Then check first 2 bytes
|
|
||||||
for 1110 0000, xx0x xxxx (overlong sequence) or
|
|
||||||
1110 1101, 1010 xxxx (0xd800 - 0xdfff) */
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Third byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 2;
|
|
||||||
return PCRE_UTF8_ERR7;
|
|
||||||
}
|
|
||||||
if (c == 0xe0 && (d & 0x20) == 0)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 2;
|
|
||||||
return PCRE_UTF8_ERR16;
|
|
||||||
}
|
|
||||||
if (c == 0xed && d >= 0xa0)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 2;
|
|
||||||
return PCRE_UTF8_ERR14;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* 4-byte character. Check 3rd and 4th bytes for 0x80. Then check first 2
|
|
||||||
bytes for for 1111 0000, xx00 xxxx (overlong sequence), then check for a
|
|
||||||
character greater than 0x0010ffff (f4 8f bf bf) */
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Third byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 2;
|
|
||||||
return PCRE_UTF8_ERR7;
|
|
||||||
}
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 3;
|
|
||||||
return PCRE_UTF8_ERR8;
|
|
||||||
}
|
|
||||||
if (c == 0xf0 && (d & 0x30) == 0)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 3;
|
|
||||||
return PCRE_UTF8_ERR17;
|
|
||||||
}
|
|
||||||
if (c > 0xf4 || (c == 0xf4 && d > 0x8f))
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 3;
|
|
||||||
return PCRE_UTF8_ERR13;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* 5-byte and 6-byte characters are not allowed by RFC 3629, and will be
|
|
||||||
rejected by the length test below. However, we do the appropriate tests
|
|
||||||
here so that overlong sequences get diagnosed, and also in case there is
|
|
||||||
ever an option for handling these larger code points. */
|
|
||||||
|
|
||||||
/* 5-byte character. Check 3rd, 4th, and 5th bytes for 0x80. Then check for
|
|
||||||
1111 1000, xx00 0xxx */
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Third byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 2;
|
|
||||||
return PCRE_UTF8_ERR7;
|
|
||||||
}
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 3;
|
|
||||||
return PCRE_UTF8_ERR8;
|
|
||||||
}
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Fifth byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 4;
|
|
||||||
return PCRE_UTF8_ERR9;
|
|
||||||
}
|
|
||||||
if (c == 0xf8 && (d & 0x38) == 0)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 4;
|
|
||||||
return PCRE_UTF8_ERR18;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* 6-byte character. Check 3rd-6th bytes for 0x80. Then check for
|
|
||||||
1111 1100, xx00 00xx. */
|
|
||||||
|
|
||||||
case 5:
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Third byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 2;
|
|
||||||
return PCRE_UTF8_ERR7;
|
|
||||||
}
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 3;
|
|
||||||
return PCRE_UTF8_ERR8;
|
|
||||||
}
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Fifth byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 4;
|
|
||||||
return PCRE_UTF8_ERR9;
|
|
||||||
}
|
|
||||||
if ((*(++p) & 0xc0) != 0x80) /* Sixth byte */
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 5;
|
|
||||||
return PCRE_UTF8_ERR10;
|
|
||||||
}
|
|
||||||
if (c == 0xfc && (d & 0x3c) == 0)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - 5;
|
|
||||||
return PCRE_UTF8_ERR19;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Character is valid under RFC 2279, but 4-byte and 5-byte characters are
|
|
||||||
excluded by RFC 3629. The pointer p is currently at the last byte of the
|
|
||||||
character. */
|
|
||||||
|
|
||||||
if (ab > 3)
|
|
||||||
{
|
|
||||||
*erroroffset = (int)(p - string) - ab;
|
|
||||||
return (ab == 4)? PCRE_UTF8_ERR11 : PCRE_UTF8_ERR12;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* Not SUPPORT_UTF */
|
|
||||||
(void)(string); /* Keep picky compilers happy */
|
|
||||||
(void)(length);
|
|
||||||
(void)(erroroffset);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return PCRE_UTF8_ERR0; /* This indicates success */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_valid_utf8.c */
|
|
||||||
@ -1,99 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2012 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. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "pcre_internal.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************
|
|
||||||
* Return version string *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/* These macros are the standard way of turning unquoted text into C strings.
|
|
||||||
They allow macros like PCRE_MAJOR to be defined without quotes, which is
|
|
||||||
convenient for user programs that want to test its value. */
|
|
||||||
|
|
||||||
#define STRING(a) # a
|
|
||||||
#define XSTRING(s) STRING(s)
|
|
||||||
|
|
||||||
/* A problem turned up with PCRE_PRERELEASE, which is defined empty for
|
|
||||||
production releases. Originally, it was used naively in this code:
|
|
||||||
|
|
||||||
return XSTRING(PCRE_MAJOR)
|
|
||||||
"." XSTRING(PCRE_MINOR)
|
|
||||||
XSTRING(PCRE_PRERELEASE)
|
|
||||||
" " XSTRING(PCRE_DATE);
|
|
||||||
|
|
||||||
However, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of
|
|
||||||
STRING(). The C standard states: "If (before argument substitution) any
|
|
||||||
argument consists of no preprocessing tokens, the behavior is undefined." It
|
|
||||||
turns out the gcc treats this case as a single empty string - which is what we
|
|
||||||
really want - but Visual C grumbles about the lack of an argument for the
|
|
||||||
macro. Unfortunately, both are within their rights. To cope with both ways of
|
|
||||||
handling this, I had resort to some messy hackery that does a test at run time.
|
|
||||||
I could find no way of detecting that a macro is defined as an empty string at
|
|
||||||
pre-processor time. This hack uses a standard trick for avoiding calling
|
|
||||||
the STRING macro with an empty argument when doing the test. */
|
|
||||||
|
|
||||||
#if defined COMPILE_PCRE8
|
|
||||||
PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION
|
|
||||||
pcre_version(void)
|
|
||||||
#elif defined COMPILE_PCRE16
|
|
||||||
PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION
|
|
||||||
pcre16_version(void)
|
|
||||||
#elif defined COMPILE_PCRE32
|
|
||||||
PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION
|
|
||||||
pcre32_version(void)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return (XSTRING(Z PCRE_PRERELEASE)[1] == 0)?
|
|
||||||
XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) :
|
|
||||||
XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_version.c */
|
|
||||||
@ -1,269 +0,0 @@
|
|||||||
#define HAVE_CONFIG_H
|
|
||||||
/*************************************************
|
|
||||||
* 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-2013 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. It is used by both pcre_exec() and pcre_def_exec(). */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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 and/or Unicode properties.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
c the character
|
|
||||||
data points to the flag byte of the XCLASS data
|
|
||||||
|
|
||||||
Returns: TRUE if character matches, else FALSE
|
|
||||||
*/
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
PRIV(xclass)(pcre_uint32 c, const pcre_uchar *data, BOOL utf)
|
|
||||||
{
|
|
||||||
pcre_uchar t;
|
|
||||||
BOOL negated = (*data & XCL_NOT) != 0;
|
|
||||||
|
|
||||||
(void)utf;
|
|
||||||
#ifdef COMPILE_PCRE8
|
|
||||||
/* In 8 bit mode, this must always be TRUE. Help the compiler to know that. */
|
|
||||||
utf = TRUE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* 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_HASPROP) == 0)
|
|
||||||
{
|
|
||||||
if ((*data & XCL_MAP) == 0) return negated;
|
|
||||||
return (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0;
|
|
||||||
}
|
|
||||||
if ((*data & XCL_MAP) != 0 &&
|
|
||||||
(((pcre_uint8 *)(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 / sizeof(pcre_uchar);
|
|
||||||
|
|
||||||
while ((t = *data++) != XCL_END)
|
|
||||||
{
|
|
||||||
pcre_uint32 x, y;
|
|
||||||
if (t == XCL_SINGLE)
|
|
||||||
{
|
|
||||||
#ifdef SUPPORT_UTF
|
|
||||||
if (utf)
|
|
||||||
{
|
|
||||||
GETCHARINC(x, data); /* macro generates multiple statements */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
x = *data++;
|
|
||||||
if (c == x) return !negated;
|
|
||||||
}
|
|
||||||
else if (t == XCL_RANGE)
|
|
||||||
{
|
|
||||||
#ifdef SUPPORT_UTF
|
|
||||||
if (utf)
|
|
||||||
{
|
|
||||||
GETCHARINC(x, data); /* macro generates multiple statements */
|
|
||||||
GETCHARINC(y, data); /* macro generates multiple statements */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
x = *data++;
|
|
||||||
y = *data++;
|
|
||||||
}
|
|
||||||
if (c >= x && c <= y) return !negated;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SUPPORT_UCP
|
|
||||||
else /* XCL_PROP & XCL_NOTPROP */
|
|
||||||
{
|
|
||||||
const ucd_record *prop = GET_UCD(c);
|
|
||||||
BOOL isprop = t == XCL_PROP;
|
|
||||||
|
|
||||||
switch(*data)
|
|
||||||
{
|
|
||||||
case PT_ANY:
|
|
||||||
if (isprop) return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PT_LAMP:
|
|
||||||
if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
|
|
||||||
prop->chartype == ucp_Lt) == isprop) return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PT_GC:
|
|
||||||
if ((data[1] == PRIV(ucp_gentype)[prop->chartype]) == isprop)
|
|
||||||
return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PT_PC:
|
|
||||||
if ((data[1] == prop->chartype) == isprop) return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PT_SC:
|
|
||||||
if ((data[1] == prop->script) == isprop) return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PT_ALNUM:
|
|
||||||
if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
|
|
||||||
PRIV(ucp_gentype)[prop->chartype] == ucp_N) == isprop)
|
|
||||||
return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Perl space used to exclude VT, but from Perl 5.18 it is included,
|
|
||||||
which means that Perl space and POSIX space are now identical. PCRE
|
|
||||||
was changed at release 8.34. */
|
|
||||||
|
|
||||||
case PT_SPACE: /* Perl space */
|
|
||||||
case PT_PXSPACE: /* POSIX space */
|
|
||||||
switch(c)
|
|
||||||
{
|
|
||||||
HSPACE_CASES:
|
|
||||||
VSPACE_CASES:
|
|
||||||
if (isprop) return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == isprop)
|
|
||||||
return !negated;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PT_WORD:
|
|
||||||
if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
|
|
||||||
PRIV(ucp_gentype)[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE)
|
|
||||||
== isprop)
|
|
||||||
return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PT_UCNC:
|
|
||||||
if (c < 0xa0)
|
|
||||||
{
|
|
||||||
if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
|
|
||||||
c == CHAR_GRAVE_ACCENT) == isprop)
|
|
||||||
return !negated;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((c < 0xd800 || c > 0xdfff) == isprop)
|
|
||||||
return !negated;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* The following three properties can occur only in an XCLASS, as there
|
|
||||||
is no \p or \P coding for them. */
|
|
||||||
|
|
||||||
/* Graphic character. Implement this as not Z (space or separator) and
|
|
||||||
not C (other), except for Cf (format) with a few exceptions. This seems
|
|
||||||
to be what Perl does. The exceptional characters are:
|
|
||||||
|
|
||||||
U+061C Arabic Letter Mark
|
|
||||||
U+180E Mongolian Vowel Separator
|
|
||||||
U+2066 - U+2069 Various "isolate"s
|
|
||||||
*/
|
|
||||||
|
|
||||||
case PT_PXGRAPH:
|
|
||||||
if ((PRIV(ucp_gentype)[prop->chartype] != ucp_Z &&
|
|
||||||
(PRIV(ucp_gentype)[prop->chartype] != ucp_C ||
|
|
||||||
(prop->chartype == ucp_Cf &&
|
|
||||||
c != 0x061c && c != 0x180e && (c < 0x2066 || c > 0x2069))
|
|
||||||
)) == isprop)
|
|
||||||
return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Printable character: same as graphic, with the addition of Zs, i.e.
|
|
||||||
not Zl and not Zp, and U+180E. */
|
|
||||||
|
|
||||||
case PT_PXPRINT:
|
|
||||||
if ((prop->chartype != ucp_Zl &&
|
|
||||||
prop->chartype != ucp_Zp &&
|
|
||||||
(PRIV(ucp_gentype)[prop->chartype] != ucp_C ||
|
|
||||||
(prop->chartype == ucp_Cf &&
|
|
||||||
c != 0x061c && (c < 0x2066 || c > 0x2069))
|
|
||||||
)) == isprop)
|
|
||||||
return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Punctuation: all Unicode punctuation, plus ASCII characters that
|
|
||||||
Unicode treats as symbols rather than punctuation, for Perl
|
|
||||||
compatibility (these are $+<=>^`|~). */
|
|
||||||
|
|
||||||
case PT_PXPUNCT:
|
|
||||||
if ((PRIV(ucp_gentype)[prop->chartype] == ucp_P ||
|
|
||||||
(c < 128 && PRIV(ucp_gentype)[prop->chartype] == ucp_S)) == isprop)
|
|
||||||
return !negated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* This should never occur, but compilers may mutter if there is no
|
|
||||||
default. */
|
|
||||||
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
data += 2;
|
|
||||||
}
|
|
||||||
#endif /* SUPPORT_UCP */
|
|
||||||
}
|
|
||||||
|
|
||||||
return negated; /* char did not match */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of pcre_xclass.c */
|
|
||||||
@ -1,224 +0,0 @@
|
|||||||
/*************************************************
|
|
||||||
* Unicode Property Table handler *
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
#ifndef _UCP_H
|
|
||||||
#define _UCP_H
|
|
||||||
|
|
||||||
/* This file contains definitions of the property values that are returned by
|
|
||||||
the UCD access macros. New values that are added for new releases of Unicode
|
|
||||||
should always be at the end of each enum, for backwards compatibility.
|
|
||||||
|
|
||||||
IMPORTANT: Note also that the specific numeric values of the enums have to be
|
|
||||||
the same as the values that are generated by the maint/MultiStage2.py script,
|
|
||||||
where the equivalent property descriptive names are listed in vectors.
|
|
||||||
|
|
||||||
ALSO: The specific values of the first two enums are assumed for the table
|
|
||||||
called catposstab in pcre_compile.c. */
|
|
||||||
|
|
||||||
/* These are the general character categories. */
|
|
||||||
|
|
||||||
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 particular character categories. */
|
|
||||||
|
|
||||||
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 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* These are grapheme break properties. Note that the code for processing them
|
|
||||||
assumes that the values are less than 16. If more values are added that take
|
|
||||||
the number to 16 or more, the code will have to be rewritten. */
|
|
||||||
|
|
||||||
enum {
|
|
||||||
ucp_gbCR, /* 0 */
|
|
||||||
ucp_gbLF, /* 1 */
|
|
||||||
ucp_gbControl, /* 2 */
|
|
||||||
ucp_gbExtend, /* 3 */
|
|
||||||
ucp_gbPrepend, /* 4 */
|
|
||||||
ucp_gbSpacingMark, /* 5 */
|
|
||||||
ucp_gbL, /* 6 Hangul syllable type L */
|
|
||||||
ucp_gbV, /* 7 Hangul syllable type V */
|
|
||||||
ucp_gbT, /* 8 Hangul syllable type T */
|
|
||||||
ucp_gbLV, /* 9 Hangul syllable type LV */
|
|
||||||
ucp_gbLVT, /* 10 Hangul syllable type LVT */
|
|
||||||
ucp_gbRegionalIndicator, /* 11 */
|
|
||||||
ucp_gbOther /* 12 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* These are the script identifications. */
|
|
||||||
|
|
||||||
enum {
|
|
||||||
ucp_Arabic,
|
|
||||||
ucp_Armenian,
|
|
||||||
ucp_Bengali,
|
|
||||||
ucp_Bopomofo,
|
|
||||||
ucp_Braille,
|
|
||||||
ucp_Buginese,
|
|
||||||
ucp_Buhid,
|
|
||||||
ucp_Canadian_Aboriginal,
|
|
||||||
ucp_Cherokee,
|
|
||||||
ucp_Common,
|
|
||||||
ucp_Coptic,
|
|
||||||
ucp_Cypriot,
|
|
||||||
ucp_Cyrillic,
|
|
||||||
ucp_Deseret,
|
|
||||||
ucp_Devanagari,
|
|
||||||
ucp_Ethiopic,
|
|
||||||
ucp_Georgian,
|
|
||||||
ucp_Glagolitic,
|
|
||||||
ucp_Gothic,
|
|
||||||
ucp_Greek,
|
|
||||||
ucp_Gujarati,
|
|
||||||
ucp_Gurmukhi,
|
|
||||||
ucp_Han,
|
|
||||||
ucp_Hangul,
|
|
||||||
ucp_Hanunoo,
|
|
||||||
ucp_Hebrew,
|
|
||||||
ucp_Hiragana,
|
|
||||||
ucp_Inherited,
|
|
||||||
ucp_Kannada,
|
|
||||||
ucp_Katakana,
|
|
||||||
ucp_Kharoshthi,
|
|
||||||
ucp_Khmer,
|
|
||||||
ucp_Lao,
|
|
||||||
ucp_Latin,
|
|
||||||
ucp_Limbu,
|
|
||||||
ucp_Linear_B,
|
|
||||||
ucp_Malayalam,
|
|
||||||
ucp_Mongolian,
|
|
||||||
ucp_Myanmar,
|
|
||||||
ucp_New_Tai_Lue,
|
|
||||||
ucp_Ogham,
|
|
||||||
ucp_Old_Italic,
|
|
||||||
ucp_Old_Persian,
|
|
||||||
ucp_Oriya,
|
|
||||||
ucp_Osmanya,
|
|
||||||
ucp_Runic,
|
|
||||||
ucp_Shavian,
|
|
||||||
ucp_Sinhala,
|
|
||||||
ucp_Syloti_Nagri,
|
|
||||||
ucp_Syriac,
|
|
||||||
ucp_Tagalog,
|
|
||||||
ucp_Tagbanwa,
|
|
||||||
ucp_Tai_Le,
|
|
||||||
ucp_Tamil,
|
|
||||||
ucp_Telugu,
|
|
||||||
ucp_Thaana,
|
|
||||||
ucp_Thai,
|
|
||||||
ucp_Tibetan,
|
|
||||||
ucp_Tifinagh,
|
|
||||||
ucp_Ugaritic,
|
|
||||||
ucp_Yi,
|
|
||||||
/* New for Unicode 5.0: */
|
|
||||||
ucp_Balinese,
|
|
||||||
ucp_Cuneiform,
|
|
||||||
ucp_Nko,
|
|
||||||
ucp_Phags_Pa,
|
|
||||||
ucp_Phoenician,
|
|
||||||
/* New for Unicode 5.1: */
|
|
||||||
ucp_Carian,
|
|
||||||
ucp_Cham,
|
|
||||||
ucp_Kayah_Li,
|
|
||||||
ucp_Lepcha,
|
|
||||||
ucp_Lycian,
|
|
||||||
ucp_Lydian,
|
|
||||||
ucp_Ol_Chiki,
|
|
||||||
ucp_Rejang,
|
|
||||||
ucp_Saurashtra,
|
|
||||||
ucp_Sundanese,
|
|
||||||
ucp_Vai,
|
|
||||||
/* New for Unicode 5.2: */
|
|
||||||
ucp_Avestan,
|
|
||||||
ucp_Bamum,
|
|
||||||
ucp_Egyptian_Hieroglyphs,
|
|
||||||
ucp_Imperial_Aramaic,
|
|
||||||
ucp_Inscriptional_Pahlavi,
|
|
||||||
ucp_Inscriptional_Parthian,
|
|
||||||
ucp_Javanese,
|
|
||||||
ucp_Kaithi,
|
|
||||||
ucp_Lisu,
|
|
||||||
ucp_Meetei_Mayek,
|
|
||||||
ucp_Old_South_Arabian,
|
|
||||||
ucp_Old_Turkic,
|
|
||||||
ucp_Samaritan,
|
|
||||||
ucp_Tai_Tham,
|
|
||||||
ucp_Tai_Viet,
|
|
||||||
/* New for Unicode 6.0.0: */
|
|
||||||
ucp_Batak,
|
|
||||||
ucp_Brahmi,
|
|
||||||
ucp_Mandaic,
|
|
||||||
/* New for Unicode 6.1.0: */
|
|
||||||
ucp_Chakma,
|
|
||||||
ucp_Meroitic_Cursive,
|
|
||||||
ucp_Meroitic_Hieroglyphs,
|
|
||||||
ucp_Miao,
|
|
||||||
ucp_Sharada,
|
|
||||||
ucp_Sora_Sompeng,
|
|
||||||
ucp_Takri,
|
|
||||||
/* New for Unicode 7.0.0: */
|
|
||||||
ucp_Bassa_Vah,
|
|
||||||
ucp_Caucasian_Albanian,
|
|
||||||
ucp_Duployan,
|
|
||||||
ucp_Elbasan,
|
|
||||||
ucp_Grantha,
|
|
||||||
ucp_Khojki,
|
|
||||||
ucp_Khudawadi,
|
|
||||||
ucp_Linear_A,
|
|
||||||
ucp_Mahajani,
|
|
||||||
ucp_Manichaean,
|
|
||||||
ucp_Mende_Kikakui,
|
|
||||||
ucp_Modi,
|
|
||||||
ucp_Mro,
|
|
||||||
ucp_Nabataean,
|
|
||||||
ucp_Old_North_Arabian,
|
|
||||||
ucp_Old_Permic,
|
|
||||||
ucp_Pahawh_Hmong,
|
|
||||||
ucp_Palmyrene,
|
|
||||||
ucp_Psalter_Pahlavi,
|
|
||||||
ucp_Pau_Cin_Hau,
|
|
||||||
ucp_Siddham,
|
|
||||||
ucp_Tirhuta,
|
|
||||||
ucp_Warang_Citi
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* End of ucp.h */
|
|
||||||
@ -5,3 +5,4 @@ pamauth$(OBJSUFFICS): pamauth.c
|
|||||||
|
|
||||||
$(BUILDDIR)pamauth$(DLSUFFICS): pamauth$(OBJSUFFICS)
|
$(BUILDDIR)pamauth$(DLSUFFICS): pamauth$(OBJSUFFICS)
|
||||||
$(LN) $(LNOUT)../../$(BUILDDIR)pamauth$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) $(LIBSPREFIX)pam$(LIBSSUFFIX) pamauth$(OBJSUFFICS)
|
$(LN) $(LNOUT)../../$(BUILDDIR)pamauth$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) $(LIBSPREFIX)pam$(LIBSSUFFIX) pamauth$(OBJSUFFICS)
|
||||||
|
|
||||||
|
|||||||
@ -92,7 +92,7 @@ static int pamfunc(struct clientparam *param)
|
|||||||
pthread_mutex_lock(&pam_mutex);
|
pthread_mutex_lock(&pam_mutex);
|
||||||
if (!pamh)
|
if (!pamh)
|
||||||
{
|
{
|
||||||
retval = pam_start ((char *)service, "3proxy@" , &conv, &pamh);
|
retval = pam_start ((char *)service, (char *)param->username, &conv, &pamh);
|
||||||
}
|
}
|
||||||
if (retval == PAM_SUCCESS)
|
if (retval == PAM_SUCCESS)
|
||||||
retval = pam_set_item (pamh, PAM_USER, param->username);
|
retval = pam_set_item (pamh, PAM_USER, param->username);
|
||||||
@ -102,6 +102,8 @@ static int pamfunc(struct clientparam *param)
|
|||||||
/*fprintf(stderr,"pam_set_item2 rc=%d\n",retval); */
|
/*fprintf(stderr,"pam_set_item2 rc=%d\n",retval); */
|
||||||
if (retval == PAM_SUCCESS)
|
if (retval == PAM_SUCCESS)
|
||||||
retval = pam_authenticate (pamh, 0);
|
retval = pam_authenticate (pamh, 0);
|
||||||
|
if (retval == PAM_SUCCESS)
|
||||||
|
retval = pam_acct_mgmt (pamh, 0);
|
||||||
/*fprintf(stderr,"pam_authenticate rc=%d\n",retval);*/
|
/*fprintf(stderr,"pam_authenticate rc=%d\n",retval);*/
|
||||||
|
|
||||||
if (retval == PAM_SUCCESS) { /*auth OK*/ rc=0; }
|
if (retval == PAM_SUCCESS) { /*auth OK*/ rc=0; }
|
||||||
@ -132,7 +134,7 @@ PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink, int argc, unsigne
|
|||||||
if(argc < 2) return 1;
|
if(argc < 2) return 1;
|
||||||
pl = pluginlink;
|
pl = pluginlink;
|
||||||
if(service) free(service);
|
if(service) free(service);
|
||||||
service=strdup((char *)argv[1]);
|
service=(unsigned char *)strdup((char *)argv[1]);
|
||||||
|
|
||||||
if (already_loaded) { return (0); }
|
if (already_loaded) { return (0); }
|
||||||
|
|
||||||
|
|||||||
@ -10,5 +10,5 @@ my_ssl$(OBJSUFFICS): my_ssl.c
|
|||||||
|
|
||||||
|
|
||||||
$(BUILDDIR)SSLPlugin$(DLSUFFICS): ssl_plugin$(OBJSUFFICS) my_ssl$(OBJSUFFICS)
|
$(BUILDDIR)SSLPlugin$(DLSUFFICS): ssl_plugin$(OBJSUFFICS) my_ssl$(OBJSUFFICS)
|
||||||
$(LN) $(LNOUT)../../$(BUILDDIR)SSLPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) ssl_plugin$(OBJSUFFICS) my_ssl$(OBJSUFFICS) $(LIBS)
|
$(LN) $(LNOUT)../../$(BUILDDIR)SSLPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) ssl_plugin$(OBJSUFFICS) my_ssl$(OBJSUFFICS) $(LIBSPREFIX)crypto$(LIBSSUFFIX) $(LIBSPREFIX)ssl$(LIBSSUFFIX)
|
||||||
|
|
||||||
@ -196,14 +196,6 @@ SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CONFIG *config,
|
|||||||
|
|
||||||
*errSSL = NULL;
|
*errSSL = NULL;
|
||||||
|
|
||||||
/*FIXME: support SSL_ERROR_WANT_(READ|WRITE) */
|
|
||||||
#ifdef _WIN32
|
|
||||||
ul = 0;
|
|
||||||
ioctlsocket(s, FIONBIO, &ul);
|
|
||||||
#else
|
|
||||||
fcntl(s,F_SETFL,0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
conn = (ssl_conn *)malloc(sizeof(ssl_conn));
|
conn = (ssl_conn *)malloc(sizeof(ssl_conn));
|
||||||
if ( conn == NULL ){
|
if ( conn == NULL ){
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -227,8 +219,28 @@ SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CONFIG *config,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if(hostname && *hostname)SSL_set_tlsext_host_name(conn->ssl, hostname);
|
if(hostname && *hostname)SSL_set_tlsext_host_name(conn->ssl, hostname);
|
||||||
err = SSL_connect(conn->ssl);
|
|
||||||
if ( err == -1 ) {
|
|
||||||
|
do {
|
||||||
|
struct pollfd fds[1] = {{}};
|
||||||
|
int sslerr;
|
||||||
|
|
||||||
|
err = SSL_connect(conn->ssl);
|
||||||
|
if (err != -1) break;
|
||||||
|
sslerr = SSL_get_error(conn->ssl, err);
|
||||||
|
if(sslerr == SSL_ERROR_WANT_READ){
|
||||||
|
fds[0].fd = s;
|
||||||
|
fds[0].events = POLLIN;
|
||||||
|
}
|
||||||
|
else if(sslerr == SSL_ERROR_WANT_WRITE){
|
||||||
|
fds[0].fd = s;
|
||||||
|
fds[0].events = POLLOUT;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
if(sso._poll(sso.state, fds, 1, CONNECT_TO*1000) <= 0 || !(fds[0].revents & (POLLOUT|POLLIN))) break;
|
||||||
|
} while (err == -1);
|
||||||
|
|
||||||
|
if ( err != 1 ) {
|
||||||
*errSSL = getSSLErr();
|
*errSSL = getSSLErr();
|
||||||
ssl_conn_free(conn);
|
ssl_conn_free(conn);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -245,12 +257,6 @@ SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CONFIG *config,
|
|||||||
*server_cert = cert;
|
*server_cert = cert;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
ul = 1;
|
|
||||||
ioctlsocket(s, FIONBIO, &ul);
|
|
||||||
#else
|
|
||||||
fcntl(s,F_SETFL,O_NONBLOCK);
|
|
||||||
#endif
|
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,15 +267,6 @@ SSL_CONN ssl_handshake_to_client(SOCKET s, SSL_CONFIG *config, X509 *server_cert
|
|||||||
ssl_conn *conn;
|
ssl_conn *conn;
|
||||||
unsigned long ul;
|
unsigned long ul;
|
||||||
|
|
||||||
/*FIXME: support SSL_ERROR_WANT_(READ|WRITE)*/
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
ul = 0;
|
|
||||||
ioctlsocket(s, FIONBIO, &ul);
|
|
||||||
#else
|
|
||||||
fcntl(s,F_SETFL,0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
*errSSL = NULL;
|
*errSSL = NULL;
|
||||||
|
|
||||||
@ -296,28 +293,38 @@ SSL_CONN ssl_handshake_to_client(SOCKET s, SSL_CONFIG *config, X509 *server_cert
|
|||||||
}
|
}
|
||||||
|
|
||||||
SSL_set_fd(conn->ssl, s);
|
SSL_set_fd(conn->ssl, s);
|
||||||
err = SSL_accept(conn->ssl);
|
|
||||||
if ( err <= 0 ) {
|
do {
|
||||||
|
struct pollfd fds[1] = {{}};
|
||||||
|
int sslerr;
|
||||||
|
|
||||||
|
err = SSL_accept(conn->ssl);
|
||||||
|
if (err != -1) break;
|
||||||
|
sslerr = SSL_get_error(conn->ssl, err);
|
||||||
|
if(sslerr == SSL_ERROR_WANT_READ){
|
||||||
|
fds[0].fd = s;
|
||||||
|
fds[0].events = POLLIN;
|
||||||
|
}
|
||||||
|
else if(sslerr == SSL_ERROR_WANT_WRITE){
|
||||||
|
fds[0].fd = s;
|
||||||
|
fds[0].events = POLLOUT;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
if(sso._poll(sso.state, fds, 1, CONNECT_TO*1000) <= 0 || !(fds[0].revents & (POLLOUT|POLLIN))) break;
|
||||||
|
} while (err == -1);
|
||||||
|
|
||||||
|
|
||||||
|
if ( err != 1 ) {
|
||||||
*errSSL = getSSLErr();
|
*errSSL = getSSLErr();
|
||||||
ssl_conn_free(conn);
|
ssl_conn_free(conn);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// client certificate
|
|
||||||
// TODO: is it required?
|
|
||||||
//
|
|
||||||
cert = SSL_get_peer_certificate(conn->ssl);
|
cert = SSL_get_peer_certificate(conn->ssl);
|
||||||
|
|
||||||
if ( cert != NULL )
|
if ( cert != NULL )
|
||||||
X509_free(cert);
|
X509_free(cert);
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
ul = 1;
|
|
||||||
ioctlsocket(s, FIONBIO, &ul);
|
|
||||||
#else
|
|
||||||
fcntl(s,F_SETFL,O_NONBLOCK);
|
|
||||||
#endif
|
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,11 @@ typedef void *SSL_CONN;
|
|||||||
//
|
//
|
||||||
typedef void *SSL_CERT;
|
typedef void *SSL_CERT;
|
||||||
|
|
||||||
|
struct alpn {
|
||||||
|
unsigned char *protos;
|
||||||
|
unsigned int protos_len;
|
||||||
|
};
|
||||||
|
|
||||||
struct ssl_config {
|
struct ssl_config {
|
||||||
X509 *CA_cert;
|
X509 *CA_cert;
|
||||||
X509 *server_cert;
|
X509 *server_cert;
|
||||||
@ -30,6 +35,8 @@ struct ssl_config {
|
|||||||
char * server_ca_file;
|
char * server_ca_file;
|
||||||
char * server_ca_dir;
|
char * server_ca_dir;
|
||||||
char * server_ca_store;
|
char * server_ca_store;
|
||||||
|
char * client_sni;
|
||||||
|
struct alpn client_alpn_protos;
|
||||||
int mitm;
|
int mitm;
|
||||||
int serv;
|
int serv;
|
||||||
int cli;
|
int cli;
|
||||||
@ -39,6 +46,7 @@ struct ssl_config {
|
|||||||
int server_max_proto_version;
|
int server_max_proto_version;
|
||||||
int client_verify;
|
int client_verify;
|
||||||
int server_verify;
|
int server_verify;
|
||||||
|
int client_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ssl_config SSL_CONFIG;
|
typedef struct ssl_config SSL_CONFIG;
|
||||||
@ -75,5 +83,5 @@ void _ssl_cert_free(SSL_CERT cert);
|
|||||||
void ssl_init(void);
|
void ssl_init(void);
|
||||||
char * getSSLErr(void);
|
char * getSSLErr(void);
|
||||||
|
|
||||||
|
extern struct sockfuncs sso;
|
||||||
#endif // __my_ssl_h__
|
#endif // __my_ssl_h__
|
||||||
@ -30,34 +30,38 @@ PROXYFUNC tcppmfunc, proxyfunc, smtppfunc, ftpprfunc;
|
|||||||
|
|
||||||
static struct pluginlink * pl;
|
static struct pluginlink * pl;
|
||||||
|
|
||||||
|
static struct alpn client_alpn_protos;
|
||||||
|
|
||||||
static int ssl_loaded = 0;
|
static int ssl_loaded = 0;
|
||||||
static int ssl_connect_timeout = 0;
|
static int ssl_connect_timeout = 0;
|
||||||
char *certcache = NULL;
|
static char *certcache = NULL;
|
||||||
char *srvcert = NULL;
|
static char *srvcert = NULL;
|
||||||
char *srvkey = NULL;
|
static char *srvkey = NULL;
|
||||||
char *clicert = NULL;
|
static char *clicert = NULL;
|
||||||
char *clikey = NULL;
|
static char *clikey = NULL;
|
||||||
char *server_ca_file = NULL;
|
static char *server_ca_file = NULL;
|
||||||
char *server_ca_dir = NULL;
|
static char *server_ca_dir = NULL;
|
||||||
char *server_ca_store = NULL;
|
static char *server_ca_store = NULL;
|
||||||
char *server_ca_key = NULL;
|
static char *server_ca_key = NULL;
|
||||||
char *client_ca_file = NULL;
|
static char *client_ca_file = NULL;
|
||||||
char *client_ca_dir = NULL;
|
static char *client_ca_dir = NULL;
|
||||||
char *client_ca_store = NULL;
|
static char *client_ca_store = NULL;
|
||||||
int mitm = 0;
|
static int mitm = 0;
|
||||||
int serv = 0;
|
static int serv = 0;
|
||||||
int cli = 0;
|
static int cli = 0;
|
||||||
int ssl_inited = 0;
|
static int ssl_inited = 0;
|
||||||
int client_min_proto_version = 0;
|
static int client_min_proto_version = 0;
|
||||||
int client_max_proto_version = 0;
|
static int client_max_proto_version = 0;
|
||||||
int server_min_proto_version = 0;
|
static int server_min_proto_version = 0;
|
||||||
int server_max_proto_version = 0;
|
static int server_max_proto_version = 0;
|
||||||
int client_verify = 0;
|
static int client_verify = 0;
|
||||||
int server_verify = 0;
|
static int server_verify = 0;
|
||||||
char * client_ciphersuites = NULL;
|
static char * client_ciphersuites = NULL;
|
||||||
char * server_ciphersuites = NULL;
|
static char * server_ciphersuites = NULL;
|
||||||
char * client_cipher_list = NULL;
|
static char * client_cipher_list = NULL;
|
||||||
char * server_cipher_list = NULL;
|
static char * server_cipher_list = NULL;
|
||||||
|
static char * client_sni = NULL;
|
||||||
|
static int client_mode = 0;
|
||||||
|
|
||||||
typedef struct _ssl_conn {
|
typedef struct _ssl_conn {
|
||||||
struct SSL_CTX *ctx;
|
struct SSL_CTX *ctx;
|
||||||
@ -77,10 +81,6 @@ struct SSLstate {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
TO DO: use hashtable
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define STATE ((struct SSLstate *)(state))
|
#define STATE ((struct SSLstate *)(state))
|
||||||
|
|
||||||
static struct SSLsock *searchSSL(void* state, SOCKET s){
|
static struct SSLsock *searchSSL(void* state, SOCKET s){
|
||||||
@ -97,20 +97,24 @@ static void addSSL(
|
|||||||
SOCKET srv_s, SSL_CONN srv_conn,
|
SOCKET srv_s, SSL_CONN srv_conn,
|
||||||
struct clientparam* param){
|
struct clientparam* param){
|
||||||
if(!param->sostate) return;
|
if(!param->sostate) return;
|
||||||
SOSTATE->cli.s = cli_s;
|
if (cli_s != INVALID_SOCKET){
|
||||||
SOSTATE->cli.conn = cli_conn;
|
SOSTATE->cli.s = cli_s;
|
||||||
SOSTATE->srv.s = srv_s;
|
SOSTATE->cli.conn = cli_conn;
|
||||||
SOSTATE->srv.conn = srv_conn;
|
}
|
||||||
|
if (srv_s != INVALID_SOCKET){
|
||||||
|
SOSTATE->srv.s = srv_s;
|
||||||
|
SOSTATE->srv.conn = srv_conn;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void delSSL(void *state, SOCKET s){
|
void delSSL(void *state, SOCKET s){
|
||||||
if(!state || s == INVALID_SOCKET) return;
|
if(!state || s == INVALID_SOCKET) return;
|
||||||
if(STATE->cli.s == s) {
|
if(STATE->cli.s == s && STATE->cli.conn) {
|
||||||
ssl_conn_free(STATE->cli.conn);
|
ssl_conn_free(STATE->cli.conn);
|
||||||
STATE->cli.conn = NULL;
|
STATE->cli.conn = NULL;
|
||||||
STATE->cli.s = INVALID_SOCKET;
|
STATE->cli.s = INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
else if(STATE->srv.s == s) {
|
else if(STATE->srv.s == s && STATE->srv.conn) {
|
||||||
ssl_conn_free(STATE->srv.conn);
|
ssl_conn_free(STATE->srv.conn);
|
||||||
STATE->srv.conn = NULL;
|
STATE->srv.conn = NULL;
|
||||||
STATE->srv.s = INVALID_SOCKET;
|
STATE->srv.s = INVALID_SOCKET;
|
||||||
@ -120,7 +124,7 @@ void delSSL(void *state, SOCKET s){
|
|||||||
struct sockfuncs sso;
|
struct sockfuncs sso;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static int WINAPI ssl_send(void *state, SOCKET s, const void *msg, int len, int flags){
|
static int WINAPI ssl_send(void *state, SOCKET s, const char *msg, int len, int flags){
|
||||||
#else
|
#else
|
||||||
static ssize_t ssl_send(void *state, SOCKET s, const void *msg, size_t len, int flags){
|
static ssize_t ssl_send(void *state, SOCKET s, const void *msg, size_t len, int flags){
|
||||||
#endif
|
#endif
|
||||||
@ -144,7 +148,7 @@ static ssize_t ssl_send(void *state, SOCKET s, const void *msg, size_t len, int
|
|||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static int WINAPI ssl_sendto(void *state, SOCKET s, const void *msg, int len, int flags, const struct sockaddr *to, int tolen){
|
static int WINAPI ssl_sendto(void *state, SOCKET s, const char *msg, int len, int flags, const struct sockaddr *to, int tolen){
|
||||||
#else
|
#else
|
||||||
static ssize_t ssl_sendto(void *state, SOCKET s, const void *msg, size_t len, int flags, const struct sockaddr *to, SASIZETYPE tolen){
|
static ssize_t ssl_sendto(void *state, SOCKET s, const void *msg, size_t len, int flags, const struct sockaddr *to, SASIZETYPE tolen){
|
||||||
#endif
|
#endif
|
||||||
@ -167,7 +171,7 @@ static ssize_t ssl_sendto(void *state, SOCKET s, const void *msg, size_t len, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static int WINAPI ssl_recvfrom(void *state, SOCKET s, void *msg, int len, int flags, struct sockaddr *from, int *fromlen){
|
static int WINAPI ssl_recvfrom(void *state, SOCKET s, char *msg, int len, int flags, struct sockaddr *from, int *fromlen){
|
||||||
#else
|
#else
|
||||||
static ssize_t ssl_recvfrom(void *state, SOCKET s, void *msg, size_t len, int flags, struct sockaddr *from, SASIZETYPE *fromlen){
|
static ssize_t ssl_recvfrom(void *state, SOCKET s, void *msg, size_t len, int flags, struct sockaddr *from, SASIZETYPE *fromlen){
|
||||||
#endif
|
#endif
|
||||||
@ -189,7 +193,7 @@ static ssize_t ssl_recvfrom(void *state, SOCKET s, void *msg, size_t len, int f
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static int WINAPI ssl_recv(void *state, SOCKET s, void *msg, int len, int flags){
|
static int WINAPI ssl_recv(void *state, SOCKET s, char *msg, int len, int flags){
|
||||||
#else
|
#else
|
||||||
static ssize_t ssl_recv(void *state, SOCKET s, void *msg, size_t len, int flags){
|
static ssize_t ssl_recv(void *state, SOCKET s, void *msg, size_t len, int flags){
|
||||||
#endif
|
#endif
|
||||||
@ -211,6 +215,11 @@ static ssize_t ssl_recv(void *state, SOCKET s, void *msg, size_t len, int flags)
|
|||||||
return sso._recv(sso.state, s, msg, len, flags);
|
return sso._recv(sso.state, s, msg, len, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int WINAPI ssl_shutdown(void *state, SOCKET s, int how){
|
||||||
|
delSSL(state, s);
|
||||||
|
return sso._shutdown(sso.state, s, how);
|
||||||
|
}
|
||||||
|
|
||||||
static int WINAPI ssl_closesocket(void *state, SOCKET s){
|
static int WINAPI ssl_closesocket(void *state, SOCKET s){
|
||||||
delSSL(state, s);
|
delSSL(state, s);
|
||||||
return sso._closesocket(sso.state, s);
|
return sso._closesocket(sso.state, s);
|
||||||
@ -264,7 +273,6 @@ SSL_CONN dosrvcon(struct clientparam* param, SSL_CERT* cert){
|
|||||||
SSL_set_mode((SSL *)((ssl_conn *)ServerConn)->ssl, SSL_MODE_ENABLE_PARTIAL_WRITE|SSL_MODE_AUTO_RETRY);
|
SSL_set_mode((SSL *)((ssl_conn *)ServerConn)->ssl, SSL_MODE_ENABLE_PARTIAL_WRITE|SSL_MODE_AUTO_RETRY);
|
||||||
SSL_set_read_ahead((SSL *)((ssl_conn *)ServerConn)->ssl, 0);
|
SSL_set_read_ahead((SSL *)((ssl_conn *)ServerConn)->ssl, 0);
|
||||||
|
|
||||||
|
|
||||||
return ServerConn;
|
return ServerConn;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,8 +315,11 @@ int docli(struct clientparam* param){
|
|||||||
|
|
||||||
SSL_CONN ServerConn;
|
SSL_CONN ServerConn;
|
||||||
SSL_CERT ServerCert=NULL;
|
SSL_CERT ServerCert=NULL;
|
||||||
|
unsigned char *hostname;
|
||||||
|
hostname = param->hostname;
|
||||||
|
param->hostname = (unsigned char *)PCONF->client_sni;
|
||||||
ServerConn = dosrvcon(param, &ServerCert);
|
ServerConn = dosrvcon(param, &ServerCert);
|
||||||
|
param->hostname = hostname;
|
||||||
_ssl_cert_free(ServerCert);
|
_ssl_cert_free(ServerCert);
|
||||||
|
|
||||||
if(!ServerConn) return 1;
|
if(!ServerConn) return 1;
|
||||||
@ -410,6 +421,7 @@ static void* ssl_filter_open(void * idata, struct srvparam * srv){
|
|||||||
sc->client_max_proto_version = client_max_proto_version;
|
sc->client_max_proto_version = client_max_proto_version;
|
||||||
sc->server_min_proto_version = server_min_proto_version;
|
sc->server_min_proto_version = server_min_proto_version;
|
||||||
sc->server_max_proto_version = server_max_proto_version;
|
sc->server_max_proto_version = server_max_proto_version;
|
||||||
|
sc->client_mode = client_mode;
|
||||||
sc->client_verify = client_verify;
|
sc->client_verify = client_verify;
|
||||||
sc->server_verify = server_verify;
|
sc->server_verify = server_verify;
|
||||||
if(client_ciphersuites) sc->client_ciphersuites = strdup(client_ciphersuites);
|
if(client_ciphersuites) sc->client_ciphersuites = strdup(client_ciphersuites);
|
||||||
@ -430,12 +442,20 @@ static void* ssl_filter_open(void * idata, struct srvparam * srv){
|
|||||||
return sc;
|
return sc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(client_ca_file)sc->client_ca_file=client_ca_file;
|
if(client_ca_file)sc->client_ca_file =strdup(client_ca_file);
|
||||||
if(client_ca_dir)sc->client_ca_dir=client_ca_dir;
|
if(client_ca_dir)sc->client_ca_dir = strdup(client_ca_dir);
|
||||||
if(client_ca_store)sc->client_ca_store=client_ca_store;
|
if(client_ca_store)sc->client_ca_store = strdup(client_ca_store);
|
||||||
if(server_ca_file)sc->server_ca_file=server_ca_file;
|
if(server_ca_file)sc->server_ca_file = strdup(server_ca_file);
|
||||||
if(server_ca_dir)sc->server_ca_dir=server_ca_dir;
|
if(server_ca_dir)sc->server_ca_dir = strdup(server_ca_dir);
|
||||||
if(server_ca_store)sc->server_ca_store=server_ca_store;
|
if(server_ca_store)sc->server_ca_store = strdup(server_ca_store);
|
||||||
|
|
||||||
|
if(client_sni)sc->client_sni=strdup(client_sni);
|
||||||
|
if(client_alpn_protos.protos_len){
|
||||||
|
sc->client_alpn_protos = client_alpn_protos;
|
||||||
|
sc->client_alpn_protos.protos = malloc(client_alpn_protos.protos_len);
|
||||||
|
if(!sc->client_alpn_protos.protos) sc->client_alpn_protos.protos_len = 0;
|
||||||
|
else memcpy(sc->client_alpn_protos.protos, client_alpn_protos.protos, client_alpn_protos.protos_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(mitm){
|
if(mitm){
|
||||||
@ -501,6 +521,7 @@ static void* ssl_filter_open(void * idata, struct srvparam * srv){
|
|||||||
srv->so._recv = ssl_recv;
|
srv->so._recv = ssl_recv;
|
||||||
srv->so._sendto = ssl_sendto;
|
srv->so._sendto = ssl_sendto;
|
||||||
srv->so._recvfrom = ssl_recvfrom;
|
srv->so._recvfrom = ssl_recvfrom;
|
||||||
|
srv->so._shutdown = ssl_shutdown;
|
||||||
srv->so._closesocket = ssl_closesocket;
|
srv->so._closesocket = ssl_closesocket;
|
||||||
srv->so._poll = ssl_poll;
|
srv->so._poll = ssl_poll;
|
||||||
}
|
}
|
||||||
@ -522,6 +543,7 @@ static void* ssl_filter_open(void * idata, struct srvparam * srv){
|
|||||||
if(sc->client_max_proto_version)SSL_CTX_set_max_proto_version(sc->srv_ctx, sc->client_max_proto_version);
|
if(sc->client_max_proto_version)SSL_CTX_set_max_proto_version(sc->srv_ctx, sc->client_max_proto_version);
|
||||||
if(sc->client_cipher_list)SSL_CTX_set_cipher_list(sc->srv_ctx, sc->client_cipher_list);
|
if(sc->client_cipher_list)SSL_CTX_set_cipher_list(sc->srv_ctx, sc->client_cipher_list);
|
||||||
if(sc->client_ciphersuites)SSL_CTX_set_ciphersuites(sc->srv_ctx, sc->client_ciphersuites);
|
if(sc->client_ciphersuites)SSL_CTX_set_ciphersuites(sc->srv_ctx, sc->client_ciphersuites);
|
||||||
|
if(sc->client_alpn_protos.protos_len)SSL_CTX_set_alpn_protos(sc->srv_ctx, sc->client_alpn_protos.protos, sc->client_alpn_protos.protos_len);
|
||||||
if(sc->client_verify){
|
if(sc->client_verify){
|
||||||
if(sc->client_ca_file || sc->client_ca_dir){
|
if(sc->client_ca_file || sc->client_ca_dir){
|
||||||
SSL_CTX_load_verify_locations(sc->srv_ctx, sc->client_ca_file, sc->client_ca_dir);
|
SSL_CTX_load_verify_locations(sc->srv_ctx, sc->client_ca_file, sc->client_ca_dir);
|
||||||
@ -536,7 +558,7 @@ static void* ssl_filter_open(void * idata, struct srvparam * srv){
|
|||||||
SSL_CTX_set_verify(sc->srv_ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
|
SSL_CTX_set_verify(sc->srv_ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef WIWHSPLICE
|
#ifdef WITHSPLICE
|
||||||
srv->usesplice = 0;
|
srv->usesplice = 0;
|
||||||
#endif
|
#endif
|
||||||
return sc;
|
return sc;
|
||||||
@ -571,6 +593,24 @@ static FILTER_ACTION ssl_filter_client(void *fo, struct clientparam * param, voi
|
|||||||
return CONTINUE;
|
return CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FILTER_ACTION ssl_filter_connect(void *fc, struct clientparam * param){
|
||||||
|
if(PCONF->cli && !client_mode) {
|
||||||
|
if(docli(param)) {
|
||||||
|
return REJECT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PASS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FILTER_ACTION ssl_filter_afterauth(void *fc, struct clientparam * param){
|
||||||
|
if(PCONF->cli && client_mode == 1) {
|
||||||
|
if(docli(param)) {
|
||||||
|
return REJECT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PASS;
|
||||||
|
}
|
||||||
|
|
||||||
static FILTER_ACTION ssl_filter_predata(void *fc, struct clientparam * param){
|
static FILTER_ACTION ssl_filter_predata(void *fc, struct clientparam * param){
|
||||||
|
|
||||||
if(param->operation != HTTP_CONNECT && param->operation != CONNECT) return PASS;
|
if(param->operation != HTTP_CONNECT && param->operation != CONNECT) return PASS;
|
||||||
@ -581,7 +621,7 @@ static FILTER_ACTION ssl_filter_predata(void *fc, struct clientparam * param){
|
|||||||
if(!param->redirectfunc) param->redirectfunc = proxyfunc;
|
if(!param->redirectfunc) param->redirectfunc = proxyfunc;
|
||||||
return CONTINUE;
|
return CONTINUE;
|
||||||
}
|
}
|
||||||
else if(PCONF->cli) {
|
else if(PCONF->cli && client_mode == 2) {
|
||||||
if(docli(param)) {
|
if(docli(param)) {
|
||||||
return REJECT;
|
return REJECT;
|
||||||
}
|
}
|
||||||
@ -590,8 +630,13 @@ static FILTER_ACTION ssl_filter_predata(void *fc, struct clientparam * param){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void ssl_filter_clear(void *fc){
|
static void ssl_filter_clear(void *state){
|
||||||
free(fc);
|
struct clientparam *param;
|
||||||
|
|
||||||
|
if(!state) return;
|
||||||
|
param = STATE->param;
|
||||||
|
free(state);
|
||||||
|
param->sostate = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CONFIG ((SSL_CONFIG *)fo)
|
#define CONFIG ((SSL_CONFIG *)fo)
|
||||||
@ -629,114 +674,98 @@ static void ssl_filter_close(void *fo){
|
|||||||
free(CONFIG->client_ca_file);
|
free(CONFIG->client_ca_file);
|
||||||
free(CONFIG->client_ca_dir);
|
free(CONFIG->client_ca_dir);
|
||||||
free(CONFIG->client_ca_store);
|
free(CONFIG->client_ca_store);
|
||||||
|
free(CONFIG->client_sni);
|
||||||
|
if(CONFIG->client_alpn_protos.protos_len){
|
||||||
|
free(CONFIG->client_alpn_protos.protos);
|
||||||
|
CONFIG->client_alpn_protos.protos = NULL;
|
||||||
|
CONFIG->client_alpn_protos.protos_len = 0;
|
||||||
|
}
|
||||||
free(fo);
|
free(fo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct filter ssl_filter_mitm = {
|
static struct filter ssl_filter = {
|
||||||
NULL,
|
NULL,
|
||||||
"ssl filter",
|
"ssl filter",
|
||||||
"mitm",
|
"ssl_filter",
|
||||||
ssl_filter_open,
|
ssl_filter_open,
|
||||||
ssl_filter_client,
|
ssl_filter_client,
|
||||||
NULL, NULL, NULL, ssl_filter_predata, NULL, NULL,
|
NULL,
|
||||||
|
ssl_filter_connect,
|
||||||
|
ssl_filter_afterauth,
|
||||||
|
NULL, NULL,
|
||||||
|
ssl_filter_predata,
|
||||||
|
NULL, NULL,
|
||||||
ssl_filter_clear,
|
ssl_filter_clear,
|
||||||
ssl_filter_close
|
ssl_filter_close
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int filterset = 0;
|
||||||
|
|
||||||
|
static void setfilters(){
|
||||||
|
filterset++;
|
||||||
|
if(filterset > 1) return;
|
||||||
|
ssl_filter.next = pl->conf->filters;
|
||||||
|
pl->conf->filters = &ssl_filter;
|
||||||
|
sso = *pl->so;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void unsetfilters(){
|
||||||
|
struct filter * sf;
|
||||||
|
|
||||||
|
if(!filterset) return;
|
||||||
|
filterset--;
|
||||||
|
if(filterset > 0) return;
|
||||||
|
if(pl->conf->filters == &ssl_filter) pl->conf->filters = ssl_filter.next;
|
||||||
|
else for(sf = pl->conf->filters; sf && sf->next; sf=sf->next){
|
||||||
|
if(sf->next == &ssl_filter) {
|
||||||
|
sf->next = ssl_filter.next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int h_mitm(int argc, unsigned char **argv){
|
static int h_mitm(int argc, unsigned char **argv){
|
||||||
if(mitm) return 1;
|
if(mitm) return 0;
|
||||||
if(serv) return 2;
|
if(serv) return 2;
|
||||||
ssl_filter_mitm.next = pl->conf->filters;
|
|
||||||
pl->conf->filters = &ssl_filter_mitm;
|
|
||||||
sso = *pl->so;
|
|
||||||
mitm = 1;
|
mitm = 1;
|
||||||
|
setfilters();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_nomitm(int argc, unsigned char **argv){
|
static int h_nomitm(int argc, unsigned char **argv){
|
||||||
struct filter * sf;
|
if(!mitm) return 0;
|
||||||
if(!mitm) return 1;
|
|
||||||
if(pl->conf->filters == &ssl_filter_mitm) pl->conf->filters = ssl_filter_mitm.next;
|
|
||||||
else for(sf = pl->conf->filters; sf && sf->next; sf=sf->next){
|
|
||||||
if(sf->next == &ssl_filter_mitm) {
|
|
||||||
sf->next = ssl_filter_mitm.next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mitm = 0;
|
mitm = 0;
|
||||||
|
unsetfilters();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct filter ssl_filter_serv = {
|
|
||||||
NULL,
|
|
||||||
"ssl filter",
|
|
||||||
"serv",
|
|
||||||
ssl_filter_open,
|
|
||||||
ssl_filter_client,
|
|
||||||
NULL, NULL, NULL, NULL, NULL, NULL,
|
|
||||||
ssl_filter_clear,
|
|
||||||
ssl_filter_close
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static int h_serv(int argc, unsigned char **argv){
|
static int h_serv(int argc, unsigned char **argv){
|
||||||
if(serv) return 1;
|
if(serv) return 0;
|
||||||
if(mitm) return 2;
|
if(mitm) return 2;
|
||||||
ssl_filter_serv.next = pl->conf->filters;
|
|
||||||
pl->conf->filters = &ssl_filter_serv;
|
|
||||||
sso = *pl->so;
|
|
||||||
serv = 1;
|
serv = 1;
|
||||||
|
setfilters();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_noserv(int argc, unsigned char **argv){
|
static int h_noserv(int argc, unsigned char **argv){
|
||||||
struct filter * sf;
|
if(!serv) return 0;
|
||||||
if(!serv) return 1;
|
|
||||||
serv = 0;
|
serv = 0;
|
||||||
if(pl->conf->filters == &ssl_filter_serv) pl->conf->filters = ssl_filter_serv.next;
|
unsetfilters();
|
||||||
else for(sf = pl->conf->filters; sf && sf->next; sf=sf->next){
|
|
||||||
if(sf->next == &ssl_filter_serv) {
|
|
||||||
sf->next = ssl_filter_serv.next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct filter ssl_filter_cli = {
|
|
||||||
NULL,
|
|
||||||
"ssl filter",
|
|
||||||
"cli",
|
|
||||||
ssl_filter_open,
|
|
||||||
ssl_filter_client,
|
|
||||||
NULL, NULL, NULL, ssl_filter_predata, NULL, NULL,
|
|
||||||
ssl_filter_clear,
|
|
||||||
ssl_filter_close
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static int h_cli(int argc, unsigned char **argv){
|
static int h_cli(int argc, unsigned char **argv){
|
||||||
if(mitm) return 1;
|
if(cli) return 0;
|
||||||
if(cli) return 2;
|
if(mitm) return 2;
|
||||||
ssl_filter_cli.next = pl->conf->filters;
|
|
||||||
pl->conf->filters = &ssl_filter_cli;
|
|
||||||
sso = *pl->so;
|
|
||||||
cli = 1;
|
cli = 1;
|
||||||
|
setfilters();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_nocli(int argc, unsigned char **argv){
|
static int h_nocli(int argc, unsigned char **argv){
|
||||||
struct filter * sf;
|
if(!cli) return 0;
|
||||||
if(!cli) return 1;
|
|
||||||
cli = 0;
|
cli = 0;
|
||||||
if(pl->conf->filters == &ssl_filter_cli) pl->conf->filters = ssl_filter_cli.next;
|
unsetfilters();
|
||||||
else for(sf = pl->conf->filters; sf && sf->next; sf=sf->next){
|
|
||||||
if(sf->next == &ssl_filter_cli) {
|
|
||||||
sf->next = ssl_filter_cli.next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -829,6 +858,42 @@ static int h_client_ca_store(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int h_client_sni(int argc, unsigned char **argv){
|
||||||
|
free(client_sni);
|
||||||
|
client_sni = argc > 1? strdup((char *)argv[1]) : NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int h_client_alpn(int argc, unsigned char **argv){
|
||||||
|
int len, i;
|
||||||
|
|
||||||
|
if(client_alpn_protos.protos_len){
|
||||||
|
free(client_alpn_protos.protos);
|
||||||
|
client_alpn_protos.protos = NULL;
|
||||||
|
client_alpn_protos.protos_len = 0;
|
||||||
|
}
|
||||||
|
if(argc <= 1) return 0;
|
||||||
|
|
||||||
|
for(len = argc - 1, i = 1; i < argc; i++){
|
||||||
|
len += strlen((char *)argv[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!(client_alpn_protos.protos = malloc(len))) return 10;
|
||||||
|
|
||||||
|
for(len = 0, i = 1; i < argc; i++){
|
||||||
|
int l;
|
||||||
|
|
||||||
|
l = strlen((char *)argv[i]);
|
||||||
|
if(l >= 255) return 2;
|
||||||
|
client_alpn_protos.protos[len++] = l;
|
||||||
|
memcpy(client_alpn_protos.protos + len, argv[i], l);
|
||||||
|
len += l;
|
||||||
|
}
|
||||||
|
client_alpn_protos.protos_len = len;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int h_server_ca_dir(int argc, unsigned char **argv){
|
static int h_server_ca_dir(int argc, unsigned char **argv){
|
||||||
free(server_ca_dir);
|
free(server_ca_dir);
|
||||||
server_ca_dir = argc > 1? strdup((char *)argv[1]) : NULL;
|
server_ca_dir = argc > 1? strdup((char *)argv[1]) : NULL;
|
||||||
@ -911,6 +976,15 @@ static int h_server_verify(int argc, unsigned char **argv){
|
|||||||
server_verify = 1;
|
server_verify = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int h_client_mode(int argc, unsigned char **argv){
|
||||||
|
client_mode = 0;
|
||||||
|
if(argc <= 1) return 0;
|
||||||
|
client_mode = atoi((char *)argv[1]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int h_no_server_verify(int argc, unsigned char **argv){
|
static int h_no_server_verify(int argc, unsigned char **argv){
|
||||||
server_verify = 0;
|
server_verify = 0;
|
||||||
return 0;
|
return 0;
|
||||||
@ -950,6 +1024,9 @@ static struct commands ssl_commandhandlers[] = {
|
|||||||
{ssl_commandhandlers+31, "ssl_server_no_verify", h_no_server_verify, 1, 1},
|
{ssl_commandhandlers+31, "ssl_server_no_verify", h_no_server_verify, 1, 1},
|
||||||
{ssl_commandhandlers+32, "ssl_server_ca_dir", h_server_ca_dir, 1, 2},
|
{ssl_commandhandlers+32, "ssl_server_ca_dir", h_server_ca_dir, 1, 2},
|
||||||
{ssl_commandhandlers+33, "ssl_server_ca_store", h_server_ca_store, 1, 2},
|
{ssl_commandhandlers+33, "ssl_server_ca_store", h_server_ca_store, 1, 2},
|
||||||
|
{ssl_commandhandlers+34, "ssl_client_sni", h_client_sni, 1, 2},
|
||||||
|
{ssl_commandhandlers+35, "ssl_client_alpn", h_client_alpn, 1, 0},
|
||||||
|
{ssl_commandhandlers+36, "ssl_client_mode", h_client_mode, 1, 2},
|
||||||
{NULL, "ssl_certcache", h_certcache, 2, 2},
|
{NULL, "ssl_certcache", h_certcache, 2, 2},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -963,9 +1040,10 @@ static struct commands ssl_commandhandlers[] = {
|
|||||||
PLUGINAPI int PLUGINCALL ssl_plugin (struct pluginlink * pluginlink,
|
PLUGINAPI int PLUGINCALL ssl_plugin (struct pluginlink * pluginlink,
|
||||||
int argc, char** argv){
|
int argc, char** argv){
|
||||||
|
|
||||||
mitm = 0;
|
|
||||||
serv = 0;
|
h_nomitm(0, NULL);
|
||||||
cli = 0;
|
h_noserv(0, NULL);
|
||||||
|
h_nocli(0, NULL);
|
||||||
|
|
||||||
pl = pluginlink;
|
pl = pluginlink;
|
||||||
|
|
||||||
@ -987,6 +1065,7 @@ PLUGINAPI int PLUGINCALL ssl_plugin (struct pluginlink * pluginlink,
|
|||||||
server_max_proto_version = 0;
|
server_max_proto_version = 0;
|
||||||
client_verify = 0;
|
client_verify = 0;
|
||||||
server_verify = 0;
|
server_verify = 0;
|
||||||
|
client_mode = 0;
|
||||||
free(client_ciphersuites);
|
free(client_ciphersuites);
|
||||||
client_ciphersuites = NULL;
|
client_ciphersuites = NULL;
|
||||||
free(server_ciphersuites);
|
free(server_ciphersuites);
|
||||||
|
|||||||
@ -200,12 +200,12 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
|
|||||||
#endif
|
#endif
|
||||||
rule++;
|
rule++;
|
||||||
if (((g_s == param->service) && (port == myhtons(*SAPORT(¶m->sinsr)))) ||
|
if (((g_s == param->service) && (port == myhtons(*SAPORT(¶m->sinsr)))) ||
|
||||||
( ((starttrafcorrect->type == UDP) &&
|
( ((starttrafcorrect->con_type == UDP) &&
|
||||||
((param->operation == UDPASSOC)||
|
((param->operation == UDPASSOC)||
|
||||||
(param->operation == DNSRESOLVE)||
|
(param->operation == DNSRESOLVE)||
|
||||||
(param->operation == BIND)||
|
(param->operation == BIND)||
|
||||||
(param->operation == ICMPASSOC))
|
(param->operation == ICMPASSOC))
|
||||||
)||(starttrafcorrect->type == TCP))) /* TCP support */
|
)||(starttrafcorrect->con_type == TCP))) /* TCP support */
|
||||||
{
|
{
|
||||||
/* ôèëüòð ïîäîø¸ë. ìîæíî èçìåíÿòü çíà÷åíèå òðàôôèêà
|
/* ôèëüòð ïîäîø¸ë. ìîæíî èçìåíÿòü çíà÷åíèå òðàôôèêà
|
||||||
äîìíîæàåì íà ÷èñëî */
|
äîìíîæàåì íà ÷èñëî */
|
||||||
|
|||||||
@ -63,7 +63,7 @@ static FILTER_ACTION transparent_filter_client(void *fo, struct clientparam * pa
|
|||||||
#endif
|
#endif
|
||||||
pl->myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)addrbuf, sizeof(addrbuf));
|
pl->myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)addrbuf, sizeof(addrbuf));
|
||||||
if(param->hostname) pl->freefunc(param->hostname);
|
if(param->hostname) pl->freefunc(param->hostname);
|
||||||
param->hostname = pl->strdupfunc(addrbuf);
|
param->hostname = (unsigned char *)pl->strdupfunc(addrbuf);
|
||||||
param->sinsr = param->req;
|
param->sinsr = param->req;
|
||||||
return PASS;
|
return PASS;
|
||||||
}
|
}
|
||||||
@ -81,7 +81,7 @@ static struct filter transparent_filter = {
|
|||||||
"Transparent filter",
|
"Transparent filter",
|
||||||
transparent_filter_open,
|
transparent_filter_open,
|
||||||
transparent_filter_client,
|
transparent_filter_client,
|
||||||
NULL, NULL, NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
transparent_filter_clear,
|
transparent_filter_clear,
|
||||||
transparent_filter_close
|
transparent_filter_close
|
||||||
};
|
};
|
||||||
|
|||||||
@ -154,6 +154,8 @@ extern int timetoexit;
|
|||||||
|
|
||||||
extern struct extparam conf;
|
extern struct extparam conf;
|
||||||
|
|
||||||
|
extern int timeouts[12];
|
||||||
|
|
||||||
int sockmap(struct clientparam * param, int timeo, int usesplice);
|
int sockmap(struct clientparam * param, int timeo, int usesplice);
|
||||||
int socksend(struct clientparam *param, SOCKET sock, unsigned char * buf, int bufsize, int to);
|
int socksend(struct clientparam *param, SOCKET sock, unsigned char * buf, int bufsize, int to);
|
||||||
int socksendto(struct clientparam *param, SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
|
int socksendto(struct clientparam *param, SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
|
||||||
@ -266,6 +268,8 @@ void freepwl(struct passwords *pw);
|
|||||||
void copyfilter(struct filter *, struct srvparam *srv);
|
void copyfilter(struct filter *, struct srvparam *srv);
|
||||||
FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param);
|
FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param);
|
||||||
FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
|
FILTER_ACTION handleconnectflt(struct clientparam *param);
|
||||||
|
FILTER_ACTION handleafterauthflt(struct clientparam *param);
|
||||||
FILTER_ACTION handlehdrfilterscli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handlehdrfilterscli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
FILTER_ACTION handlepredatflt(struct clientparam *param);
|
FILTER_ACTION handlepredatflt(struct clientparam *param);
|
||||||
|
|||||||
@ -170,6 +170,9 @@ struct socketoptions sockopts[] = {
|
|||||||
#endif
|
#endif
|
||||||
#ifdef TCP_FASTOPEN_CONNECT
|
#ifdef TCP_FASTOPEN_CONNECT
|
||||||
{TCP_FASTOPEN_CONNECT, "TCP_FASTOPEN_CONNECT"},
|
{TCP_FASTOPEN_CONNECT, "TCP_FASTOPEN_CONNECT"},
|
||||||
|
#endif
|
||||||
|
#ifdef TCP_MAXSEG
|
||||||
|
{TCP_MAXSEG, "TCP_MAXSEG"},
|
||||||
#endif
|
#endif
|
||||||
{0, NULL}
|
{0, NULL}
|
||||||
};
|
};
|
||||||
@ -193,6 +196,12 @@ void setopts(SOCKET s, int opts){
|
|||||||
int i, opt, set;
|
int i, opt, set;
|
||||||
for(i = 0; opts >= (opt = (1<<i)); i++){
|
for(i = 0; opts >= (opt = (1<<i)); i++){
|
||||||
set = 1;
|
set = 1;
|
||||||
|
#ifdef TCP_MAXSEG
|
||||||
|
if(sockopts[i].opt == TCP_MAXSEG){
|
||||||
|
if(!conf.maxseg) continue;
|
||||||
|
set = conf.maxseg;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if(opts & opt) setsockopt(s, *sockopts[i].optname == 'T'? IPPROTO_TCP:
|
if(opts & opt) setsockopt(s, *sockopts[i].optname == 'T'? IPPROTO_TCP:
|
||||||
#ifdef SOL_IP
|
#ifdef SOL_IP
|
||||||
*sockopts[i].optname == 'I'? SOL_IP:
|
*sockopts[i].optname == 'I'? SOL_IP:
|
||||||
@ -668,7 +677,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
#endif
|
#endif
|
||||||
#if defined SO_BINDTODEVICE
|
#if defined SO_BINDTODEVICE
|
||||||
if(srv.ibindtodevice && srv.so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_BINDTODEVICE, srv.ibindtodevice, strlen(srv.ibindtodevice) + 1)) {
|
if(srv.ibindtodevice && srv.so._setsockopt(srv.so.state, sock, SOL_SOCKET, SO_BINDTODEVICE, srv.ibindtodevice, strlen(srv.ibindtodevice) + 1)) {
|
||||||
dolog(&defparam, "failed to bind device");
|
dolog(&defparam, (unsigned char *)"failed to bind device");
|
||||||
return -12;
|
return -12;
|
||||||
}
|
}
|
||||||
#elif defined IP_BOUND_IF
|
#elif defined IP_BOUND_IF
|
||||||
@ -709,7 +718,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
defparam.clisock = sock;
|
defparam.clisock = sock;
|
||||||
|
|
||||||
if(!srv.silent && !iscbc){
|
if(!srv.silent && !iscbc){
|
||||||
sprintf((char *)buf, "Accepting connections [%u/%u]", (unsigned)getpid(), (unsigned)pthread_self());
|
sprintf((char *)buf, "Accepting connections [%"PRINTF_INT64_MODIFIER"u/%"PRINTF_INT64_MODIFIER"u]", (uint64_t)getpid(), (uint64_t)pthread_self());
|
||||||
dolog(&defparam, buf);
|
dolog(&defparam, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -907,7 +916,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
#endif
|
#endif
|
||||||
srv.childcount++;
|
srv.childcount++;
|
||||||
if (h) {
|
if (h) {
|
||||||
newparam->threadid = (unsigned)thread;
|
newparam->threadid = (uint64_t)thread;
|
||||||
CloseHandle(h);
|
CloseHandle(h);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -924,7 +933,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
if(!srv.silent)dolog(&defparam, buf);
|
if(!srv.silent)dolog(&defparam, buf);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
newparam->threadid = (unsigned)thread;
|
newparam->threadid = (uint64_t)thread;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
pthread_mutex_unlock(&srv.counter_mutex);
|
pthread_mutex_unlock(&srv.counter_mutex);
|
||||||
@ -1063,22 +1072,6 @@ void srvfree(struct srvparam * srv){
|
|||||||
|
|
||||||
void freeparam(struct clientparam * param) {
|
void freeparam(struct clientparam * param) {
|
||||||
if(param->res == 2) return;
|
if(param->res == 2) return;
|
||||||
if(param->datfilterssrv) myfree(param->datfilterssrv);
|
|
||||||
#ifndef STDMAIN
|
|
||||||
if(param->reqfilters) myfree(param->reqfilters);
|
|
||||||
if(param->hdrfilterscli) myfree(param->hdrfilterscli);
|
|
||||||
if(param->hdrfilterssrv) myfree(param->hdrfilterssrv);
|
|
||||||
if(param->predatfilters) myfree(param->predatfilters);
|
|
||||||
if(param->datfilterscli) myfree(param->datfilterscli);
|
|
||||||
if(param->filters){
|
|
||||||
if(param->nfilters)while(param->nfilters--){
|
|
||||||
if(param->filters[param->nfilters].filter->filter_clear)
|
|
||||||
(*param->filters[param->nfilters].filter->filter_clear)(param->filters[param->nfilters].data);
|
|
||||||
}
|
|
||||||
myfree(param->filters);
|
|
||||||
}
|
|
||||||
if(param->connlim) stopconnlims(param);
|
|
||||||
#endif
|
|
||||||
if(param->clibuf) myfree(param->clibuf);
|
if(param->clibuf) myfree(param->clibuf);
|
||||||
if(param->srvbuf) myfree(param->srvbuf);
|
if(param->srvbuf) myfree(param->srvbuf);
|
||||||
if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) {
|
if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) {
|
||||||
@ -1097,6 +1090,24 @@ void freeparam(struct clientparam * param) {
|
|||||||
param->srv->so._shutdown(param->sostate, param->clisock, SHUT_RDWR);
|
param->srv->so._shutdown(param->sostate, param->clisock, SHUT_RDWR);
|
||||||
param->srv->so._closesocket(param->sostate, param->clisock);
|
param->srv->so._closesocket(param->sostate, param->clisock);
|
||||||
}
|
}
|
||||||
|
if(param->datfilterssrv) myfree(param->datfilterssrv);
|
||||||
|
#ifndef STDMAIN
|
||||||
|
if(param->reqfilters) myfree(param->reqfilters);
|
||||||
|
if(param->connectfilters) myfree(param->connectfilters);
|
||||||
|
if(param->afterauthfilters) myfree(param->afterauthfilters);
|
||||||
|
if(param->hdrfilterscli) myfree(param->hdrfilterscli);
|
||||||
|
if(param->hdrfilterssrv) myfree(param->hdrfilterssrv);
|
||||||
|
if(param->predatfilters) myfree(param->predatfilters);
|
||||||
|
if(param->datfilterscli) myfree(param->datfilterscli);
|
||||||
|
if(param->filters){
|
||||||
|
if(param->nfilters)while(param->nfilters--){
|
||||||
|
if(param->filters[param->nfilters].filter->filter_clear)
|
||||||
|
(*param->filters[param->nfilters].filter->filter_clear)(param->filters[param->nfilters].data);
|
||||||
|
}
|
||||||
|
myfree(param->filters);
|
||||||
|
}
|
||||||
|
if(param->connlim) stopconnlims(param);
|
||||||
|
#endif
|
||||||
if(param->srv){
|
if(param->srv){
|
||||||
if(param->srv->so.freefunc) param->srv->so.freefunc(param->sostate);
|
if(param->srv->so.freefunc) param->srv->so.freefunc(param->sostate);
|
||||||
pthread_mutex_lock(¶m->srv->counter_mutex);
|
pthread_mutex_lock(¶m->srv->counter_mutex);
|
||||||
@ -1119,6 +1130,19 @@ void freeparam(struct clientparam * param) {
|
|||||||
myfree(param);
|
myfree(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FILTER_ACTION handleconnectflt(struct clientparam *cparam){
|
||||||
|
#ifndef STDMAIN
|
||||||
|
FILTER_ACTION action;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<cparam->nconnectfilters ;i++){
|
||||||
|
action = (*cparam->connectfilters[i]->filter->filter_connect)(cparam->connectfilters[i]->data, cparam);
|
||||||
|
if(action!=CONTINUE) return action;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return PASS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef STDMAIN
|
#ifndef STDMAIN
|
||||||
static void * itcopy (void * from, size_t size){
|
static void * itcopy (void * from, size_t size){
|
||||||
@ -1304,6 +1328,8 @@ void copyfilter (struct filter *filter, struct srvparam *srv){
|
|||||||
if(srv->nfilters>0)srv->filter[srv->nfilters - 1].next = srv->filter + srv->nfilters;
|
if(srv->nfilters>0)srv->filter[srv->nfilters - 1].next = srv->filter + srv->nfilters;
|
||||||
srv->nfilters++;
|
srv->nfilters++;
|
||||||
if(filter->filter_request)srv->nreqfilters++;
|
if(filter->filter_request)srv->nreqfilters++;
|
||||||
|
if(filter->filter_connect)srv->nconnectfilters++;
|
||||||
|
if(filter->filter_afterauth)srv->nafterauthfilters++;
|
||||||
if(filter->filter_header_srv)srv->nhdrfilterssrv++;
|
if(filter->filter_header_srv)srv->nhdrfilterssrv++;
|
||||||
if(filter->filter_header_cli)srv->nhdrfilterscli++;
|
if(filter->filter_header_cli)srv->nhdrfilterscli++;
|
||||||
if(filter->filter_predata)srv->npredatfilters++;
|
if(filter->filter_predata)srv->npredatfilters++;
|
||||||
@ -1321,6 +1347,8 @@ FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param){
|
|||||||
|
|
||||||
if(!(param->filters = myalloc(sizeof(struct filterp) * srv->nfilters)) ||
|
if(!(param->filters = myalloc(sizeof(struct filterp) * srv->nfilters)) ||
|
||||||
(srv->nreqfilters && !(param->reqfilters = myalloc(sizeof(struct filterp *) * srv->nreqfilters))) ||
|
(srv->nreqfilters && !(param->reqfilters = myalloc(sizeof(struct filterp *) * srv->nreqfilters))) ||
|
||||||
|
(srv->nconnectfilters && !(param->connectfilters = myalloc(sizeof(struct filterp *) * srv->nconnectfilters))) ||
|
||||||
|
(srv->nafterauthfilters && !(param->afterauthfilters = myalloc(sizeof(struct filterp *) * srv->nafterauthfilters))) ||
|
||||||
(srv->nhdrfilterssrv && !(param->hdrfilterssrv = myalloc(sizeof(struct filterp *) * srv->nhdrfilterssrv))) ||
|
(srv->nhdrfilterssrv && !(param->hdrfilterssrv = myalloc(sizeof(struct filterp *) * srv->nhdrfilterssrv))) ||
|
||||||
(srv->nhdrfilterscli && !(param->hdrfilterscli = myalloc(sizeof(struct filterp *) * srv->nhdrfilterscli))) ||
|
(srv->nhdrfilterscli && !(param->hdrfilterscli = myalloc(sizeof(struct filterp *) * srv->nhdrfilterscli))) ||
|
||||||
(srv->npredatfilters && !(param->predatfilters = myalloc(sizeof(struct filterp *) * srv->npredatfilters))) ||
|
(srv->npredatfilters && !(param->predatfilters = myalloc(sizeof(struct filterp *) * srv->npredatfilters))) ||
|
||||||
@ -1338,6 +1366,8 @@ FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param){
|
|||||||
if(action > CONTINUE) return action;
|
if(action > CONTINUE) return action;
|
||||||
param->filters[param->nfilters].filter = srv->filter + i;
|
param->filters[param->nfilters].filter = srv->filter + i;
|
||||||
if(srv->filter[i].filter_request)param->reqfilters[param->nreqfilters++] = param->filters + param->nfilters;
|
if(srv->filter[i].filter_request)param->reqfilters[param->nreqfilters++] = param->filters + param->nfilters;
|
||||||
|
if(srv->filter[i].filter_connect)param->connectfilters[param->nconnectfilters++] = param->filters + param->nfilters;
|
||||||
|
if(srv->filter[i].filter_afterauth)param->afterauthfilters[param->nafterauthfilters++] = param->filters + param->nfilters;
|
||||||
if(srv->filter[i].filter_header_cli)param->hdrfilterscli[param->nhdrfilterscli++] = param->filters + param->nfilters;
|
if(srv->filter[i].filter_header_cli)param->hdrfilterscli[param->nhdrfilterscli++] = param->filters + param->nfilters;
|
||||||
if(srv->filter[i].filter_header_srv)param->hdrfilterssrv[param->nhdrfilterssrv++] = param->filters + param->nfilters;
|
if(srv->filter[i].filter_header_srv)param->hdrfilterssrv[param->nhdrfilterssrv++] = param->filters + param->nfilters;
|
||||||
if(srv->filter[i].filter_predata)param->predatfilters[param->npredatfilters++] = param->filters + param->nfilters;
|
if(srv->filter[i].filter_predata)param->predatfilters[param->npredatfilters++] = param->filters + param->nfilters;
|
||||||
@ -1383,6 +1413,20 @@ void freeacl(struct ace *ac){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FILTER_ACTION handleafterauthflt(struct clientparam *cparam){
|
||||||
|
#ifndef STDMAIN
|
||||||
|
FILTER_ACTION action;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<cparam->nafterauthfilters ;i++){
|
||||||
|
action = (*cparam->afterauthfilters[i]->filter->filter_afterauth)(cparam->afterauthfilters[i]->data, cparam);
|
||||||
|
if(action!=CONTINUE) return action;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return PASS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
FILTER_ACTION action;
|
FILTER_ACTION action;
|
||||||
int i;
|
int i;
|
||||||
|
|||||||
@ -416,6 +416,8 @@ struct filter {
|
|||||||
FILTER_OPEN *filter_open;
|
FILTER_OPEN *filter_open;
|
||||||
FILTER_CLIENT *filter_client;
|
FILTER_CLIENT *filter_client;
|
||||||
FILTER_BUFFER *filter_request;
|
FILTER_BUFFER *filter_request;
|
||||||
|
FILTER_PREDATA *filter_connect;
|
||||||
|
FILTER_PREDATA *filter_afterauth;
|
||||||
FILTER_BUFFER *filter_header_cli;
|
FILTER_BUFFER *filter_header_cli;
|
||||||
FILTER_BUFFER *filter_header_srv;
|
FILTER_BUFFER *filter_header_srv;
|
||||||
FILTER_PREDATA *filter_predata;
|
FILTER_PREDATA *filter_predata;
|
||||||
@ -494,7 +496,7 @@ struct srvparam {
|
|||||||
int needuser;
|
int needuser;
|
||||||
int silent;
|
int silent;
|
||||||
int transparent;
|
int transparent;
|
||||||
int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv;
|
int nfilters, nreqfilters, nconnectfilters, nafterauthfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv;
|
||||||
int family;
|
int family;
|
||||||
int stacksize;
|
int stacksize;
|
||||||
int noforce;
|
int noforce;
|
||||||
@ -550,7 +552,7 @@ struct clientparam {
|
|||||||
|
|
||||||
|
|
||||||
struct filterp *filters,
|
struct filterp *filters,
|
||||||
**reqfilters,
|
**reqfilters, **connectfilters, **afterauthfilters,
|
||||||
**hdrfilterscli, **hdrfilterssrv,
|
**hdrfilterscli, **hdrfilterssrv,
|
||||||
**predatfilters, **datfilterscli, **datfilterssrv;
|
**predatfilters, **datfilterscli, **datfilterssrv;
|
||||||
|
|
||||||
@ -565,18 +567,21 @@ struct clientparam {
|
|||||||
|
|
||||||
uint64_t waitclient64,
|
uint64_t waitclient64,
|
||||||
waitserver64,
|
waitserver64,
|
||||||
cycles;
|
cycles,
|
||||||
|
threadid;
|
||||||
|
|
||||||
int redirected,
|
int redirected,
|
||||||
operation,
|
operation,
|
||||||
nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv,
|
nfilters,
|
||||||
|
nreqfilters, nconnectfilters, nafterauthfilters,
|
||||||
|
nhdrfilterscli, nhdrfilterssrv,
|
||||||
|
npredatfilters, ndatfilterscli, ndatfilterssrv,
|
||||||
unsafefilter,
|
unsafefilter,
|
||||||
bandlimver;
|
bandlimver;
|
||||||
|
|
||||||
int res,
|
int res,
|
||||||
status;
|
status;
|
||||||
int pwtype,
|
int pwtype,
|
||||||
threadid,
|
|
||||||
weight,
|
weight,
|
||||||
nolog,
|
nolog,
|
||||||
nolongdatfilter,
|
nolongdatfilter,
|
||||||
@ -638,7 +643,7 @@ struct extparam {
|
|||||||
#else
|
#else
|
||||||
int threadinit[2];
|
int threadinit[2];
|
||||||
#endif
|
#endif
|
||||||
int timeouts[12];
|
int *timeouts;
|
||||||
struct ace * acl;
|
struct ace * acl;
|
||||||
char * conffile;
|
char * conffile;
|
||||||
struct bandlim * bandlimiter, *bandlimiterout;
|
struct bandlim * bandlimiter, *bandlimiterout;
|
||||||
@ -651,6 +656,7 @@ struct extparam {
|
|||||||
int authcachetype, authcachetime;
|
int authcachetype, authcachetime;
|
||||||
int filtermaxsize;
|
int filtermaxsize;
|
||||||
int gracetraf, gracenum, gracedelay;
|
int gracetraf, gracenum, gracedelay;
|
||||||
|
int maxseg;
|
||||||
unsigned char *logname, **archiver;
|
unsigned char *logname, **archiver;
|
||||||
ROTATION logtype, countertype;
|
ROTATION logtype, countertype;
|
||||||
char * counterfile;
|
char * counterfile;
|
||||||
|
|||||||
18
src/tlspr.c
18
src/tlspr.c
@ -38,7 +38,7 @@ int readtls(struct clientparam *param, int direction, unsigned char *buf, int bu
|
|||||||
#define PROTOLEN (32)
|
#define PROTOLEN (32)
|
||||||
|
|
||||||
|
|
||||||
int parsehello(int type, unsigned char *hello, int len, char *sni, int *lv, char * proto){
|
int parsehello(int type, unsigned char *hello, int len, char *sni, int * snipos, int *lv, char * proto){
|
||||||
int hlen;
|
int hlen;
|
||||||
unsigned offset;
|
unsigned offset;
|
||||||
int slen;
|
int slen;
|
||||||
@ -86,6 +86,7 @@ int parsehello(int type, unsigned char *hello, int len, char *sni, int *lv, char
|
|||||||
if(snlen + 3 > snllen) return -14;
|
if(snlen + 3 > snllen) return -14;
|
||||||
if(snlen+1 > SNILEN) return -15;
|
if(snlen+1 > SNILEN) return -15;
|
||||||
memcpy(sni, hello + offset + 9, snlen);
|
memcpy(sni, hello + offset + 9, snlen);
|
||||||
|
*snipos = offset + 9;
|
||||||
sni[snlen] = 0;
|
sni[snlen] = 0;
|
||||||
snifound = snlen;
|
snifound = snlen;
|
||||||
}
|
}
|
||||||
@ -178,6 +179,7 @@ void * tlsprchild(struct clientparam* param) {
|
|||||||
char req[SNILEN+PROTOLEN+16];
|
char req[SNILEN+PROTOLEN+16];
|
||||||
int lv=-1;
|
int lv=-1;
|
||||||
char proto[PROTOLEN]="-";
|
char proto[PROTOLEN]="-";
|
||||||
|
int snipos = 0;
|
||||||
|
|
||||||
res = tlstobufcli(param, 0);
|
res = tlstobufcli(param, 0);
|
||||||
if(res <= 0 || param->clibuf[0] != 22){
|
if(res <= 0 || param->clibuf[0] != 22){
|
||||||
@ -185,7 +187,7 @@ void * tlsprchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lv = param->clibuf[2];
|
lv = param->clibuf[2];
|
||||||
res = parsehello(1, param->clibuf, res, sni, &lv, proto);
|
res = parsehello(1, param->clibuf, res, sni, &snipos, &lv, proto);
|
||||||
if(res > 0){
|
if(res > 0){
|
||||||
if(param->hostname){
|
if(param->hostname){
|
||||||
myfree(param->hostname);
|
myfree(param->hostname);
|
||||||
@ -193,6 +195,16 @@ void * tlsprchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
else if (parsehostname(sni, param, param->srv->targetport? ntohs(param->srv->targetport):443)) RETURN (100);
|
else if (parsehostname(sni, param, param->srv->targetport? ntohs(param->srv->targetport):443)) RETURN (100);
|
||||||
if (!param->hostname)param->hostname = (unsigned char *)mystrdup(sni);
|
if (!param->hostname)param->hostname = (unsigned char *)mystrdup(sni);
|
||||||
|
if(param->srv->singlepacket && snipos && res > 1){
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = socksend(param, param->remsock, param->clibuf+param->clioffset,snipos + (res/2), conf.timeouts[STRING_S]);
|
||||||
|
if(len != snipos + (res/2)){
|
||||||
|
RETURN(310);
|
||||||
|
}
|
||||||
|
param->clioffset += snipos + (res/2);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (res < 0 && param->srv->requirecert) RETURN(310-res);
|
else if (res < 0 && param->srv->requirecert) RETURN(310-res);
|
||||||
}
|
}
|
||||||
@ -216,7 +228,7 @@ void * tlsprchild(struct clientparam* param) {
|
|||||||
res = tlstobufsrv(param, 0);
|
res = tlstobufsrv(param, 0);
|
||||||
if(res <= 0 || param->srvbuf[0] != 22) RETURN(340-res);
|
if(res <= 0 || param->srvbuf[0] != 22) RETURN(340-res);
|
||||||
lv = param->srvbuf[2];
|
lv = param->srvbuf[2];
|
||||||
res = parsehello(2, param->srvbuf, res, sni, &lv, proto);
|
res = parsehello(2, param->srvbuf, res, sni, &snipos, &lv, proto);
|
||||||
if (res < 0) RETURN(350-res);
|
if (res < 0) RETURN(350-res);
|
||||||
}
|
}
|
||||||
if(param->srv->requirecert > 2){
|
if(param->srv->requirecert > 2){
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user