[Core] Move project to PCRE2
Move project to PCRE2 as PCRE is EOL and won't receive any security updates anymore. PCRE2 have different API compared to PCRE. Mainly PCRE2 have the concept of match_data, no ovector needs to be passed, different handling for error string and different handling for substring manipulation. Update any user of PCRE library with the new API Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
parent
83b38714b9
commit
b87c179f7e
|
@ -231,9 +231,9 @@ CORE_LIBS+=libfreeswitch_libyuv.la
|
||||||
endif
|
endif
|
||||||
|
|
||||||
lib_LTLIBRARIES = libfreeswitch.la
|
lib_LTLIBRARIES = libfreeswitch.la
|
||||||
libfreeswitch_la_CFLAGS = $(CORE_CFLAGS) $(SQLITE_CFLAGS) $(GUMBO_CFLAGS) $(FVAD_CFLAGS) $(FREETYPE_CFLAGS) $(CURL_CFLAGS) $(PCRE_CFLAGS) $(SPEEX_CFLAGS) $(LIBEDIT_CFLAGS) $(openssl_CFLAGS) $(SOFIA_SIP_CFLAGS) $(AM_CFLAGS) $(TPL_CFLAGS)
|
libfreeswitch_la_CFLAGS = $(CORE_CFLAGS) $(SQLITE_CFLAGS) $(GUMBO_CFLAGS) $(FVAD_CFLAGS) $(FREETYPE_CFLAGS) $(CURL_CFLAGS) $(PCRE2_CFLAGS) $(SPEEX_CFLAGS) $(LIBEDIT_CFLAGS) $(openssl_CFLAGS) $(SOFIA_SIP_CFLAGS) $(AM_CFLAGS) $(TPL_CFLAGS)
|
||||||
libfreeswitch_la_LDFLAGS = -version-info 1:0:0 $(AM_LDFLAGS) $(PLATFORM_CORE_LDFLAGS) -no-undefined
|
libfreeswitch_la_LDFLAGS = -version-info 1:0:0 $(AM_LDFLAGS) $(PLATFORM_CORE_LDFLAGS) -no-undefined
|
||||||
libfreeswitch_la_LIBADD = $(CORE_LIBS) $(APR_LIBS) $(SQLITE_LIBS) $(GUMBO_LIBS) $(FVAD_LIBS) $(FREETYPE_LIBS) $(CURL_LIBS) $(PCRE_LIBS) $(SPEEX_LIBS) $(LIBEDIT_LIBS) $(SYSTEMD_LIBS) $(openssl_LIBS) $(PLATFORM_CORE_LIBS) $(TPL_LIBS) $(SPANDSP_LIBS) $(SOFIA_SIP_LIBS)
|
libfreeswitch_la_LIBADD = $(CORE_LIBS) $(APR_LIBS) $(SQLITE_LIBS) $(GUMBO_LIBS) $(FVAD_LIBS) $(FREETYPE_LIBS) $(CURL_LIBS) $(PCRE2_LIBS) $(SPEEX_LIBS) $(LIBEDIT_LIBS) $(SYSTEMD_LIBS) $(openssl_LIBS) $(PLATFORM_CORE_LIBS) $(TPL_LIBS) $(SPANDSP_LIBS) $(SOFIA_SIP_LIBS)
|
||||||
libfreeswitch_la_DEPENDENCIES = $(BUILT_SOURCES)
|
libfreeswitch_la_DEPENDENCIES = $(BUILT_SOURCES)
|
||||||
|
|
||||||
if HAVE_PNG
|
if HAVE_PNG
|
||||||
|
|
|
@ -13,7 +13,7 @@ DOWNLOAD=http://files.freeswitch.org/downloads/libs
|
||||||
JPEG=v8d
|
JPEG=v8d
|
||||||
OPENSSL=1.0.1l
|
OPENSSL=1.0.1l
|
||||||
SQLITE=autoconf-3080403
|
SQLITE=autoconf-3080403
|
||||||
PCRE=8.35
|
PCRE2=10.42
|
||||||
CURL=7.40.0
|
CURL=7.40.0
|
||||||
SPEEX=1.2rc1
|
SPEEX=1.2rc1
|
||||||
LIBEDIT=20140618-3.1
|
LIBEDIT=20140618-3.1
|
||||||
|
@ -45,7 +45,7 @@ has-git:
|
||||||
@git --version || (echo "please install git by running 'make install-git'" && false)
|
@git --version || (echo "please install git by running 'make install-git'" && false)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rf openssl* ldns* jpeg* pcre* perl* pkg-config* speex* sqlite* libedit* curl* *~
|
@rm -rf openssl* ldns* jpeg* pcre2* perl* pkg-config* speex* sqlite* libedit* curl* *~
|
||||||
(cd freeswitch.git && git clean -fdx && git reset --hard HEAD && git pull)
|
(cd freeswitch.git && git clean -fdx && git reset --hard HEAD && git pull)
|
||||||
|
|
||||||
libjpeg: jpeg-8d/.done
|
libjpeg: jpeg-8d/.done
|
||||||
|
@ -66,9 +66,9 @@ sqlite-$(SQLITE):
|
||||||
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
||||||
(cd $@ && ./configure --prefix=$(PREFIX) && make && sudo make install && touch .done_sqlite && touch .done)
|
(cd $@ && ./configure --prefix=$(PREFIX) && make && sudo make install && touch .done_sqlite && touch .done)
|
||||||
|
|
||||||
pcre: pcre-$(PCRE)/.done
|
pcre2: pcre2-$(PCRE2)/.done
|
||||||
pcre-$(PCRE)/.done: pcre-$(PCRE)
|
pcre2-$(PCRE2)/.done: pcre2-$(PCRE2)
|
||||||
pcre-$(PCRE):
|
pcre2-$(PCRE2):
|
||||||
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
||||||
(cd $@ && ./configure --prefix=$(PREFIX) && make && sudo make install && touch .done)
|
(cd $@ && ./configure --prefix=$(PREFIX) && make && sudo make install && touch .done)
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
# in that same directory.
|
# in that same directory.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
RPMS=git gcc-c++ autoconf automake libtool wget python ncurses-devel zlib-devel libjpeg-devel openssl-devel e2fsprogs-devel sqlite-devel libcurl-devel pcre-devel speex-devel ldns-devel libedit-devel
|
RPMS=git gcc-c++ autoconf automake libtool wget python ncurses-devel zlib-devel libjpeg-devel openssl-devel e2fsprogs-devel sqlite-devel libcurl-devel pcre2-devel speex-devel ldns-devel libedit-devel
|
||||||
DEBS=git build-essential automake autoconf 'libtool-bin|libtool' wget python uuid-dev zlib1g-dev 'libjpeg8-dev|libjpeg62-turbo-dev' libncurses5-dev libssl-dev libpcre3-dev libcurl4-openssl-dev libldns-dev libedit-dev libspeexdsp-dev libspeexdsp-dev libsqlite3-dev perl libgdbm-dev libdb-dev bison libvlc-dev pkg-config
|
DEBS=git build-essential automake autoconf 'libtool-bin|libtool' wget python uuid-dev zlib1g-dev 'libjpeg8-dev|libjpeg62-turbo-dev' libncurses5-dev libssl-dev libpcre2-dev libcurl4-openssl-dev libldns-dev libedit-dev libspeexdsp-dev libspeexdsp-dev libsqlite3-dev perl libgdbm-dev libdb-dev bison libvlc-dev pkg-config
|
||||||
|
|
||||||
freeswitch: deps has-git freeswitch.git/Makefile
|
freeswitch: deps has-git freeswitch.git/Makefile
|
||||||
cd freeswitch.git && make
|
cd freeswitch.git && make
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
PKG=rsync-3.1.0 git automake-1.14.1 autoconf-2.69p1 libtool gmake bzip2 jpeg wget pcre speex libldns
|
PKG=rsync-3.1.0 git automake-1.14.1 autoconf-2.69p1 libtool gmake bzip2 jpeg wget pcre2 speex libldns
|
||||||
PREFIX=/usr/local/freeswitch
|
PREFIX=/usr/local/freeswitch
|
||||||
DOWNLOAD=http://files.freeswitch.org/downloads/libs
|
DOWNLOAD=http://files.freeswitch.org/downloads/libs
|
||||||
OPENSSL=1.0.1j
|
OPENSSL=1.0.1j
|
||||||
|
|
|
@ -12,7 +12,7 @@ DOWNLOAD=http://files.freeswitch.org/downloads/libs
|
||||||
JP=v8d
|
JP=v8d
|
||||||
SSL=1.0.1j
|
SSL=1.0.1j
|
||||||
SQLITE=autoconf-3080403
|
SQLITE=autoconf-3080403
|
||||||
PCRE=8.35
|
PCRE2=10.42
|
||||||
CURL=7.35.0
|
CURL=7.35.0
|
||||||
SPEEX=1.2rc1
|
SPEEX=1.2rc1
|
||||||
LIBEDIT=20140618-3.1
|
LIBEDIT=20140618-3.1
|
||||||
|
@ -43,7 +43,7 @@ has-git:
|
||||||
@git --version || (echo "please install git by running 'gmake install-git'" && false)
|
@git --version || (echo "please install git by running 'gmake install-git'" && false)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rf openssl* ldns* jpeg* pcre* perl* pkg-config* speex* sqlite* libedit* curl* *~
|
@rm -rf openssl* ldns* jpeg* pcre2* perl* pkg-config* speex* sqlite* libedit* curl* *~
|
||||||
(cd freeswitch.git && git clean -fdx && git reset --hard HEAD && git pull)
|
(cd freeswitch.git && git clean -fdx && git reset --hard HEAD && git pull)
|
||||||
|
|
||||||
libjpeg: jpeg-8d/.done
|
libjpeg: jpeg-8d/.done
|
||||||
|
@ -64,9 +64,9 @@ sqlite-$(SQLITE):
|
||||||
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
||||||
(cd $@ && CFLAGS=-m64 LDFLAGS=-m64 ./configure --prefix=$(PREFIX) && gmake && sudo gmake install && touch .done)
|
(cd $@ && CFLAGS=-m64 LDFLAGS=-m64 ./configure --prefix=$(PREFIX) && gmake && sudo gmake install && touch .done)
|
||||||
|
|
||||||
pcre: pcre-$(PCRE)/.done
|
pcre2: pcre2-$(PCRE2)/.done
|
||||||
pcre-$(PCRE)/.done: pcre-$(PCRE)
|
pcre2-$(PCRE2)/.done: pcre2-$(PCRE2)
|
||||||
pcre-$(PCRE):
|
pcre2-$(PCRE2):
|
||||||
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
|
||||||
(cd $@ && CXXFLAGS=-m64 CFLAGS=-m64 LDFLAGS=-m64 ./configure --prefix=$(PREFIX) && gmake && sudo gmake install && touch .done)
|
(cd $@ && CXXFLAGS=-m64 CFLAGS=-m64 LDFLAGS=-m64 ./configure --prefix=$(PREFIX) && gmake && sudo gmake install && touch .done)
|
||||||
|
|
||||||
|
|
|
@ -1323,7 +1323,7 @@ PKG_CHECK_MODULES([TPL], [libtpl >= 1.5],[
|
||||||
|
|
||||||
PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.6.20])
|
PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.6.20])
|
||||||
PKG_CHECK_MODULES([CURL], [libcurl >= 7.19])
|
PKG_CHECK_MODULES([CURL], [libcurl >= 7.19])
|
||||||
PKG_CHECK_MODULES([PCRE], [libpcre >= 7.8])
|
PKG_CHECK_MODULES([PCRE2], [libpcre2-8 >= 10.00])
|
||||||
PKG_CHECK_MODULES([SPEEX], [speex >= 1.2rc1 speexdsp >= 1.2rc1])
|
PKG_CHECK_MODULES([SPEEX], [speex >= 1.2rc1 speexdsp >= 1.2rc1])
|
||||||
PKG_CHECK_MODULES([YAML], [yaml-0.1 >= 0.1.4],[
|
PKG_CHECK_MODULES([YAML], [yaml-0.1 >= 0.1.4],[
|
||||||
AM_CONDITIONAL([HAVE_YAML],[true])],[
|
AM_CONDITIONAL([HAVE_YAML],[true])],[
|
||||||
|
|
|
@ -142,7 +142,7 @@ BuildRequires: libtool >= 1.5.17
|
||||||
BuildRequires: openssl-devel >= 1.0.1e
|
BuildRequires: openssl-devel >= 1.0.1e
|
||||||
BuildRequires: sofia-sip-devel >= 1.13.17
|
BuildRequires: sofia-sip-devel >= 1.13.17
|
||||||
BuildRequires: spandsp3-devel >= 3.0
|
BuildRequires: spandsp3-devel >= 3.0
|
||||||
BuildRequires: pcre-devel
|
BuildRequires: pcre2-devel
|
||||||
BuildRequires: speex-devel
|
BuildRequires: speex-devel
|
||||||
BuildRequires: sqlite-devel >= 3.6.20
|
BuildRequires: sqlite-devel >= 3.6.20
|
||||||
BuildRequires: libtiff-devel
|
BuildRequires: libtiff-devel
|
||||||
|
@ -156,7 +156,7 @@ BuildRequires: zlib-devel
|
||||||
BuildRequires: libxml2-devel
|
BuildRequires: libxml2-devel
|
||||||
BuildRequires: libsndfile-devel
|
BuildRequires: libsndfile-devel
|
||||||
Requires: curl >= 7.19
|
Requires: curl >= 7.19
|
||||||
Requires: pcre
|
Requires: pcre2
|
||||||
Requires: speex
|
Requires: speex
|
||||||
Requires: sqlite >= 3.6.20
|
Requires: sqlite >= 3.6.20
|
||||||
Requires: libtiff
|
Requires: libtiff
|
||||||
|
|
|
@ -554,7 +554,7 @@ opal
|
||||||
/win32/celt/*/*/libcelt.log
|
/win32/celt/*/*/libcelt.log
|
||||||
/win32/libg722_1/*/*/libg722_1.log
|
/win32/libg722_1/*/*/libg722_1.log
|
||||||
/win32/libshout/*/*/libshout.log
|
/win32/libshout/*/*/libshout.log
|
||||||
/win32/pcre/pcre_chartables.c
|
/win32/pcre2/pcre2_chartables.c
|
||||||
/win32/tmp*.bat
|
/win32/tmp*.bat
|
||||||
!/xmlrpc-c/include/xmlrpc-c/config.h.in
|
!/xmlrpc-c/include/xmlrpc-c/config.h.in
|
||||||
/xmlrpc-c/stamp-h2
|
/xmlrpc-c/stamp-h2
|
||||||
|
@ -610,9 +610,9 @@ opal
|
||||||
broadvoice/config/compile
|
broadvoice/config/compile
|
||||||
ilbc/config/compile
|
ilbc/config/compile
|
||||||
libg722_1/config/compile
|
libg722_1/config/compile
|
||||||
pcre/compile
|
pcre2/compile
|
||||||
srtp/build/compile
|
srtp/build/compile
|
||||||
/pcre-*/
|
/pcre2-*/
|
||||||
/speex-*/
|
/speex-*/
|
||||||
/curl-*/
|
/curl-*/
|
||||||
/sqlite-*.zip
|
/sqlite-*.zip
|
||||||
|
@ -637,8 +637,8 @@ curl-*/
|
||||||
curl-*
|
curl-*
|
||||||
flite-*/
|
flite-*/
|
||||||
flite-*
|
flite-*
|
||||||
pcre-*/
|
pcre2-*/
|
||||||
pcre-*
|
pcre2-*
|
||||||
libsndfile-*/
|
libsndfile-*/
|
||||||
libsndfile-*
|
libsndfile-*
|
||||||
opencv-*/
|
opencv-*/
|
||||||
|
|
|
@ -35,9 +35,9 @@ copy ..\..\apr-util\xml\expat\lib\expat.h.in ..\..\apr-util\xml\expat\lib\expat.
|
||||||
copy ..\..\apr-util\xml\expat\lib\config.hnw ..\..\apr-util\xml\expat\lib\config.h
|
copy ..\..\apr-util\xml\expat\lib\config.hnw ..\..\apr-util\xml\expat\lib\config.h
|
||||||
copy ..\..\apr-util\include\private\apu_select_dbm.hw ..\..\apr-util\include\private\apu_select_dbm.h
|
copy ..\..\apr-util\include\private\apu_select_dbm.hw ..\..\apr-util\include\private\apu_select_dbm.h
|
||||||
|
|
||||||
@echo Fixing up the pcre headers
|
@echo Fixing up the pcre2 headers
|
||||||
copy ..\..\pcre\config.hw ..\..\pcre\config.h
|
copy ..\..\pcre2\config.hw ..\..\pcre2\config.h
|
||||||
copy ..\..\pcre\pcre.hw ..\..\pcre\pcre.h
|
copy ..\..\pcre2\pcre2.hw ..\..\pcre2\pcre2.h
|
||||||
|
|
||||||
@echo Generating the import list...
|
@echo Generating the import list...
|
||||||
set MWCIncludes=..\include;..\include\arch\netware;..\include\arch\unix;..\..\apr-util\include;+%NovellLibC%
|
set MWCIncludes=..\include;..\include\arch\netware;..\include\arch\unix;..\..\apr-util\include;+%NovellLibC%
|
||||||
|
|
|
@ -172,7 +172,7 @@
|
||||||
* - APR (http://apr.apache.org)
|
* - APR (http://apr.apache.org)
|
||||||
* - APR-Util (http://apr.apache.org)
|
* - APR-Util (http://apr.apache.org)
|
||||||
* - SQLite (http://www.sqlite.org)
|
* - SQLite (http://www.sqlite.org)
|
||||||
* - Pcre (http://www.pcre.org/)
|
* - Pcre2 (http://www.pcre.org/)
|
||||||
* - SRTP (http://srtp.sourceforge.net/srtp.html)
|
* - SRTP (http://srtp.sourceforge.net/srtp.html)
|
||||||
*
|
*
|
||||||
* Additionally, the various external modules make use of several external modules:
|
* Additionally, the various external modules make use of several external modules:
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
*
|
*
|
||||||
* Michael Jerris <mike@jerris.com>
|
* Michael Jerris <mike@jerris.com>
|
||||||
*
|
*
|
||||||
* switch_regex.h -- pcre wrapper and extensions Header
|
* switch_regex.h -- pcre2 wrapper and extensions Header
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*! \file switch_regex.h
|
/*! \file switch_regex.h
|
||||||
|
@ -40,18 +40,21 @@ SWITCH_BEGIN_EXTERN_C
|
||||||
* @ingroup FREESWITCH
|
* @ingroup FREESWITCH
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
typedef struct real_pcre switch_regex_t;
|
typedef struct pcre2_real_code switch_regex_t;
|
||||||
|
typedef struct pcre2_real_match_data_8 switch_regex_match_data_t;
|
||||||
|
typedef struct pcre2_real_compile_context_8 switch_regex_compile_context_t;
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_regex_t *) switch_regex_compile(const char *pattern, int options, const char **errorptr, int *erroroffset,
|
SWITCH_DECLARE(switch_regex_t *) switch_regex_compile(const char *pattern, int options, int *errorcode, unsigned int *erroroffset,
|
||||||
const unsigned char *tables);
|
switch_regex_compile_context_t *ccontext);
|
||||||
|
|
||||||
SWITCH_DECLARE(int) switch_regex_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int size);
|
SWITCH_DECLARE(int) switch_regex_copy_substring(switch_regex_match_data_t *match_data, int stringnumber, char *buffer, unsigned int *size);
|
||||||
|
|
||||||
|
SWITCH_DECLARE(void) switch_regex_match_free(void *data);
|
||||||
SWITCH_DECLARE(void) switch_regex_free(void *data);
|
SWITCH_DECLARE(void) switch_regex_free(void *data);
|
||||||
|
|
||||||
SWITCH_DECLARE(int) switch_regex_perform(const char *field, const char *expression, switch_regex_t **new_re, int *ovector, uint32_t olen);
|
SWITCH_DECLARE(int) switch_regex_perform(const char *field, const char *expression, switch_regex_t **new_re, switch_regex_match_data_t **new_match_data);
|
||||||
SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_count, const char *data, const char *field_data,
|
SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_match_data_t *match_data, const char *data,
|
||||||
char *substituted, switch_size_t len, int *ovector);
|
char *substituted, switch_size_t len);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Function to evaluate an expression against a string
|
\brief Function to evaluate an expression against a string
|
||||||
|
@ -70,17 +73,27 @@ SWITCH_DECLARE(switch_status_t) switch_regex_match(const char *target, const cha
|
||||||
*/
|
*/
|
||||||
SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, const char *expression, int *partial_match);
|
SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, const char *expression, int *partial_match);
|
||||||
|
|
||||||
SWITCH_DECLARE(void) switch_capture_regex(switch_regex_t *re, int match_count, const char *field_data,
|
SWITCH_DECLARE(void) switch_capture_regex(switch_regex_match_data_t *match_data, int match_count,
|
||||||
int *ovector, const char *var, switch_cap_callback_t callback, void *user_data);
|
const char *var, switch_cap_callback_t callback, void *user_data);
|
||||||
|
|
||||||
SWITCH_DECLARE_NONSTD(void) switch_regex_set_var_callback(const char *var, const char *val, void *user_data);
|
SWITCH_DECLARE_NONSTD(void) switch_regex_set_var_callback(const char *var, const char *val, void *user_data);
|
||||||
SWITCH_DECLARE_NONSTD(void) switch_regex_set_event_header_callback(const char *var, const char *val, void *user_data);
|
SWITCH_DECLARE_NONSTD(void) switch_regex_set_event_header_callback(const char *var, const char *val, void *user_data);
|
||||||
|
|
||||||
|
#define switch_match_data_safe_free(match_data) if (match_data) {\
|
||||||
|
switch_regex_match_free(match_data);\
|
||||||
|
match_data = NULL;\
|
||||||
|
}
|
||||||
|
|
||||||
#define switch_regex_safe_free(re) if (re) {\
|
#define switch_regex_safe_free(re) if (re) {\
|
||||||
switch_regex_free(re);\
|
switch_regex_free(re);\
|
||||||
re = NULL;\
|
re = NULL;\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define switch_regex_and_match_data_safe_free(re, match_data) {\
|
||||||
|
switch_match_data_safe_free(match_data);\
|
||||||
|
switch_regex_safe_free(re);\
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|
|
@ -65,9 +65,9 @@ SWITCH_STANDARD_API(api_abstraction_function)
|
||||||
|
|
||||||
int proceed;
|
int proceed;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(cmd, parse, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(cmd, parse, &re, &match_data))) {
|
||||||
const char *api_args = NULL;
|
const char *api_args = NULL;
|
||||||
char *substituted = NULL;
|
char *substituted = NULL;
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ SWITCH_STANDARD_API(api_abstraction_function)
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
switch_perform_substitution(re, proceed, arguments, cmd , substituted, len, ovector);
|
switch_perform_substitution(match_data, arguments, substituted, len);
|
||||||
api_args = substituted;
|
api_args = substituted;
|
||||||
} else {
|
} else {
|
||||||
api_args = arguments;
|
api_args = arguments;
|
||||||
|
@ -89,7 +89,7 @@ SWITCH_STANDARD_API(api_abstraction_function)
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No match for API %s (%s != %s)\n", api_name, parse, cmd);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No match for API %s (%s != %s)\n", api_name, parse, cmd);
|
||||||
}
|
}
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "API %s doesn't exist inside the xml structure. You might have forgot to reload the module after editing it\n", api_name);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "API %s doesn't exist inside the xml structure. You might have forgot to reload the module after editing it\n", api_name);
|
||||||
|
|
|
@ -2014,7 +2014,7 @@ SWITCH_STANDARD_API(replace_function)
|
||||||
SWITCH_STANDARD_API(regex_function)
|
SWITCH_STANDARD_API(regex_function)
|
||||||
{
|
{
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
int argc;
|
int argc;
|
||||||
char *mydata = NULL, *argv[4];
|
char *mydata = NULL, *argv[4];
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
@ -2054,7 +2054,7 @@ SWITCH_STANDARD_API(regex_function)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
proceed = switch_regex_perform(argv[0], argv[1], &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
proceed = switch_regex_perform(argv[0], argv[1], &re, &match_data);
|
||||||
|
|
||||||
if (argc > 2) {
|
if (argc > 2) {
|
||||||
char *flags = "";
|
char *flags = "";
|
||||||
|
@ -2069,7 +2069,7 @@ SWITCH_STANDARD_API(regex_function)
|
||||||
switch_assert(substituted);
|
switch_assert(substituted);
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
switch_replace_char(argv[2], '%', '$', SWITCH_FALSE);
|
switch_replace_char(argv[2], '%', '$', SWITCH_FALSE);
|
||||||
switch_perform_substitution(re, proceed, argv[2], argv[0], substituted, len, ovector);
|
switch_perform_substitution(match_data, argv[2], substituted, len);
|
||||||
|
|
||||||
stream->write_function(stream, "%s", substituted);
|
stream->write_function(stream, "%s", substituted);
|
||||||
free(substituted);
|
free(substituted);
|
||||||
|
@ -2091,7 +2091,7 @@ SWITCH_STANDARD_API(regex_function)
|
||||||
error:
|
error:
|
||||||
stream->write_function(stream, "-ERR");
|
stream->write_function(stream, "-ERR");
|
||||||
ok:
|
ok:
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(mydata);
|
switch_safe_free(mydata);
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3211,16 +3211,16 @@ SWITCH_STANDARD_APP(capture_function)
|
||||||
{
|
{
|
||||||
char *argv[3] = { 0 };
|
char *argv[3] = { 0 };
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30] = {0};
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
char *lbuf;
|
char *lbuf;
|
||||||
int proceed;
|
int proceed;
|
||||||
|
|
||||||
if (!zstr(data) && (lbuf = switch_core_session_strdup(session, data))
|
if (!zstr(data) && (lbuf = switch_core_session_strdup(session, data))
|
||||||
&& switch_separate_string(lbuf, '|', argv, (sizeof(argv) / sizeof(argv[0]))) == 3) {
|
&& switch_separate_string(lbuf, '|', argv, (sizeof(argv) / sizeof(argv[0]))) == 3) {
|
||||||
if ((proceed = switch_regex_perform(argv[1], argv[2], &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(argv[1], argv[2], &re, &match_data))) {
|
||||||
switch_capture_regex(re, proceed, argv[1], ovector, argv[0], switch_regex_set_var_callback, session);
|
switch_capture_regex(match_data, proceed, argv[0], switch_regex_set_var_callback, session);
|
||||||
}
|
}
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "No data specified.\n");
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "No data specified.\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -365,7 +365,8 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
|
||||||
|
|
||||||
if (service && regex && replace) {
|
if (service && regex && replace) {
|
||||||
switch_regex_t *re = NULL, *re2 = NULL;
|
switch_regex_t *re = NULL, *re2 = NULL;
|
||||||
int proceed = 0, ovector[30];
|
switch_regex_match_data_t *match_data = NULL, *match_data2 = NULL;
|
||||||
|
int proceed = 0;
|
||||||
char *substituted = NULL;
|
char *substituted = NULL;
|
||||||
char *substituted_2 = NULL;
|
char *substituted_2 = NULL;
|
||||||
char *orig_uri;
|
char *orig_uri;
|
||||||
|
@ -374,17 +375,17 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
|
||||||
int supported = 0;
|
int supported = 0;
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(number, regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(number, regex, &re, &match_data))) {
|
||||||
if (strchr(regex, '(')) {
|
if (strchr(regex, '(')) {
|
||||||
len = (uint32_t) (strlen(number) + strlen(replace) + 10) * proceed;
|
len = (uint32_t) (strlen(number) + strlen(replace) + 10) * proceed;
|
||||||
if (!(substituted = malloc(len))) {
|
if (!(substituted = malloc(len))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
|
|
||||||
switch_perform_substitution(re, proceed, replace, number, substituted, len, ovector);
|
switch_perform_substitution(match_data, replace, substituted, len);
|
||||||
orig_uri = substituted;
|
orig_uri = substituted;
|
||||||
} else {
|
} else {
|
||||||
orig_uri = replace;
|
orig_uri = replace;
|
||||||
|
@ -398,7 +399,7 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(uri, route->regex, &re2, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(uri, route->regex, &re2, &match_data2))) {
|
||||||
switch_event_t *event = NULL;
|
switch_event_t *event = NULL;
|
||||||
|
|
||||||
if (strchr(route->regex, '(')) {
|
if (strchr(route->regex, '(')) {
|
||||||
|
@ -406,14 +407,14 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
|
||||||
if (!(substituted_2 = malloc(len))) {
|
if (!(substituted_2 = malloc(len))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
|
||||||
switch_safe_free(substituted);
|
switch_safe_free(substituted);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_regex_safe_free(re2);
|
switch_regex_and_match_data_safe_free(re2, match_data2);
|
||||||
switch_mutex_unlock(MUTEX);
|
switch_mutex_unlock(MUTEX);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
memset(substituted_2, 0, len);
|
memset(substituted_2, 0, len);
|
||||||
|
|
||||||
switch_perform_substitution(re2, proceed, route->replace, uri, substituted_2, len, ovector);
|
switch_perform_substitution(match_data2, route->replace, substituted_2, len);
|
||||||
uri = substituted_2;
|
uri = substituted_2;
|
||||||
} else {
|
} else {
|
||||||
uri = route->replace;
|
uri = route->replace;
|
||||||
|
@ -434,7 +435,7 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
|
||||||
}
|
}
|
||||||
switch_safe_free(uri_expanded);
|
switch_safe_free(uri_expanded);
|
||||||
switch_safe_free(substituted_2);
|
switch_safe_free(substituted_2);
|
||||||
switch_regex_safe_free(re2);
|
switch_regex_and_match_data_safe_free(re2, match_data2);
|
||||||
}
|
}
|
||||||
switch_mutex_unlock(MUTEX);
|
switch_mutex_unlock(MUTEX);
|
||||||
|
|
||||||
|
@ -443,7 +444,7 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_safe_free(substituted);
|
switch_safe_free(substituted);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,8 @@ static void lcr_destroy(lcr_route route)
|
||||||
static const char *do_cid(switch_memory_pool_t *pool, const char *cid, const char *number, switch_core_session_t *session)
|
static const char *do_cid(switch_memory_pool_t *pool, const char *cid, const char *number, switch_core_session_t *session)
|
||||||
{
|
{
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int proceed = 0, ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
int proceed = 0;
|
||||||
char *substituted = NULL;
|
char *substituted = NULL;
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
char *src = NULL;
|
char *src = NULL;
|
||||||
|
@ -230,24 +231,24 @@ static const char *do_cid(switch_memory_pool_t *pool, const char *cid, const cha
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "expanded src: %s, dst: %s\n", src, dst);
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "expanded src: %s, dst: %s\n", src, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(number, src, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(number, src, &re, &match_data))) {
|
||||||
len = (uint32_t) (strlen(src) + strlen(dst) + 10) * proceed; /* guestimate size */
|
len = (uint32_t) (strlen(src) + strlen(dst) + 10) * proceed; /* guestimate size */
|
||||||
if (!(substituted = switch_core_alloc(pool, len))) {
|
if (!(substituted = switch_core_alloc(pool, len))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Memory Error!\n");
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Memory Error!\n");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
switch_perform_substitution(re, proceed, dst, number, substituted, len, ovector);
|
switch_perform_substitution(match_data, dst, substituted, len);
|
||||||
} else {
|
} else {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
return substituted;
|
return substituted;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(tmp_regex);
|
switch_safe_free(tmp_regex);
|
||||||
return number;
|
return number;
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,6 +124,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
|
||||||
int proceed = 0;
|
int proceed = 0;
|
||||||
char *expression_expanded = NULL, *field_expanded = NULL;
|
char *expression_expanded = NULL, *field_expanded = NULL;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
const char *to = switch_event_get_header(event, "to");
|
const char *to = switch_event_get_header(event, "to");
|
||||||
const char *tzoff = NULL, *tzname_ = NULL;
|
const char *tzoff = NULL, *tzname_ = NULL;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
@ -143,7 +144,6 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
|
||||||
char *do_break_a = NULL;
|
char *do_break_a = NULL;
|
||||||
char *expression = NULL;
|
char *expression = NULL;
|
||||||
const char *field_data = NULL;
|
const char *field_data = NULL;
|
||||||
int ovector[30];
|
|
||||||
switch_bool_t anti_action = SWITCH_TRUE;
|
switch_bool_t anti_action = SWITCH_TRUE;
|
||||||
break_t do_break_i = BREAK_ON_FALSE;
|
break_t do_break_i = BREAK_ON_FALSE;
|
||||||
int time_match;
|
int time_match;
|
||||||
|
@ -214,7 +214,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
|
||||||
field_data = "";
|
field_data = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(field_data, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(field_data, expression, &re, &match_data))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG,
|
switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_DEBUG,
|
||||||
"Chatplan: %s Regex (PASS) [%s] %s(%s) =~ /%s/ break=%s\n",
|
"Chatplan: %s Regex (PASS) [%s] %s(%s) =~ /%s/ break=%s\n",
|
||||||
to, exten_name, field, field_data, expression, do_break_a ? do_break_a : "on-false");
|
to, exten_name, field, field_data, expression, do_break_a ? do_break_a : "on-false");
|
||||||
|
@ -271,7 +271,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
|
||||||
} else {
|
} else {
|
||||||
if (field && strchr(expression, '(')) {
|
if (field && strchr(expression, '(')) {
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "DP_MATCH", NULL);
|
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "DP_MATCH", NULL);
|
||||||
switch_capture_regex(re, proceed, field_data, ovector, "DP_MATCH", switch_regex_set_event_header_callback, event);
|
switch_capture_regex(match_data, proceed, "DP_MATCH", switch_regex_set_event_header_callback, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (xaction = switch_xml_child(xcond, "action"); xaction; xaction = xaction->next) {
|
for (xaction = switch_xml_child(xcond, "action"); xaction; xaction = xaction->next) {
|
||||||
|
@ -297,7 +297,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
switch_perform_substitution(re, proceed, data, field_data, substituted, len, ovector);
|
switch_perform_substitution(match_data, data, substituted, len);
|
||||||
app_data = substituted;
|
app_data = substituted;
|
||||||
} else {
|
} else {
|
||||||
app_data = data;
|
app_data = data;
|
||||||
|
@ -326,7 +326,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
|
||||||
switch_safe_free(substituted);
|
switch_safe_free(substituted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
if (((anti_action == SWITCH_FALSE && do_break_i == BREAK_ON_TRUE) ||
|
if (((anti_action == SWITCH_FALSE && do_break_i == BREAK_ON_TRUE) ||
|
||||||
(anti_action == SWITCH_TRUE && do_break_i == BREAK_ON_FALSE)) || do_break_i == BREAK_ALWAYS) {
|
(anti_action == SWITCH_TRUE && do_break_i == BREAK_ON_FALSE)) || do_break_i == BREAK_ALWAYS) {
|
||||||
|
@ -335,7 +335,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(field_expanded);
|
switch_safe_free(field_expanded);
|
||||||
switch_safe_free(expression_expanded);
|
switch_safe_free(expression_expanded);
|
||||||
return proceed;
|
return proceed;
|
||||||
|
|
|
@ -117,7 +117,8 @@ static void translate_number(char *number, char *profile, char **translated, swi
|
||||||
translate_rule_t *hi = NULL;
|
translate_rule_t *hi = NULL;
|
||||||
translate_rule_t *rule = NULL;
|
translate_rule_t *rule = NULL;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int proceed = 0, ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
int proceed = 0;
|
||||||
char *substituted = NULL, *subbed = NULL;
|
char *substituted = NULL, *subbed = NULL;
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
|
|
||||||
|
@ -136,17 +137,17 @@ static void translate_number(char *number, char *profile, char **translated, swi
|
||||||
|
|
||||||
for (rule = hi; rule; rule = rule->next) {
|
for (rule = hi; rule; rule = rule->next) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s =~ /%s/\n", number, rule->regex);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s =~ /%s/\n", number, rule->regex);
|
||||||
if ((proceed = switch_regex_perform(number, rule->regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(number, rule->regex, &re, &match_data))) {
|
||||||
len = (uint32_t) (strlen(number) + strlen(rule->replace) + 10) * proceed;
|
len = (uint32_t) (strlen(number) + strlen(rule->replace) + 10) * proceed;
|
||||||
if (!(substituted = malloc(len))) {
|
if (!(substituted = malloc(len))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
|
|
||||||
switch_perform_substitution(re, proceed, rule->replace, number, substituted, len, ovector);
|
switch_perform_substitution(match_data, rule->replace, substituted, len);
|
||||||
|
|
||||||
if ((switch_string_var_check_const(substituted) || switch_string_has_escaped_data(substituted))) {
|
if ((switch_string_var_check_const(substituted) || switch_string_has_escaped_data(substituted))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "perform variable expansion\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "perform variable expansion\n");
|
||||||
|
@ -169,7 +170,7 @@ static void translate_number(char *number, char *profile, char **translated, swi
|
||||||
switch_safe_free(subbed);
|
switch_safe_free(subbed);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,9 +170,8 @@ SWITCH_STANDARD_DIALPLAN(asterisk_dialplan_hunt)
|
||||||
char *expression = NULL, expression_buf[1024] = { 0 };
|
char *expression = NULL, expression_buf[1024] = { 0 };
|
||||||
char substituted[2048] = "";
|
char substituted[2048] = "";
|
||||||
const char *field_data = caller_profile->destination_number;
|
const char *field_data = caller_profile->destination_number;
|
||||||
int proceed = 0;
|
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30] = { 0 };
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
char *cid = NULL;
|
char *cid = NULL;
|
||||||
|
|
||||||
expression = expression_buf;
|
expression = expression_buf;
|
||||||
|
@ -221,8 +220,8 @@ SWITCH_STANDARD_DIALPLAN(asterisk_dialplan_hunt)
|
||||||
field_data = "";
|
field_data = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(proceed = switch_regex_perform(field_data, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if (!(switch_regex_perform(field_data, expression, &re, &match_data))) {
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(field_expanded);
|
switch_safe_free(field_expanded);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -267,11 +266,11 @@ SWITCH_STANDARD_DIALPLAN(asterisk_dialplan_hunt)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strchr(expression, '(')) {
|
if (strchr(expression, '(')) {
|
||||||
switch_perform_substitution(re, proceed, argument, field_data, substituted, sizeof(substituted), ovector);
|
switch_perform_substitution(match_data, argument, substituted, sizeof(substituted));
|
||||||
argument = substituted;
|
argument = substituted;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
if (!extension) {
|
if (!extension) {
|
||||||
if (zstr(field_data)) {
|
if (zstr(field_data)) {
|
||||||
|
|
|
@ -103,6 +103,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
int proceed = 0, save_proceed = 0;
|
int proceed = 0, save_proceed = 0;
|
||||||
char *expression_expanded = NULL, *field_expanded = NULL;
|
char *expression_expanded = NULL, *field_expanded = NULL;
|
||||||
switch_regex_t *re = NULL, *save_re = NULL;
|
switch_regex_t *re = NULL, *save_re = NULL;
|
||||||
|
switch_regex_match_data_t *match_data = NULL, *save_match_data = NULL;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
const char *tmp, *tzoff = NULL, *tzname_ = NULL, *req_nesta = NULL;
|
const char *tmp, *tzoff = NULL, *tzname_ = NULL, *req_nesta = NULL;
|
||||||
char nbuf[128] = "";
|
char nbuf[128] = "";
|
||||||
|
@ -170,7 +171,6 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
char *expression = NULL, *save_expression = NULL, *save_field_data = NULL;
|
char *expression = NULL, *save_expression = NULL, *save_field_data = NULL;
|
||||||
char *regex_rule = NULL;
|
char *regex_rule = NULL;
|
||||||
const char *field_data = NULL;
|
const char *field_data = NULL;
|
||||||
int ovector[30];
|
|
||||||
switch_bool_t anti_action = SWITCH_TRUE;
|
switch_bool_t anti_action = SWITCH_TRUE;
|
||||||
break_t do_break_i = BREAK_ON_FALSE;
|
break_t do_break_i = BREAK_ON_FALSE;
|
||||||
int time_match;
|
int time_match;
|
||||||
|
@ -292,7 +292,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
field_data = "";
|
field_data = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(field_data, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(field_data, expression, &re, &match_data))) {
|
||||||
if ( switch_core_test_flag(SCF_DIALPLAN_TIMESTAMPS) ) {
|
if ( switch_core_test_flag(SCF_DIALPLAN_TIMESTAMPS) ) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
|
||||||
"%sDialplan: %s Regex (PASS) [%s] %s(%s) =~ /%s/ match=%s\n", space,
|
"%sDialplan: %s Regex (PASS) [%s] %s(%s) =~ /%s/ match=%s\n", space,
|
||||||
|
@ -344,21 +344,22 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
switch_snprintf(var, sizeof(var), "DP_REGEX_MATCH_%d", total);
|
switch_snprintf(var, sizeof(var), "DP_REGEX_MATCH_%d", total);
|
||||||
|
|
||||||
switch_channel_set_variable(channel, var, NULL);
|
switch_channel_set_variable(channel, var, NULL);
|
||||||
switch_capture_regex(re, proceed, field_data, ovector, var, switch_regex_set_var_callback, session);
|
switch_capture_regex(match_data, proceed, var, switch_regex_set_var_callback, session);
|
||||||
|
|
||||||
switch_safe_free(save_expression);
|
switch_safe_free(save_expression);
|
||||||
switch_safe_free(save_field_data);
|
switch_safe_free(save_field_data);
|
||||||
switch_regex_safe_free(save_re);
|
switch_regex_and_match_data_safe_free(save_re, save_match_data);
|
||||||
|
|
||||||
save_expression = strdup(expression);
|
save_expression = strdup(expression);
|
||||||
save_field_data = strdup(field_data);
|
save_field_data = strdup(field_data);
|
||||||
save_re = re;
|
save_re = re;
|
||||||
|
save_match_data = match_data;
|
||||||
save_proceed = proceed;
|
save_proceed = proceed;
|
||||||
|
|
||||||
re = NULL;
|
re = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
switch_safe_free(field_expanded);
|
switch_safe_free(field_expanded);
|
||||||
if (expression == expression_expanded) expression = NULL;
|
if (expression == expression_expanded) expression = NULL;
|
||||||
|
@ -406,7 +407,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
field_data = "";
|
field_data = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(field_data, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(field_data, expression, &re, &match_data))) {
|
||||||
if ( switch_core_test_flag(SCF_DIALPLAN_TIMESTAMPS) ) {
|
if ( switch_core_test_flag(SCF_DIALPLAN_TIMESTAMPS) ) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
|
||||||
"%sDialplan: %s Regex (PASS) [%s] %s(%s) =~ /%s/ break=%s\n", space,
|
"%sDialplan: %s Regex (PASS) [%s] %s(%s) =~ /%s/ break=%s\n", space,
|
||||||
|
@ -446,7 +447,9 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
|
|
||||||
if (save_re) {
|
if (save_re) {
|
||||||
re = save_re;
|
re = save_re;
|
||||||
|
match_data = save_match_data;
|
||||||
save_re = NULL;
|
save_re = NULL;
|
||||||
|
save_match_data = NULL;
|
||||||
|
|
||||||
expression = expression_expanded = save_expression;
|
expression = expression_expanded = save_expression;
|
||||||
save_expression = NULL;
|
save_expression = NULL;
|
||||||
|
@ -506,7 +509,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
} else {
|
} else {
|
||||||
if (field && expression && strchr(expression, '(')) {
|
if (field && expression && strchr(expression, '(')) {
|
||||||
switch_channel_set_variable(channel, "DP_MATCH", NULL);
|
switch_channel_set_variable(channel, "DP_MATCH", NULL);
|
||||||
switch_capture_regex(re, proceed, field_data, ovector, "DP_MATCH", switch_regex_set_var_callback, session);
|
switch_capture_regex(match_data, proceed, "DP_MATCH", switch_regex_set_var_callback, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (xaction = switch_xml_child(xcond, "action"); xaction; xaction = xaction->next) {
|
for (xaction = switch_xml_child(xcond, "action"); xaction; xaction = xaction->next) {
|
||||||
|
@ -534,7 +537,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
switch_perform_substitution(re, proceed, data, field_data, substituted, len, ovector);
|
switch_perform_substitution(match_data, data, substituted, len);
|
||||||
app_data = substituted;
|
app_data = substituted;
|
||||||
} else {
|
} else {
|
||||||
app_data = data;
|
app_data = data;
|
||||||
|
@ -571,7 +574,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
switch_safe_free(substituted);
|
switch_safe_free(substituted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
if (((anti_action == SWITCH_FALSE && do_break_i == BREAK_ON_TRUE) ||
|
if (((anti_action == SWITCH_FALSE && do_break_i == BREAK_ON_TRUE) ||
|
||||||
(anti_action == SWITCH_TRUE && do_break_i == BREAK_ON_FALSE)) || do_break_i == BREAK_ALWAYS) {
|
(anti_action == SWITCH_TRUE && do_break_i == BREAK_ON_FALSE)) || do_break_i == BREAK_ALWAYS) {
|
||||||
|
@ -591,7 +594,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(field_expanded);
|
switch_safe_free(field_expanded);
|
||||||
switch_safe_free(expression_expanded);
|
switch_safe_free(expression_expanded);
|
||||||
|
|
||||||
|
|
|
@ -912,7 +912,7 @@ char *sofia_glue_get_extra_headers(switch_channel_t *channel, const char *prefix
|
||||||
switch_event_header_t *hi = NULL;
|
switch_event_header_t *hi = NULL;
|
||||||
const char *exclude_regex = NULL;
|
const char *exclude_regex = NULL;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30] = {0};
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
|
||||||
exclude_regex = switch_channel_get_variable(channel, "exclude_outgoing_extra_header");
|
exclude_regex = switch_channel_get_variable(channel, "exclude_outgoing_extra_header");
|
||||||
SWITCH_STANDARD_STREAM(stream);
|
SWITCH_STANDARD_STREAM(stream);
|
||||||
|
@ -926,12 +926,12 @@ char *sofia_glue_get_extra_headers(switch_channel_t *channel, const char *prefix
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strncasecmp(name, prefix, strlen(prefix))) {
|
if (!strncasecmp(name, prefix, strlen(prefix))) {
|
||||||
if ( !exclude_regex || !(/*proceed*/ switch_regex_perform(name, exclude_regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ( !exclude_regex || !(/*proceed*/ switch_regex_perform(name, exclude_regex, &re, &match_data))) {
|
||||||
const char *hname = name + strlen(prefix);
|
const char *hname = name + strlen(prefix);
|
||||||
stream.write_function(&stream, "%s: %s\r\n", hname, value);
|
stream.write_function(&stream, "%s: %s\r\n", hname, value);
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Ignoring Extra Header [%s] , matches exclude_outgoing_extra_header [%s]\n", name, exclude_regex);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Ignoring Extra Header [%s] , matches exclude_outgoing_extra_header [%s]\n", name, exclude_regex);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1883,22 +1883,22 @@ authed:
|
||||||
if (vhost->rewrites) {
|
if (vhost->rewrites) {
|
||||||
switch_event_header_t *rule = vhost->rewrites->headers;
|
switch_event_header_t *rule = vhost->rewrites->headers;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
int proceed;
|
int proceed;
|
||||||
|
|
||||||
while(rule) {
|
while(rule) {
|
||||||
char *expression = rule->name;
|
char *expression = rule->name;
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(request->uri, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(request->uri, expression, &re, &match_data))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,
|
||||||
"%d request [%s] matched expr [%s]\n", proceed, request->uri, expression);
|
"%d request [%s] matched expr [%s]\n", proceed, request->uri, expression);
|
||||||
request->uri = rule->value;
|
request->uri = rule->value;
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rule = rule->next;
|
rule = rule->next;
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -250,9 +250,9 @@ static void event_handler(switch_event_t *event)
|
||||||
|
|
||||||
if (*hp->value == '/') {
|
if (*hp->value == '/') {
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
cmp = !!switch_regex_perform(hval, comp_to, &re, &match_data);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
} else {
|
} else {
|
||||||
cmp = !strcasecmp(hval, comp_to);
|
cmp = !strcasecmp(hval, comp_to);
|
||||||
}
|
}
|
||||||
|
|
|
@ -350,9 +350,9 @@ static void event_handler(switch_event_t *event)
|
||||||
|
|
||||||
if (*hp->value == '/') {
|
if (*hp->value == '/') {
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
cmp = !!switch_regex_perform(hval, comp_to, &re, &match_data);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
} else {
|
} else {
|
||||||
cmp = !strcasecmp(hval, comp_to);
|
cmp = !strcasecmp(hval, comp_to);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,12 @@ IKS_LA=$(IKS_BUILDDIR)/src/libiksemel.la
|
||||||
noinst_LTLIBRARIES = librayomod.la
|
noinst_LTLIBRARIES = librayomod.la
|
||||||
librayomod_la_SOURCES = mod_rayo.c iks_helpers.c nlsml.c rayo_components.c rayo_cpa_component.c rayo_cpa_detector.c rayo_elements.c rayo_fax_components.c
|
librayomod_la_SOURCES = mod_rayo.c iks_helpers.c nlsml.c rayo_components.c rayo_cpa_component.c rayo_cpa_detector.c rayo_elements.c rayo_fax_components.c
|
||||||
librayomod_la_SOURCES += rayo_input_component.c rayo_output_component.c rayo_prompt_component.c rayo_record_component.c sasl.c srgs.c xmpp_streams.c rayo_exec_component.c
|
librayomod_la_SOURCES += rayo_input_component.c rayo_output_component.c rayo_prompt_component.c rayo_record_component.c sasl.c srgs.c xmpp_streams.c rayo_exec_component.c
|
||||||
librayomod_la_CFLAGS = $(AM_CFLAGS) -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS)
|
librayomod_la_CFLAGS = $(AM_CFLAGS) -I$(switch_builddir)/libs/iksemel/include $(PCRE2_CFLAGS)
|
||||||
|
|
||||||
mod_LTLIBRARIES = mod_rayo.la
|
mod_LTLIBRARIES = mod_rayo.la
|
||||||
mod_rayo_la_SOURCES =
|
mod_rayo_la_SOURCES =
|
||||||
mod_rayo_la_CFLAGS = $(AM_CFLAGS) -I$(IKS_DIR)/include $(PCRE_CFLAGS)
|
mod_rayo_la_CFLAGS = $(AM_CFLAGS) -I$(IKS_DIR)/include $(PCRE2_CFLAGS)
|
||||||
mod_rayo_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(IKS_LA) $(PCRE_LIBS) librayomod.la
|
mod_rayo_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(IKS_LA) $(PCRE2_LIBS) librayomod.la
|
||||||
mod_rayo_la_LDFLAGS = -avoid-version -module -no-undefined -shared
|
mod_rayo_la_LDFLAGS = -avoid-version -module -no-undefined -shared
|
||||||
|
|
||||||
BUILT_SOURCES=$(IKS_LA)
|
BUILT_SOURCES=$(IKS_LA)
|
||||||
|
@ -25,19 +25,19 @@ $(IKS_LA): $(IKS_BUILDDIR) $(IKS_DIR) $(IKS_DIR)/.update
|
||||||
noinst_PROGRAMS = test/test_iks test/test_nlsml test/test_srgs
|
noinst_PROGRAMS = test/test_iks test/test_nlsml test/test_srgs
|
||||||
|
|
||||||
test_test_iks_SOURCES = test/test_iks.c
|
test_test_iks_SOURCES = test/test_iks.c
|
||||||
test_test_iks_CFLAGS = $(AM_CFLAGS) -I. -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS) -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
|
test_test_iks_CFLAGS = $(AM_CFLAGS) -I. -I$(switch_builddir)/libs/iksemel/include $(PCRE2_CFLAGS) -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
|
||||||
test_test_iks_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
test_test_iks_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
||||||
test_test_iks_LDADD = librayomod.la $(IKS_LA) $(PCRE_LIBS) $(switch_builddir)/libfreeswitch.la
|
test_test_iks_LDADD = librayomod.la $(IKS_LA) $(PCRE2_LIBS) $(switch_builddir)/libfreeswitch.la
|
||||||
|
|
||||||
test_test_nlsml_SOURCES = test/test_nlsml.c
|
test_test_nlsml_SOURCES = test/test_nlsml.c
|
||||||
test_test_nlsml_CFLAGS = $(AM_CFLAGS) -I. -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS) -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
|
test_test_nlsml_CFLAGS = $(AM_CFLAGS) -I. -I$(switch_builddir)/libs/iksemel/include $(PCRE2_CFLAGS) -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
|
||||||
test_test_nlsml_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
test_test_nlsml_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
||||||
test_test_nlsml_LDADD = librayomod.la $(IKS_LA) $(PCRE_LIBS) $(switch_builddir)/libfreeswitch.la
|
test_test_nlsml_LDADD = librayomod.la $(IKS_LA) $(PCRE2_LIBS) $(switch_builddir)/libfreeswitch.la
|
||||||
|
|
||||||
test_test_srgs_SOURCES = test/test_srgs.c
|
test_test_srgs_SOURCES = test/test_srgs.c
|
||||||
test_test_srgs_CFLAGS = $(AM_CFLAGS) -I. -I$(switch_builddir)/libs/iksemel/include $(PCRE_CFLAGS) -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
|
test_test_srgs_CFLAGS = $(AM_CFLAGS) -I. -I$(switch_builddir)/libs/iksemel/include $(PCRE2_CFLAGS) -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
|
||||||
test_test_srgs_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
test_test_srgs_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
||||||
test_test_srgs_LDADD = librayomod.la $(IKS_LA) $(PCRE_LIBS) $(switch_builddir)/libfreeswitch.la
|
test_test_srgs_LDADD = librayomod.la $(IKS_LA) $(PCRE2_LIBS) $(switch_builddir)/libfreeswitch.la
|
||||||
|
|
||||||
|
|
||||||
TESTS = $(noinst_PROGRAMS)
|
TESTS = $(noinst_PROGRAMS)
|
||||||
|
|
|
@ -28,7 +28,8 @@
|
||||||
*/
|
*/
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
#include <iksemel.h>
|
#include <iksemel.h>
|
||||||
#include <pcre.h>
|
#define PCRE2_CODE_UNIT_WIDTH 8
|
||||||
|
#include <pcre2.h>
|
||||||
|
|
||||||
#include "srgs.h"
|
#include "srgs.h"
|
||||||
|
|
||||||
|
@ -179,7 +180,7 @@ struct srgs_grammar {
|
||||||
/** root rule */
|
/** root rule */
|
||||||
struct srgs_node *root_rule;
|
struct srgs_node *root_rule;
|
||||||
/** compiled grammar regex */
|
/** compiled grammar regex */
|
||||||
pcre *compiled_regex;
|
pcre2_code *compiled_regex;
|
||||||
/** grammar in regex format */
|
/** grammar in regex format */
|
||||||
char *regex;
|
char *regex;
|
||||||
/** grammar in JSGF format */
|
/** grammar in JSGF format */
|
||||||
|
@ -846,7 +847,7 @@ static void srgs_grammar_destroy(struct srgs_grammar *grammar)
|
||||||
{
|
{
|
||||||
switch_memory_pool_t *pool = grammar->pool;
|
switch_memory_pool_t *pool = grammar->pool;
|
||||||
if (grammar->compiled_regex) {
|
if (grammar->compiled_regex) {
|
||||||
pcre_free(grammar->compiled_regex);
|
pcre2_code_free(grammar->compiled_regex);
|
||||||
}
|
}
|
||||||
if (grammar->jsgf_file_name) {
|
if (grammar->jsgf_file_name) {
|
||||||
switch_file_remove(grammar->jsgf_file_name, pool);
|
switch_file_remove(grammar->jsgf_file_name, pool);
|
||||||
|
@ -986,7 +987,7 @@ static int create_regexes(struct srgs_grammar *grammar, struct srgs_node *node,
|
||||||
case '+':
|
case '+':
|
||||||
case '(':
|
case '(':
|
||||||
case ')':
|
case ')':
|
||||||
/* escape special PCRE regex characters */
|
/* escape special PCRE2 regex characters */
|
||||||
stream->write_function(stream, "\\%c", node->value.string[i]);
|
stream->write_function(stream, "\\%c", node->value.string[i]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1082,10 +1083,10 @@ static int create_regexes(struct srgs_grammar *grammar, struct srgs_node *node,
|
||||||
/**
|
/**
|
||||||
* Compile regex
|
* Compile regex
|
||||||
*/
|
*/
|
||||||
static pcre *get_compiled_regex(struct srgs_grammar *grammar)
|
static pcre2_code *get_compiled_regex(struct srgs_grammar *grammar)
|
||||||
{
|
{
|
||||||
int erroffset = 0;
|
PCRE2_SIZE erroffset = 0;
|
||||||
const char *errptr = "";
|
int errcode = 0;
|
||||||
int options = 0;
|
int options = 0;
|
||||||
const char *regex;
|
const char *regex;
|
||||||
|
|
||||||
|
@ -1096,7 +1097,7 @@ static pcre *get_compiled_regex(struct srgs_grammar *grammar)
|
||||||
|
|
||||||
switch_mutex_lock(grammar->mutex);
|
switch_mutex_lock(grammar->mutex);
|
||||||
if (!grammar->compiled_regex && (regex = srgs_grammar_to_regex(grammar))) {
|
if (!grammar->compiled_regex && (regex = srgs_grammar_to_regex(grammar))) {
|
||||||
if (!(grammar->compiled_regex = pcre_compile(regex, options, &errptr, &erroffset, NULL))) {
|
if (!(grammar->compiled_regex = pcre2_compile((PCRE2_SPTR)regex, PCRE2_ZERO_TERMINATED, options, &errcode, &erroffset, NULL))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_UUID_LOG(grammar->uuid), SWITCH_LOG_WARNING, "Failed to compile grammar regex: %s\n", regex);
|
switch_log_printf(SWITCH_CHANNEL_UUID_LOG(grammar->uuid), SWITCH_LOG_WARNING, "Failed to compile grammar regex: %s\n", regex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1225,7 +1226,6 @@ struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_INPUT_SIZE 128
|
#define MAX_INPUT_SIZE 128
|
||||||
#define OVECTOR_SIZE MAX_TAGS
|
|
||||||
#define WORKSPACE_SIZE 1024
|
#define WORKSPACE_SIZE 1024
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1234,9 +1234,9 @@ struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document
|
||||||
* @param input the input to check
|
* @param input the input to check
|
||||||
* @return true if end of match (no more input can be added)
|
* @return true if end of match (no more input can be added)
|
||||||
*/
|
*/
|
||||||
static int is_match_end(pcre *compiled_regex, const char *input)
|
static int is_match_end(pcre2_code *compiled_regex, const char *input)
|
||||||
{
|
{
|
||||||
int ovector[OVECTOR_SIZE];
|
pcre2_match_data *match_data;
|
||||||
int input_size = strlen(input);
|
int input_size = strlen(input);
|
||||||
char search_input[MAX_INPUT_SIZE + 2];
|
char search_input[MAX_INPUT_SIZE + 2];
|
||||||
const char *search_set = "0123456789#*ABCD";
|
const char *search_set = "0123456789#*ABCD";
|
||||||
|
@ -1257,13 +1257,15 @@ static int is_match_end(pcre *compiled_regex, const char *input)
|
||||||
search = search_set;
|
search = search_set;
|
||||||
}
|
}
|
||||||
search_input[input_size] = *search++;
|
search_input[input_size] = *search++;
|
||||||
result = pcre_exec(compiled_regex, NULL, search_input, input_size + 1, 0, PCRE_PARTIAL,
|
match_data = pcre2_match_data_create_from_pattern(compiled_regex, NULL);
|
||||||
ovector, sizeof(ovector) / sizeof(ovector[0]));
|
result = pcre2_match(compiled_regex, (PCRE2_SPTR)search_input, input_size + 1, 0,
|
||||||
|
PCRE2_PARTIAL_SOFT, match_data, 0);
|
||||||
|
pcre2_match_data_free(match_data);
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "not match end\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "not match end\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (result == PCRE_ERROR_PARTIAL) {
|
if (result == PCRE2_ERROR_PARTIAL) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "partial match possible - not match end\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "partial match possible - not match end\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1282,8 +1284,8 @@ static int is_match_end(pcre *compiled_regex, const char *input)
|
||||||
enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation)
|
enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char *input, const char **interpretation)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
int ovector[OVECTOR_SIZE];
|
pcre2_code *compiled_regex;
|
||||||
pcre *compiled_regex;
|
pcre2_match_data *match_data;
|
||||||
|
|
||||||
*interpretation = NULL;
|
*interpretation = NULL;
|
||||||
|
|
||||||
|
@ -1298,8 +1300,11 @@ enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char
|
||||||
if (!(compiled_regex = get_compiled_regex(grammar))) {
|
if (!(compiled_regex = get_compiled_regex(grammar))) {
|
||||||
return SMT_NO_MATCH;
|
return SMT_NO_MATCH;
|
||||||
}
|
}
|
||||||
result = pcre_exec(compiled_regex, NULL, input, strlen(input), 0, PCRE_PARTIAL,
|
|
||||||
ovector, OVECTOR_SIZE);
|
match_data = pcre2_match_data_create_from_pattern(compiled_regex, NULL);
|
||||||
|
|
||||||
|
result = pcre2_match(compiled_regex, (PCRE2_SPTR)input, strlen(input), 0, PCRE2_PARTIAL_SOFT,
|
||||||
|
match_data, NULL);
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "match = %i\n", result);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "match = %i\n", result);
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
|
@ -1310,24 +1315,33 @@ enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char
|
||||||
/* find matching instance... */
|
/* find matching instance... */
|
||||||
for (i = 1; i <= grammar->tag_count; i++) {
|
for (i = 1; i <= grammar->tag_count; i++) {
|
||||||
char substring_name[16] = { 0 };
|
char substring_name[16] = { 0 };
|
||||||
|
PCRE2_SIZE buffer_size = MAX_INPUT_SIZE + 1;
|
||||||
buffer[0] = '\0';
|
buffer[0] = '\0';
|
||||||
snprintf(substring_name, 16, "tag%d", i);
|
snprintf(substring_name, 16, "tag%d", i);
|
||||||
if (pcre_copy_named_substring(compiled_regex, input, ovector, result, substring_name, buffer, MAX_INPUT_SIZE) != PCRE_ERROR_NOSUBSTRING && !zstr_buf(buffer)) {
|
if (pcre2_substring_copy_byname(match_data, (PCRE2_SPTR)substring_name, (PCRE2_UCHAR *)buffer, &buffer_size) != PCRE2_ERROR_NOSUBSTRING && !zstr_buf(buffer)) {
|
||||||
*interpretation = grammar->tags[i];
|
*interpretation = grammar->tags[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_match_end(compiled_regex, input)) {
|
if (is_match_end(compiled_regex, input)) {
|
||||||
return SMT_MATCH_END;
|
result = SMT_MATCH_END;
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
return SMT_MATCH;
|
result = SMT_MATCH;
|
||||||
}
|
goto exit;
|
||||||
if (result == PCRE_ERROR_PARTIAL) {
|
|
||||||
return SMT_MATCH_PARTIAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return SMT_NO_MATCH;
|
if (result == PCRE2_ERROR_PARTIAL) {
|
||||||
|
result = SMT_MATCH_PARTIAL;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = SMT_NO_MATCH;
|
||||||
|
exit:
|
||||||
|
pcre2_match_data_free(match_data);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -135,7 +135,13 @@ struct sqlite3 {
|
||||||
struct switch_ivr_digit_stream {
|
struct switch_ivr_digit_stream {
|
||||||
char foo[];
|
char foo[];
|
||||||
};
|
};
|
||||||
struct real_pcre {
|
struct real_pcre2 {
|
||||||
|
char foo[];
|
||||||
|
};
|
||||||
|
struct pcre2_real_match_data_8 {
|
||||||
|
char foo[];
|
||||||
|
};
|
||||||
|
struct pcre2_real_compile_context_8 {
|
||||||
char foo[];
|
char foo[];
|
||||||
};
|
};
|
||||||
struct HashElem {
|
struct HashElem {
|
||||||
|
|
|
@ -9309,44 +9309,48 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_compile___(c
|
||||||
void * jresult ;
|
void * jresult ;
|
||||||
char *arg1 = (char *) 0 ;
|
char *arg1 = (char *) 0 ;
|
||||||
int arg2 ;
|
int arg2 ;
|
||||||
char **arg3 = (char **) 0 ;
|
int *arg3 = (int *) 0 ;
|
||||||
int *arg4 = (int *) 0 ;
|
unsigned int *arg4 = (unsigned int *) 0 ;
|
||||||
unsigned char *arg5 = (unsigned char *) 0 ;
|
switch_regex_compile_context_t *arg5 = (switch_regex_compile_context_t *) 0 ;
|
||||||
switch_regex_t *result = 0 ;
|
switch_regex_t *result = 0 ;
|
||||||
|
|
||||||
arg1 = (char *)jarg1;
|
arg1 = (char *)jarg1;
|
||||||
arg2 = (int)jarg2;
|
arg2 = (int)jarg2;
|
||||||
arg3 = (char **)jarg3;
|
arg3 = (int *)jarg3;
|
||||||
arg4 = (int *)jarg4;
|
arg4 = (unsigned int *)jarg4;
|
||||||
arg5 = (unsigned char *)jarg5;
|
arg5 = (switch_regex_compile_context_t *)jarg5;
|
||||||
result = (switch_regex_t *)switch_regex_compile((char const *)arg1,arg2,(char const **)arg3,arg4,(unsigned char const *)arg5);
|
result = (switch_regex_t *)switch_regex_compile((char const *)arg1,arg2,arg3,arg4,arg5);
|
||||||
jresult = (void *)result;
|
jresult = (void *)result;
|
||||||
return jresult;
|
return jresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SWIGEXPORT int SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_copy_substring___(char * jarg1, void * jarg2, int jarg3, int jarg4, char * jarg5, int jarg6) {
|
SWIGEXPORT int SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_copy_substring___(void * jarg1, int jarg2, char * jarg3, void * jarg4) {
|
||||||
int jresult ;
|
int jresult ;
|
||||||
char *arg1 = (char *) 0 ;
|
switch_regex_match_data_t *arg1 = (switch_regex_match_data_t *) 0 ;
|
||||||
int *arg2 = (int *) 0 ;
|
int arg2 ;
|
||||||
int arg3 ;
|
char *arg3 = (char *) 0 ;
|
||||||
int arg4 ;
|
unsigned int *arg4 = (unsigned int *) 0 ;
|
||||||
char *arg5 = (char *) 0 ;
|
|
||||||
int arg6 ;
|
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
arg1 = (char *)jarg1;
|
arg1 = (switch_regex_match_data_t *)jarg1;
|
||||||
arg2 = (int *)jarg2;
|
arg2 = (int)jarg2;
|
||||||
arg3 = (int)jarg3;
|
arg3 = (char *)jarg3;
|
||||||
arg4 = (int)jarg4;
|
arg4 = (unsigned int *)jarg4;
|
||||||
arg5 = (char *)jarg5;
|
result = (int)switch_regex_copy_substring(arg1,arg2,arg3,arg4);
|
||||||
arg6 = (int)jarg6;
|
|
||||||
result = (int)switch_regex_copy_substring((char const *)arg1,arg2,arg3,arg4,arg5,arg6);
|
|
||||||
jresult = result;
|
jresult = result;
|
||||||
return jresult;
|
return jresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_match_free___(void * jarg1) {
|
||||||
|
void *arg1 = (void *) 0 ;
|
||||||
|
|
||||||
|
arg1 = (void *)jarg1;
|
||||||
|
switch_regex_match_free(arg1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_free___(void * jarg1) {
|
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_free___(void * jarg1) {
|
||||||
void *arg1 = (void *) 0 ;
|
void *arg1 = (void *) 0 ;
|
||||||
|
|
||||||
|
@ -9355,49 +9359,41 @@ SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_free___(void *
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SWIGEXPORT int SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_perform___(char * jarg1, char * jarg2, void * jarg3, void * jarg4, unsigned long jarg5) {
|
SWIGEXPORT int SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_perform___(char * jarg1, char * jarg2, void * jarg3, void * jarg4) {
|
||||||
int jresult ;
|
int jresult ;
|
||||||
char *arg1 = (char *) 0 ;
|
char *arg1 = (char *) 0 ;
|
||||||
char *arg2 = (char *) 0 ;
|
char *arg2 = (char *) 0 ;
|
||||||
switch_regex_t **arg3 = (switch_regex_t **) 0 ;
|
switch_regex_t **arg3 = (switch_regex_t **) 0 ;
|
||||||
int *arg4 = (int *) 0 ;
|
switch_regex_match_data_t **arg4 = (switch_regex_match_data_t **) 0 ;
|
||||||
uint32_t arg5 ;
|
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
arg1 = (char *)jarg1;
|
arg1 = (char *)jarg1;
|
||||||
arg2 = (char *)jarg2;
|
arg2 = (char *)jarg2;
|
||||||
arg3 = (switch_regex_t **)jarg3;
|
arg3 = (switch_regex_t **)jarg3;
|
||||||
arg4 = (int *)jarg4;
|
arg4 = (switch_regex_match_data_t **)jarg4;
|
||||||
arg5 = (uint32_t)jarg5;
|
result = (int)switch_regex_perform((char const *)arg1,(char const *)arg2,arg3,arg4);
|
||||||
result = (int)switch_regex_perform((char const *)arg1,(char const *)arg2,arg3,arg4,arg5);
|
|
||||||
jresult = result;
|
jresult = result;
|
||||||
return jresult;
|
return jresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_perform_substitution___(void * jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5, void * jarg6, void * jarg7) {
|
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_perform_substitution___(void * jarg1, char * jarg2, char * jarg3, void * jarg4) {
|
||||||
switch_regex_t *arg1 = (switch_regex_t *) 0 ;
|
switch_regex_match_data_t *arg1 = (switch_regex_match_data_t *) 0 ;
|
||||||
int arg2 ;
|
char *arg2 = (char *) 0 ;
|
||||||
char *arg3 = (char *) 0 ;
|
char *arg3 = (char *) 0 ;
|
||||||
char *arg4 = (char *) 0 ;
|
switch_size_t arg4 ;
|
||||||
char *arg5 = (char *) 0 ;
|
switch_size_t *argp4 ;
|
||||||
switch_size_t arg6 ;
|
|
||||||
int *arg7 = (int *) 0 ;
|
|
||||||
switch_size_t *argp6 ;
|
|
||||||
|
|
||||||
arg1 = (switch_regex_t *)jarg1;
|
arg1 = (switch_regex_match_data_t *)jarg1;
|
||||||
arg2 = (int)jarg2;
|
arg2 = (char *)jarg2;
|
||||||
arg3 = (char *)jarg3;
|
arg3 = (char *)jarg3;
|
||||||
arg4 = (char *)jarg4;
|
argp4 = (switch_size_t *)jarg4;
|
||||||
arg5 = (char *)jarg5;
|
if (!argp4) {
|
||||||
argp6 = (switch_size_t *)jarg6;
|
|
||||||
if (!argp6) {
|
|
||||||
SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null switch_size_t", 0);
|
SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null switch_size_t", 0);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
arg6 = *argp6;
|
arg4 = *argp4;
|
||||||
arg7 = (int *)jarg7;
|
switch_perform_substitution(arg1,(char const *)arg2,arg3,arg4);
|
||||||
switch_perform_substitution(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -9431,23 +9427,19 @@ SWIGEXPORT int SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_match_partial__
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_capture_regex___(void * jarg1, int jarg2, char * jarg3, void * jarg4, char * jarg5, void * jarg6, void * jarg7) {
|
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_capture_regex___(void * jarg1, int jarg2, char * jarg3, void * jarg4, void * jarg5) {
|
||||||
switch_regex_t *arg1 = (switch_regex_t *) 0 ;
|
switch_regex_match_data_t *arg1 = (switch_regex_match_data_t *) 0 ;
|
||||||
int arg2 ;
|
int arg2 ;
|
||||||
char *arg3 = (char *) 0 ;
|
char *arg3 = (char *) 0 ;
|
||||||
int *arg4 = (int *) 0 ;
|
switch_cap_callback_t arg4 = (switch_cap_callback_t) 0 ;
|
||||||
char *arg5 = (char *) 0 ;
|
void *arg5 = (void *) 0 ;
|
||||||
switch_cap_callback_t arg6 = (switch_cap_callback_t) 0 ;
|
|
||||||
void *arg7 = (void *) 0 ;
|
|
||||||
|
|
||||||
arg1 = (switch_regex_t *)jarg1;
|
arg1 = (switch_regex_match_data_t *)jarg1;
|
||||||
arg2 = (int)jarg2;
|
arg2 = (int)jarg2;
|
||||||
arg3 = (char *)jarg3;
|
arg3 = (char *)jarg3;
|
||||||
arg4 = (int *)jarg4;
|
arg4 = (switch_cap_callback_t)jarg4;
|
||||||
arg5 = (char *)jarg5;
|
arg5 = (void *)jarg5;
|
||||||
arg6 = (switch_cap_callback_t)jarg6;
|
switch_capture_regex(arg1,arg2,(char const *)arg3,arg4,arg5);
|
||||||
arg7 = (void *)jarg7;
|
|
||||||
switch_capture_regex(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6,arg7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4365,18 +4365,47 @@ public class SWIGTYPE_p_p_payload_map_s {
|
||||||
|
|
||||||
namespace FreeSWITCH.Native {
|
namespace FreeSWITCH.Native {
|
||||||
|
|
||||||
public class SWIGTYPE_p_p_real_pcre {
|
public class SWIGTYPE_p_p_pcre2_real_code {
|
||||||
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
||||||
|
|
||||||
internal SWIGTYPE_p_p_real_pcre(global::System.IntPtr cPtr, bool futureUse) {
|
internal SWIGTYPE_p_p_pcre2_real_code(global::System.IntPtr cPtr, bool futureUse) {
|
||||||
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SWIGTYPE_p_p_real_pcre() {
|
protected SWIGTYPE_p_p_pcre2_real_code() {
|
||||||
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_p_real_pcre obj) {
|
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_p_pcre2_real_code obj) {
|
||||||
|
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated />
|
||||||
|
//
|
||||||
|
// This file was automatically generated by SWIG (http://www.swig.org).
|
||||||
|
// Version 3.0.12
|
||||||
|
//
|
||||||
|
// Do not make changes to this file unless you know what you are doing--modify
|
||||||
|
// the SWIG interface file instead.
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace FreeSWITCH.Native {
|
||||||
|
|
||||||
|
public class SWIGTYPE_p_p_pcre2_real_match_data_8 {
|
||||||
|
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
||||||
|
|
||||||
|
internal SWIGTYPE_p_p_pcre2_real_match_data_8(global::System.IntPtr cPtr, bool futureUse) {
|
||||||
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SWIGTYPE_p_p_pcre2_real_match_data_8() {
|
||||||
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_p_pcre2_real_match_data_8 obj) {
|
||||||
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5641,18 +5670,18 @@ public class SWIGTYPE_p_p_void {
|
||||||
|
|
||||||
namespace FreeSWITCH.Native {
|
namespace FreeSWITCH.Native {
|
||||||
|
|
||||||
public class SWIGTYPE_p_pid_t {
|
public class SWIGTYPE_p_pcre2_real_code {
|
||||||
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
||||||
|
|
||||||
internal SWIGTYPE_p_pid_t(global::System.IntPtr cPtr, bool futureUse) {
|
internal SWIGTYPE_p_pcre2_real_code(global::System.IntPtr cPtr, bool futureUse) {
|
||||||
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SWIGTYPE_p_pid_t() {
|
protected SWIGTYPE_p_pcre2_real_code() {
|
||||||
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_pid_t obj) {
|
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_pcre2_real_code obj) {
|
||||||
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5670,18 +5699,76 @@ public class SWIGTYPE_p_pid_t {
|
||||||
|
|
||||||
namespace FreeSWITCH.Native {
|
namespace FreeSWITCH.Native {
|
||||||
|
|
||||||
public class SWIGTYPE_p_real_pcre {
|
public class SWIGTYPE_p_pcre2_real_compile_context_8 {
|
||||||
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
||||||
|
|
||||||
internal SWIGTYPE_p_real_pcre(global::System.IntPtr cPtr, bool futureUse) {
|
internal SWIGTYPE_p_pcre2_real_compile_context_8(global::System.IntPtr cPtr, bool futureUse) {
|
||||||
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SWIGTYPE_p_real_pcre() {
|
protected SWIGTYPE_p_pcre2_real_compile_context_8() {
|
||||||
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_real_pcre obj) {
|
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_pcre2_real_compile_context_8 obj) {
|
||||||
|
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated />
|
||||||
|
//
|
||||||
|
// This file was automatically generated by SWIG (http://www.swig.org).
|
||||||
|
// Version 3.0.12
|
||||||
|
//
|
||||||
|
// Do not make changes to this file unless you know what you are doing--modify
|
||||||
|
// the SWIG interface file instead.
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace FreeSWITCH.Native {
|
||||||
|
|
||||||
|
public class SWIGTYPE_p_pcre2_real_match_data_8 {
|
||||||
|
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
||||||
|
|
||||||
|
internal SWIGTYPE_p_pcre2_real_match_data_8(global::System.IntPtr cPtr, bool futureUse) {
|
||||||
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SWIGTYPE_p_pcre2_real_match_data_8() {
|
||||||
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_pcre2_real_match_data_8 obj) {
|
||||||
|
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated />
|
||||||
|
//
|
||||||
|
// This file was automatically generated by SWIG (http://www.swig.org).
|
||||||
|
// Version 3.0.12
|
||||||
|
//
|
||||||
|
// Do not make changes to this file unless you know what you are doing--modify
|
||||||
|
// the SWIG interface file instead.
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace FreeSWITCH.Native {
|
||||||
|
|
||||||
|
public class SWIGTYPE_p_pid_t {
|
||||||
|
private global::System.Runtime.InteropServices.HandleRef swigCPtr;
|
||||||
|
|
||||||
|
internal SWIGTYPE_p_pid_t(global::System.IntPtr cPtr, bool futureUse) {
|
||||||
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SWIGTYPE_p_pid_t() {
|
||||||
|
swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(SWIGTYPE_p_pid_t obj) {
|
||||||
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7976,36 +8063,32 @@ else
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SWIGTYPE_p_real_pcre switch_regex_compile(string pattern, int options, out string errorptr, SWIGTYPE_p_int erroroffset, SWIGTYPE_p_unsigned_char tables) {
|
public static SWIGTYPE_p_pcre2_real_code switch_regex_compile(string pattern, int options, SWIGTYPE_p_int errorcode, SWIGTYPE_p_unsigned_int erroroffset, SWIGTYPE_p_pcre2_real_compile_context_8 ccontext) {
|
||||||
var errorptr_ptr = global::System.IntPtr.Zero;
|
global::System.IntPtr cPtr = freeswitchPINVOKE.switch_regex_compile(pattern, options, SWIGTYPE_p_int.getCPtr(errorcode), SWIGTYPE_p_unsigned_int.getCPtr(erroroffset), SWIGTYPE_p_pcre2_real_compile_context_8.getCPtr(ccontext));
|
||||||
try {
|
SWIGTYPE_p_pcre2_real_code ret = (cPtr == global::System.IntPtr.Zero) ? null : new SWIGTYPE_p_pcre2_real_code(cPtr, false);
|
||||||
global::System.IntPtr cPtr = freeswitchPINVOKE.switch_regex_compile(pattern, options, ref errorptr_ptr, SWIGTYPE_p_int.getCPtr(erroroffset), SWIGTYPE_p_unsigned_char.getCPtr(tables));
|
return ret;
|
||||||
SWIGTYPE_p_real_pcre ret = (cPtr == global::System.IntPtr.Zero) ? null : new SWIGTYPE_p_real_pcre(cPtr, false);
|
|
||||||
return ret;
|
|
||||||
} finally {
|
|
||||||
if(errorptr_ptr != global::System.IntPtr.Zero)
|
|
||||||
errorptr = global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi(errorptr_ptr);
|
|
||||||
else
|
|
||||||
errorptr = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int switch_regex_copy_substring(string subject, SWIGTYPE_p_int ovector, int stringcount, int stringnumber, string buffer, int size) {
|
public static int switch_regex_copy_substring(SWIGTYPE_p_pcre2_real_match_data_8 match_data, int stringnumber, string buffer, SWIGTYPE_p_unsigned_int size) {
|
||||||
int ret = freeswitchPINVOKE.switch_regex_copy_substring(subject, SWIGTYPE_p_int.getCPtr(ovector), stringcount, stringnumber, buffer, size);
|
int ret = freeswitchPINVOKE.switch_regex_copy_substring(SWIGTYPE_p_pcre2_real_match_data_8.getCPtr(match_data), stringnumber, buffer, SWIGTYPE_p_unsigned_int.getCPtr(size));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void switch_regex_match_free(SWIGTYPE_p_void data) {
|
||||||
|
freeswitchPINVOKE.switch_regex_match_free(SWIGTYPE_p_void.getCPtr(data));
|
||||||
|
}
|
||||||
|
|
||||||
public static void switch_regex_free(SWIGTYPE_p_void data) {
|
public static void switch_regex_free(SWIGTYPE_p_void data) {
|
||||||
freeswitchPINVOKE.switch_regex_free(SWIGTYPE_p_void.getCPtr(data));
|
freeswitchPINVOKE.switch_regex_free(SWIGTYPE_p_void.getCPtr(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int switch_regex_perform(string field, string expression, SWIGTYPE_p_p_real_pcre new_re, SWIGTYPE_p_int ovector, uint olen) {
|
public static int switch_regex_perform(string field, string expression, SWIGTYPE_p_p_pcre2_real_code new_re, SWIGTYPE_p_p_pcre2_real_match_data_8 new_match_data) {
|
||||||
int ret = freeswitchPINVOKE.switch_regex_perform(field, expression, SWIGTYPE_p_p_real_pcre.getCPtr(new_re), SWIGTYPE_p_int.getCPtr(ovector), olen);
|
int ret = freeswitchPINVOKE.switch_regex_perform(field, expression, SWIGTYPE_p_p_pcre2_real_code.getCPtr(new_re), SWIGTYPE_p_p_pcre2_real_match_data_8.getCPtr(new_match_data));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void switch_perform_substitution(SWIGTYPE_p_real_pcre re, int match_count, string data, string field_data, string substituted, SWIGTYPE_p_switch_size_t len, SWIGTYPE_p_int ovector) {
|
public static void switch_perform_substitution(SWIGTYPE_p_pcre2_real_match_data_8 match_data, string data, string substituted, SWIGTYPE_p_switch_size_t len) {
|
||||||
freeswitchPINVOKE.switch_perform_substitution(SWIGTYPE_p_real_pcre.getCPtr(re), match_count, data, field_data, substituted, SWIGTYPE_p_switch_size_t.getCPtr(len), SWIGTYPE_p_int.getCPtr(ovector));
|
freeswitchPINVOKE.switch_perform_substitution(SWIGTYPE_p_pcre2_real_match_data_8.getCPtr(match_data), data, substituted, SWIGTYPE_p_switch_size_t.getCPtr(len));
|
||||||
if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
|
if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8019,8 +8102,8 @@ else
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void switch_capture_regex(SWIGTYPE_p_real_pcre re, int match_count, string field_data, SWIGTYPE_p_int ovector, string var, SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__void callback, SWIGTYPE_p_void user_data) {
|
public static void switch_capture_regex(SWIGTYPE_p_pcre2_real_match_data_8 match_data, int match_count, string var, SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__void callback, SWIGTYPE_p_void user_data) {
|
||||||
freeswitchPINVOKE.switch_capture_regex(SWIGTYPE_p_real_pcre.getCPtr(re), match_count, field_data, SWIGTYPE_p_int.getCPtr(ovector), var, SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__void.getCPtr(callback), SWIGTYPE_p_void.getCPtr(user_data));
|
freeswitchPINVOKE.switch_capture_regex(SWIGTYPE_p_pcre2_real_match_data_8.getCPtr(match_data), match_count, var, SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_void__void.getCPtr(callback), SWIGTYPE_p_void.getCPtr(user_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void switch_regex_set_var_callback(string var, string val, SWIGTYPE_p_void user_data) {
|
public static void switch_regex_set_var_callback(string var, string val, SWIGTYPE_p_void user_data) {
|
||||||
|
@ -17862,19 +17945,22 @@ class freeswitchPINVOKE {
|
||||||
public static extern string switch_sql_concat();
|
public static extern string switch_sql_concat();
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_compile___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_compile___")]
|
||||||
public static extern global::System.IntPtr switch_regex_compile(string jarg1, int jarg2, ref global::System.IntPtr jarg3, global::System.Runtime.InteropServices.HandleRef jarg4, global::System.Runtime.InteropServices.HandleRef jarg5);
|
public static extern global::System.IntPtr switch_regex_compile(string jarg1, int jarg2, global::System.Runtime.InteropServices.HandleRef jarg3, global::System.Runtime.InteropServices.HandleRef jarg4, global::System.Runtime.InteropServices.HandleRef jarg5);
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_copy_substring___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_copy_substring___")]
|
||||||
public static extern int switch_regex_copy_substring(string jarg1, global::System.Runtime.InteropServices.HandleRef jarg2, int jarg3, int jarg4, string jarg5, int jarg6);
|
public static extern int switch_regex_copy_substring(global::System.Runtime.InteropServices.HandleRef jarg1, int jarg2, string jarg3, global::System.Runtime.InteropServices.HandleRef jarg4);
|
||||||
|
|
||||||
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_match_free___")]
|
||||||
|
public static extern void switch_regex_match_free(global::System.Runtime.InteropServices.HandleRef jarg1);
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_free___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_free___")]
|
||||||
public static extern void switch_regex_free(global::System.Runtime.InteropServices.HandleRef jarg1);
|
public static extern void switch_regex_free(global::System.Runtime.InteropServices.HandleRef jarg1);
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_perform___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_perform___")]
|
||||||
public static extern int switch_regex_perform(string jarg1, string jarg2, global::System.Runtime.InteropServices.HandleRef jarg3, global::System.Runtime.InteropServices.HandleRef jarg4, uint jarg5);
|
public static extern int switch_regex_perform(string jarg1, string jarg2, global::System.Runtime.InteropServices.HandleRef jarg3, global::System.Runtime.InteropServices.HandleRef jarg4);
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_perform_substitution___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_perform_substitution___")]
|
||||||
public static extern void switch_perform_substitution(global::System.Runtime.InteropServices.HandleRef jarg1, int jarg2, string jarg3, string jarg4, string jarg5, global::System.Runtime.InteropServices.HandleRef jarg6, global::System.Runtime.InteropServices.HandleRef jarg7);
|
public static extern void switch_perform_substitution(global::System.Runtime.InteropServices.HandleRef jarg1, string jarg2, string jarg3, global::System.Runtime.InteropServices.HandleRef jarg4);
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_match___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_match___")]
|
||||||
public static extern int switch_regex_match(string jarg1, string jarg2);
|
public static extern int switch_regex_match(string jarg1, string jarg2);
|
||||||
|
@ -17883,7 +17969,7 @@ class freeswitchPINVOKE {
|
||||||
public static extern int switch_regex_match_partial(string jarg1, string jarg2, global::System.Runtime.InteropServices.HandleRef jarg3);
|
public static extern int switch_regex_match_partial(string jarg1, string jarg2, global::System.Runtime.InteropServices.HandleRef jarg3);
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_capture_regex___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_capture_regex___")]
|
||||||
public static extern void switch_capture_regex(global::System.Runtime.InteropServices.HandleRef jarg1, int jarg2, string jarg3, global::System.Runtime.InteropServices.HandleRef jarg4, string jarg5, global::System.Runtime.InteropServices.HandleRef jarg6, global::System.Runtime.InteropServices.HandleRef jarg7);
|
public static extern void switch_capture_regex(global::System.Runtime.InteropServices.HandleRef jarg1, int jarg2, string jarg3, global::System.Runtime.InteropServices.HandleRef jarg4, global::System.Runtime.InteropServices.HandleRef jarg5);
|
||||||
|
|
||||||
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_set_var_callback___")]
|
[global::System.Runtime.InteropServices.DllImport("mod_managed", EntryPoint="CSharp_FreeSWITCHfNative_switch_regex_set_var_callback___")]
|
||||||
public static extern void switch_regex_set_var_callback(string jarg1, string jarg2, global::System.Runtime.InteropServices.HandleRef jarg3);
|
public static extern void switch_regex_set_var_callback(string jarg1, string jarg2, global::System.Runtime.InteropServices.HandleRef jarg3);
|
||||||
|
|
|
@ -46,9 +46,9 @@ class FSPCRE : public JSBase
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
switch_regex_t *_re;
|
switch_regex_t *_re;
|
||||||
|
switch_regex_match_data_t *_match_data;
|
||||||
char *_str;
|
char *_str;
|
||||||
int _proceed;
|
int _proceed;
|
||||||
int _ovector[30];
|
|
||||||
int _freed;
|
int _freed;
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
|
|
|
@ -139,9 +139,10 @@ void FSEventHandler::QueueEvent(switch_event_t *event)
|
||||||
|
|
||||||
if (*hp->value == '/') {
|
if (*hp->value == '/') {
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
int ovector[30];
|
int ovector[30];
|
||||||
cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
cmp = !!switch_regex_perform(hval, comp_to, &re, &match_data);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
} else {
|
} else {
|
||||||
cmp = !strcasecmp(hval, comp_to);
|
cmp = !strcasecmp(hval, comp_to);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ static const char js_class_name[] = "PCRE";
|
||||||
FSPCRE::~FSPCRE(void)
|
FSPCRE::~FSPCRE(void)
|
||||||
{
|
{
|
||||||
if (!_freed && _re) {
|
if (!_freed && _re) {
|
||||||
switch_regex_safe_free(_re);
|
switch_regex_and_match_data_safe_free(_re, _match_data);
|
||||||
switch_safe_free(_str);
|
switch_safe_free(_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,9 +53,9 @@ string FSPCRE::GetJSClassName()
|
||||||
void FSPCRE::Init()
|
void FSPCRE::Init()
|
||||||
{
|
{
|
||||||
_re = NULL;
|
_re = NULL;
|
||||||
|
_match_data = NULL;
|
||||||
_str = NULL;
|
_str = NULL;
|
||||||
_proceed = 0;
|
_proceed = 0;
|
||||||
memset(&_ovector, 0, sizeof(_ovector));
|
|
||||||
_freed = 0;
|
_freed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,11 +74,10 @@ JS_PCRE_FUNCTION_IMPL(Compile)
|
||||||
String::Utf8Value str2(info[1]);
|
String::Utf8Value str2(info[1]);
|
||||||
string = js_safe_str(*str1);
|
string = js_safe_str(*str1);
|
||||||
regex_string = js_safe_str(*str2);
|
regex_string = js_safe_str(*str2);
|
||||||
switch_regex_safe_free(this->_re);
|
switch_regex_and_match_data_safe_free(this->_re, this->_match_data);
|
||||||
switch_safe_free(this->_str);
|
switch_safe_free(this->_str);
|
||||||
js_strdup(this->_str, string);
|
js_strdup(this->_str, string);
|
||||||
this->_proceed = switch_regex_perform(this->_str, regex_string, &this->_re, this->_ovector,
|
this->_proceed = switch_regex_perform(this->_str, regex_string, &this->_re, &this->_match_data);
|
||||||
sizeof(this->_ovector) / sizeof(this->_ovector[0]));
|
|
||||||
info.GetReturnValue().Set(this->_proceed ? true : false);
|
info.GetReturnValue().Set(this->_proceed ? true : false);
|
||||||
} else {
|
} else {
|
||||||
info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid args"));
|
info.GetIsolate()->ThrowException(String::NewFromUtf8(info.GetIsolate(), "Invalid args"));
|
||||||
|
@ -103,7 +102,7 @@ JS_PCRE_FUNCTION_IMPL(Substitute)
|
||||||
len = (uint32_t) (strlen(this->_str) + strlen(subst_string) + 10) * this->_proceed;
|
len = (uint32_t) (strlen(this->_str) + strlen(subst_string) + 10) * this->_proceed;
|
||||||
substituted = (char *)malloc(len);
|
substituted = (char *)malloc(len);
|
||||||
switch_assert(substituted != NULL);
|
switch_assert(substituted != NULL);
|
||||||
switch_perform_substitution(this->_re, this->_proceed, subst_string, this->_str, substituted, len, this->_ovector);
|
switch_perform_substitution(this->_match_data, subst_string, substituted, len);
|
||||||
info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), substituted));
|
info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), substituted));
|
||||||
free(substituted);
|
free(substituted);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -215,7 +215,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
|
||||||
int context_hit = 0;
|
int context_hit = 0;
|
||||||
int proceed = 0;
|
int proceed = 0;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
int parens = 0;
|
int parens = 0;
|
||||||
|
|
||||||
if (!caller_profile) {
|
if (!caller_profile) {
|
||||||
|
@ -266,7 +266,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
|
||||||
|
|
||||||
parens = 0;
|
parens = 0;
|
||||||
proceed = 0;
|
proceed = 0;
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
if ((p = strstr(field, "=~"))) {
|
if ((p = strstr(field, "=~"))) {
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
@ -305,7 +305,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
|
||||||
last_field = strdup(field_data);
|
last_field = strdup(field_data);
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "test conditions %s(%s) =~ /%s/\n", field, field_data, expression);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "test conditions %s(%s) =~ /%s/\n", field, field_data, expression);
|
||||||
if (!(proceed = switch_regex_perform(field_data, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if (!(proceed = switch_regex_perform(field_data, expression, &re, &match_data))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Regex mismatch\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Regex mismatch\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +343,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
|
||||||
if (parens) {
|
if (parens) {
|
||||||
len = (uint32_t) (strlen(value) + strlen(last_field) + 10) * proceed;
|
len = (uint32_t) (strlen(value) + strlen(last_field) + 10) * proceed;
|
||||||
switch_zmalloc(substituted, len);
|
switch_zmalloc(substituted, len);
|
||||||
switch_perform_substitution(re, proceed, value, last_field, substituted, len, ovector);
|
switch_perform_substitution(match_data, value, substituted, len);
|
||||||
app_data = substituted;
|
app_data = substituted;
|
||||||
} else {
|
} else {
|
||||||
app_data = value;
|
app_data = value;
|
||||||
|
@ -368,7 +368,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
|
||||||
end:
|
end:
|
||||||
|
|
||||||
switch_safe_free(last_field);
|
switch_safe_free(last_field);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
yaml_parser_delete(&parser);
|
yaml_parser_delete(&parser);
|
||||||
|
|
||||||
if (input) {
|
if (input) {
|
||||||
|
|
|
@ -531,20 +531,20 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
|
||||||
|
|
||||||
if ( regex && val ) {
|
if ( regex && val ) {
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
int proceed;
|
int proceed;
|
||||||
char replace[1024] = "";
|
char replace[1024] = "";
|
||||||
proceed = 0;
|
proceed = 0;
|
||||||
proceed = switch_regex_perform(val, regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
proceed = switch_regex_perform(val, regex, &re, &match_data);
|
||||||
if ( proceed > 0 ) {
|
if ( proceed > 0 ) {
|
||||||
switch_regex_copy_substring(val, ovector, proceed, proceed - 1, replace, sizeof(replace));
|
switch_regex_copy_substring(match_data, proceed - 1, replace, sizeof(replace));
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "original value: %s, regex: %s, result: %s\n", val, regex, replace);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "original value: %s, regex: %s, result: %s\n", val, regex, replace);
|
||||||
val = replace;
|
val = replace;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "original value: %s, regex: %s, result: nomatch, value left intact\n", val, regex);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "original value: %s, regex: %s, result: nomatch, value left intact\n", val, regex);
|
||||||
}
|
}
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( val == NULL && val_default != NULL) {
|
if ( val == NULL && val_default != NULL) {
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
|
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
#include <switch_channel.h>
|
#include <switch_channel.h>
|
||||||
#include <pcre.h>
|
#define PCRE2_CODE_UNIT_WIDTH 8
|
||||||
|
#include <pcre2.h>
|
||||||
|
|
||||||
struct switch_cause_table {
|
struct switch_cause_table {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -4548,21 +4549,22 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(switch_channel_t *
|
||||||
char *digit_string = dtstr;
|
char *digit_string = dtstr;
|
||||||
char *X = NULL;
|
char *X = NULL;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
char *substituted = NULL;
|
char *substituted = NULL;
|
||||||
|
|
||||||
if (!zstr(var)) {
|
if (!zstr(var)) {
|
||||||
int proceed = 0;
|
int proceed = 0;
|
||||||
int ovector[30];
|
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(dtstr, var, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(dtstr, var, &re, &match_data))) {
|
||||||
int len = (strlen(dtstr) + strlen(var) + 10) * proceed;
|
int len = (strlen(dtstr) + strlen(var) + 10) * proceed;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
const char *replace = NULL;
|
const char *replace = NULL;
|
||||||
|
PCRE2_SIZE replace_size;
|
||||||
|
|
||||||
X = malloc(len);
|
X = malloc(len);
|
||||||
|
|
||||||
for (i = 0; i < proceed; i++) {
|
for (i = 0; i < proceed; i++) {
|
||||||
if (pcre_get_substring(dtstr, ovector, proceed, i, &replace) >= 0) {
|
if (pcre2_substring_get_bynumber(match_data, i, (PCRE2_UCHAR **)&replace, &replace_size) >= 0) {
|
||||||
if (replace) {
|
if (replace) {
|
||||||
switch_size_t plen = strlen(replace);
|
switch_size_t plen = strlen(replace);
|
||||||
memset(X, 'X', plen);
|
memset(X, 'X', plen);
|
||||||
|
@ -4571,7 +4573,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(switch_channel_t *
|
||||||
switch_safe_free(substituted);
|
switch_safe_free(substituted);
|
||||||
substituted = switch_string_replace(substituted ? substituted : dtstr, replace, X);
|
substituted = switch_string_replace(substituted ? substituted : dtstr, replace, X);
|
||||||
|
|
||||||
pcre_free_substring(replace);
|
pcre2_substring_free((PCRE2_UCHAR *)replace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4583,7 +4585,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(switch_channel_t *
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_channel_set_variable(channel, "digits_dialed", digit_string);
|
switch_channel_set_variable(channel, "digits_dialed", digit_string);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(substituted);
|
switch_safe_free(substituted);
|
||||||
switch_safe_free(X);
|
switch_safe_free(X);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4344,7 +4344,8 @@ SWITCH_DECLARE(char *) switch_ivr_check_presence_mapping(const char *exten_name,
|
||||||
char *r = NULL;
|
char *r = NULL;
|
||||||
switch_event_t *params = NULL;
|
switch_event_t *params = NULL;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int proceed = 0, ovector[100];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
int proceed = 0;
|
||||||
|
|
||||||
switch_event_create(¶ms, SWITCH_EVENT_REQUEST_PARAMS);
|
switch_event_create(¶ms, SWITCH_EVENT_REQUEST_PARAMS);
|
||||||
switch_assert(params);
|
switch_assert(params);
|
||||||
|
@ -4376,8 +4377,8 @@ SWITCH_DECLARE(char *) switch_ivr_check_presence_mapping(const char *exten_name,
|
||||||
const char *proto = switch_xml_attr(x_exten, "proto");
|
const char *proto = switch_xml_attr(x_exten, "proto");
|
||||||
|
|
||||||
if (!zstr(regex) && !zstr(proto)) {
|
if (!zstr(regex) && !zstr(proto)) {
|
||||||
proceed = switch_regex_perform(exten_name, regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
proceed = switch_regex_perform(exten_name, regex, &re, &match_data);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
if (proceed) {
|
if (proceed) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Mapping %s@%s to proto %s matching expression [%s]\n",
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Mapping %s@%s to proto %s matching expression [%s]\n",
|
||||||
|
|
|
@ -370,12 +370,12 @@ static dm_match_t switch_ivr_dmachine_check_match(switch_ivr_dmachine_t *dmachin
|
||||||
for(bp = dmachine->realm->binding_list; bp; bp = bp->next) {
|
for(bp = dmachine->realm->binding_list; bp; bp = bp->next) {
|
||||||
if (bp->is_regex) {
|
if (bp->is_regex) {
|
||||||
if (bp->repl) {
|
if (bp->repl) {
|
||||||
int ovector[30] = { 0 };
|
|
||||||
int proceed = 0;
|
int proceed = 0;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
|
||||||
|
|
||||||
proceed = switch_regex_perform(dmachine->digits, bp->digits, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
proceed = switch_regex_perform(dmachine->digits, bp->digits, &re, &match_data);
|
||||||
|
|
||||||
if (proceed) {
|
if (proceed) {
|
||||||
char *substituted = NULL;
|
char *substituted = NULL;
|
||||||
|
@ -385,13 +385,13 @@ static dm_match_t switch_ivr_dmachine_check_match(switch_ivr_dmachine_t *dmachin
|
||||||
substituted = malloc(len);
|
substituted = malloc(len);
|
||||||
switch_assert(substituted);
|
switch_assert(substituted);
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
switch_perform_substitution(re, proceed, bp->repl, dmachine->digits, substituted, len, ovector);
|
switch_perform_substitution(match_data, bp->repl, substituted, len);
|
||||||
|
|
||||||
if (!bp->substituted || strcmp(substituted, bp->substituted)) {
|
if (!bp->substituted || strcmp(substituted, bp->substituted)) {
|
||||||
bp->substituted = switch_core_strdup(dmachine->pool, substituted);
|
bp->substituted = switch_core_strdup(dmachine->pool, substituted);
|
||||||
}
|
}
|
||||||
free(substituted);
|
free(substituted);
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
bp->rmatch = 1;
|
bp->rmatch = 1;
|
||||||
} else {
|
} else {
|
||||||
bp->substituted = NULL;
|
bp->substituted = NULL;
|
||||||
|
|
|
@ -553,15 +553,15 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_menu_execute(switch_core_session_t *s
|
||||||
|
|
||||||
if (ap->re) {
|
if (ap->re) {
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int ovector[30];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
|
||||||
if ((ok = switch_regex_perform(menu->buf, ap->bind, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((ok = switch_regex_perform(menu->buf, ap->bind, &re, &match_data))) {
|
||||||
switch_perform_substitution(re, ok, ap->arg, menu->buf, substituted, sizeof(substituted), ovector);
|
switch_perform_substitution(match_data, ap->arg, substituted, sizeof(substituted));
|
||||||
use_arg = substituted;
|
use_arg = substituted;
|
||||||
}
|
}
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "action regex [%s] [%s] [%d]\n", menu->buf, ap->bind, ok);
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "action regex [%s] [%s] [%d]\n", menu->buf, ap->bind, ok);
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
} else {
|
} else {
|
||||||
ok = !strcmp(menu->buf, ap->bind);
|
ok = !strcmp(menu->buf, ap->bind);
|
||||||
}
|
}
|
||||||
|
|
|
@ -178,7 +178,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_sessio
|
||||||
char *field_expanded = NULL;
|
char *field_expanded = NULL;
|
||||||
char *field_expanded_alloc = NULL;
|
char *field_expanded_alloc = NULL;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
int proceed = 0, ovector[100];
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
|
int proceed = 0;
|
||||||
switch_xml_t match = NULL;
|
switch_xml_t match = NULL;
|
||||||
|
|
||||||
searched = 1;
|
searched = 1;
|
||||||
|
@ -204,7 +205,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_sessio
|
||||||
|
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
|
|
||||||
if ((proceed = switch_regex_perform(field_expanded, pattern, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((proceed = switch_regex_perform(field_expanded, pattern, &re, &match_data))) {
|
||||||
match = switch_xml_child(input, "match");
|
match = switch_xml_child(input, "match");
|
||||||
} else {
|
} else {
|
||||||
match = switch_xml_child(input, "nomatch");
|
match = switch_xml_child(input, "nomatch");
|
||||||
|
@ -224,12 +225,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_sessio
|
||||||
len = (uint32_t) (strlen(data) + strlen(adata) + 10) * proceed;
|
len = (uint32_t) (strlen(data) + strlen(adata) + 10) * proceed;
|
||||||
if (!(substituted = malloc(len))) {
|
if (!(substituted = malloc(len))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Memory Error!\n");
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Memory Error!\n");
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(field_expanded_alloc);
|
switch_safe_free(field_expanded_alloc);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
memset(substituted, 0, len);
|
memset(substituted, 0, len);
|
||||||
switch_perform_substitution(re, proceed, adata, field_expanded, substituted, len, ovector);
|
switch_perform_substitution(match_data, adata, substituted, len);
|
||||||
odata = substituted;
|
odata = substituted;
|
||||||
} else {
|
} else {
|
||||||
odata = adata;
|
odata = adata;
|
||||||
|
@ -326,7 +327,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_sessio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
switch_safe_free(field_expanded_alloc);
|
switch_safe_free(field_expanded_alloc);
|
||||||
|
|
||||||
if (done || status != SWITCH_STATUS_SUCCESS
|
if (done || status != SWITCH_STATUS_SUCCESS
|
||||||
|
|
|
@ -24,39 +24,49 @@
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*
|
*
|
||||||
* Michael Jerris <mike@jerris.com>
|
* Michael Jerris <mike@jerris.com>
|
||||||
|
* Christian Marangi <ansuelsmth@gmail.com> # PCRE2 conversion
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* switch_regex.c -- PCRE wrapper
|
* switch_regex.c -- PCRE2 wrapper
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
#include <pcre.h>
|
#define PCRE2_CODE_UNIT_WIDTH 8
|
||||||
|
#include <pcre2.h>
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_regex_t *) switch_regex_compile(const char *pattern,
|
SWITCH_DECLARE(switch_regex_t *) switch_regex_compile(const char *pattern,
|
||||||
int options, const char **errorptr, int *erroroffset, const unsigned char *tables)
|
int options, int *errorcode, unsigned int *erroroffset, switch_regex_compile_context_t *ccontext)
|
||||||
{
|
{
|
||||||
|
|
||||||
return (switch_regex_t *)pcre_compile(pattern, options, errorptr, erroroffset, tables);
|
return (switch_regex_t *)pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, options, errorcode, (PCRE2_SIZE *)erroroffset, ccontext);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(int) switch_regex_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int size)
|
SWITCH_DECLARE(int) switch_regex_copy_substring(switch_regex_match_data_t *match_data, int stringnumber, char *buffer, unsigned int *size)
|
||||||
{
|
{
|
||||||
return pcre_copy_substring(subject, ovector, stringcount, stringnumber, buffer, size);
|
return pcre2_substring_copy_bynumber(match_data, stringnumber, (PCRE2_UCHAR *)buffer, (PCRE2_SIZE *)size);
|
||||||
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(void) switch_regex_match_free(void *data)
|
||||||
|
{
|
||||||
|
pcre2_match_context_free(data);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(void) switch_regex_free(void *data)
|
SWITCH_DECLARE(void) switch_regex_free(void *data)
|
||||||
{
|
{
|
||||||
pcre_free(data);
|
pcre2_code_free(data);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(int) switch_regex_perform(const char *field, const char *expression, switch_regex_t **new_re, int *ovector, uint32_t olen)
|
SWITCH_DECLARE(int) switch_regex_perform(const char *field, const char *expression, switch_regex_t **new_re, switch_regex_match_data_t **new_match_data)
|
||||||
{
|
{
|
||||||
const char *error = NULL;
|
int error_code = 0;
|
||||||
int erroffset = 0;
|
PCRE2_UCHAR error_str[128];
|
||||||
pcre *re = NULL;
|
PCRE2_SIZE error_offset = 0;
|
||||||
|
pcre2_code *re = NULL;
|
||||||
|
pcre2_match_data *match_data;
|
||||||
int match_count = 0;
|
int match_count = 0;
|
||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
|
@ -87,52 +97,56 @@ SWITCH_DECLARE(int) switch_regex_perform(const char *field, const char *expressi
|
||||||
expression = tmp;
|
expression = tmp;
|
||||||
if (*opts) {
|
if (*opts) {
|
||||||
if (strchr(opts, 'i')) {
|
if (strchr(opts, 'i')) {
|
||||||
flags |= PCRE_CASELESS;
|
flags |= PCRE2_CASELESS;
|
||||||
}
|
}
|
||||||
if (strchr(opts, 's')) {
|
if (strchr(opts, 's')) {
|
||||||
flags |= PCRE_DOTALL;
|
flags |= PCRE2_DOTALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
re = pcre_compile(expression, /* the pattern */
|
re = pcre2_compile((PCRE2_SPTR)expression, /* the pattern */
|
||||||
|
PCRE2_ZERO_TERMINATED,
|
||||||
flags, /* default options */
|
flags, /* default options */
|
||||||
&error, /* for error message */
|
&error_code, /* for error code */
|
||||||
&erroffset, /* for error offset */
|
&error_offset, /* for error offset */
|
||||||
NULL); /* use default character tables */
|
NULL); /* use default character tables */
|
||||||
if (error) {
|
if (!re) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "COMPILE ERROR: %d [%s][%s]\n", erroffset, error, expression);
|
pcre2_get_error_message(error_code, error_str, 128);
|
||||||
switch_regex_safe_free(re);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "COMPILE ERROR: %zu [%s][%s]\n", error_offset, error_str, expression);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
match_count = pcre_exec(re, /* result of pcre_compile() */
|
match_data = pcre2_match_data_create_from_pattern(re, NULL);
|
||||||
NULL, /* we didn't study the pattern */
|
|
||||||
field, /* the subject string */
|
match_count = pcre2_match(re, /* result of pcre_compile() */
|
||||||
|
(PCRE2_SPTR)field, /* the subject string */
|
||||||
(int) strlen(field), /* the length of the subject string */
|
(int) strlen(field), /* the length of the subject string */
|
||||||
0, /* start at offset 0 in the subject */
|
0, /* start at offset 0 in the subject */
|
||||||
0, /* default options */
|
0, /* default options */
|
||||||
ovector, /* vector of integers for substring information */
|
match_data, /* vector of integers for substring information */
|
||||||
olen); /* number of elements (NOT size in bytes) */
|
NULL); /* number of elements (NOT size in bytes) */
|
||||||
|
|
||||||
|
|
||||||
if (match_count <= 0) {
|
if (match_count <= 0) {
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
match_count = 0;
|
match_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*new_re = (switch_regex_t *) re;
|
*new_re = (switch_regex_t *) re;
|
||||||
|
*new_match_data = (switch_regex_match_data_t *) match_data;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
switch_safe_free(tmp);
|
switch_safe_free(tmp);
|
||||||
return match_count;
|
return match_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_count, const char *data, const char *field_data,
|
SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_match_data_t *match_data, const char *data,
|
||||||
char *substituted, switch_size_t len, int *ovector)
|
char *substituted, switch_size_t len)
|
||||||
{
|
{
|
||||||
char index[10] = "";
|
char index[10] = "";
|
||||||
const char *replace = NULL;
|
const char *replace = NULL;
|
||||||
|
PCRE2_SIZE replace_size;
|
||||||
switch_size_t x, y = 0, z = 0;
|
switch_size_t x, y = 0, z = 0;
|
||||||
int num = 0;
|
int num = 0;
|
||||||
int brace;
|
int brace;
|
||||||
|
@ -174,14 +188,14 @@ SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_c
|
||||||
num = -1;
|
num = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pcre_get_substring(field_data, ovector, match_count, num, &replace) >= 0) {
|
if (pcre2_substring_get_bynumber(match_data, num, (PCRE2_UCHAR **)&replace, &replace_size) >= 0) {
|
||||||
if (replace) {
|
if (replace) {
|
||||||
switch_size_t r;
|
switch_size_t r;
|
||||||
|
|
||||||
for (r = 0; r < strlen(replace) && y < (len - 1); r++) {
|
for (r = 0; r < strlen(replace) && y < (len - 1); r++) {
|
||||||
substituted[y++] = replace[r];
|
substituted[y++] = replace[r];
|
||||||
}
|
}
|
||||||
pcre_free_substring(replace);
|
pcre2_substring_free((PCRE2_UCHAR *)replace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -193,20 +207,21 @@ SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SWITCH_DECLARE(void) switch_capture_regex(switch_regex_t *re, int match_count, const char *field_data,
|
SWITCH_DECLARE(void) switch_capture_regex(switch_regex_match_data_t *match_data, int match_count,
|
||||||
int *ovector, const char *var, switch_cap_callback_t callback, void *user_data)
|
const char *var, switch_cap_callback_t callback, void *user_data)
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
const char *replace;
|
const char *replace;
|
||||||
|
PCRE2_SIZE replace_size;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < match_count; i++) {
|
for (i = 0; i < match_count; i++) {
|
||||||
if (pcre_get_substring(field_data, ovector, match_count, i, &replace) >= 0) {
|
if (pcre2_substring_get_bynumber(match_data, i, (PCRE2_UCHAR **)&replace, &replace_size) >= 0) {
|
||||||
if (replace) {
|
if (replace) {
|
||||||
callback(var, replace, user_data);
|
callback(var, (const char *)replace, user_data);
|
||||||
pcre_free_substring(replace);
|
pcre2_substring_free((PCRE2_UCHAR *)replace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,12 +229,13 @@ SWITCH_DECLARE(void) switch_capture_regex(switch_regex_t *re, int match_count, c
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, const char *expression, int *partial)
|
SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, const char *expression, int *partial)
|
||||||
{
|
{
|
||||||
const char *error = NULL; /* Used to hold any errors */
|
PCRE2_UCHAR error[128]; /* Used to hold any errors */
|
||||||
int error_offset = 0; /* Holds the offset of an error */
|
int error_code = 0; /* Holds the code of an error */
|
||||||
pcre *pcre_prepared = NULL; /* Holds the compiled regex */
|
PCRE2_SIZE error_offset = 0; /* Holds the offset of an error */
|
||||||
|
pcre2_code *pcre_prepared = NULL; /* Holds the compiled regex */
|
||||||
int match_count = 0; /* Number of times the regex was matched */
|
int match_count = 0; /* Number of times the regex was matched */
|
||||||
int offset_vectors[255]; /* not used, but has to exist or pcre won't even try to find a match */
|
pcre2_match_data *match_data;
|
||||||
int pcre_flags = 0;
|
int pcre2_flags = 0;
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
switch_status_t status = SWITCH_STATUS_FALSE;
|
switch_status_t status = SWITCH_STATUS_FALSE;
|
||||||
|
@ -239,43 +255,44 @@ SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, c
|
||||||
expression = tmp;
|
expression = tmp;
|
||||||
if (*opts) {
|
if (*opts) {
|
||||||
if (strchr(opts, 'i')) {
|
if (strchr(opts, 'i')) {
|
||||||
flags |= PCRE_CASELESS;
|
flags |= PCRE2_CASELESS;
|
||||||
}
|
}
|
||||||
if (strchr(opts, 's')) {
|
if (strchr(opts, 's')) {
|
||||||
flags |= PCRE_DOTALL;
|
flags |= PCRE2_DOTALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compile the expression */
|
/* Compile the expression */
|
||||||
pcre_prepared = pcre_compile(expression, flags, &error, &error_offset, NULL);
|
pcre_prepared = pcre2_compile((PCRE2_SPTR)expression, PCRE2_ZERO_TERMINATED, flags, &error_code, &error_offset, NULL);
|
||||||
|
|
||||||
/* See if there was an error in the expression */
|
/* See if there was an error in the expression */
|
||||||
if (error != NULL) {
|
if (!pcre_prepared) {
|
||||||
/* Clean up after ourselves */
|
pcre2_get_error_message(error_code, error, 128);
|
||||||
if (pcre_prepared) {
|
|
||||||
pcre_free(pcre_prepared);
|
|
||||||
pcre_prepared = NULL;
|
|
||||||
}
|
|
||||||
/* Note our error */
|
/* Note our error */
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
|
||||||
"Regular Expression Error expression[%s] error[%s] location[%d]\n", expression, error, error_offset);
|
"Regular Expression Error expression[%s] error[%s] location[%zu]\n", expression, error, error_offset);
|
||||||
|
|
||||||
/* We definitely didn't match anything */
|
/* We definitely didn't match anything */
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*partial) {
|
if (*partial) {
|
||||||
pcre_flags = PCRE_PARTIAL;
|
pcre2_flags = PCRE2_PARTIAL_SOFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* So far so good, run the regex */
|
/* So far so good, run the regex */
|
||||||
|
match_data = pcre2_match_data_create_from_pattern(pcre_prepared, NULL);
|
||||||
|
|
||||||
match_count =
|
match_count =
|
||||||
pcre_exec(pcre_prepared, NULL, target, (int) strlen(target), 0, pcre_flags, offset_vectors, sizeof(offset_vectors) / sizeof(offset_vectors[0]));
|
pcre2_match(pcre_prepared, (PCRE2_SPTR)target, (int) strlen(target), 0, pcre2_flags, match_data, NULL);
|
||||||
|
|
||||||
|
pcre2_match_data_free(match_data);
|
||||||
|
|
||||||
/* Clean up */
|
/* Clean up */
|
||||||
if (pcre_prepared) {
|
if (pcre_prepared) {
|
||||||
pcre_free(pcre_prepared);
|
pcre2_code_free(pcre_prepared);
|
||||||
pcre_prepared = NULL;
|
pcre_prepared = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,7 +302,7 @@ SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, c
|
||||||
if (match_count > 0) {
|
if (match_count > 0) {
|
||||||
*partial = 0;
|
*partial = 0;
|
||||||
switch_goto_status(SWITCH_STATUS_SUCCESS, end);
|
switch_goto_status(SWITCH_STATUS_SUCCESS, end);
|
||||||
} else if (match_count == PCRE_ERROR_PARTIAL || match_count == PCRE_ERROR_BADPARTIAL) {
|
} else if (match_count == PCRE2_ERROR_PARTIAL) {
|
||||||
/* yes it is already set, but the code is clearer this way */
|
/* yes it is already set, but the code is clearer this way */
|
||||||
*partial = 1;
|
*partial = 1;
|
||||||
switch_goto_status(SWITCH_STATUS_SUCCESS, end);
|
switch_goto_status(SWITCH_STATUS_SUCCESS, end);
|
||||||
|
|
|
@ -2081,8 +2081,9 @@ SWITCH_DECLARE(switch_status_t) switch_find_interface_ip(char *buf, int len, int
|
||||||
SWITCH_DECLARE(switch_time_t) switch_str_time(const char *in)
|
SWITCH_DECLARE(switch_time_t) switch_str_time(const char *in)
|
||||||
{
|
{
|
||||||
switch_time_exp_t tm = { 0 }, local_tm = { 0 };
|
switch_time_exp_t tm = { 0 }, local_tm = { 0 };
|
||||||
int proceed = 0, ovector[30], time_only = 0;
|
int proceed = 0, time_only = 0;
|
||||||
switch_regex_t *re = NULL;
|
switch_regex_t *re = NULL;
|
||||||
|
switch_regex_match_data_t *match_data = NULL;
|
||||||
char replace[1024] = "";
|
char replace[1024] = "";
|
||||||
switch_time_t ret = 0, local_time = 0;
|
switch_time_t ret = 0, local_time = 0;
|
||||||
char *pattern = "^(\\d+)-(\\d+)-(\\d+)\\s*(\\d*):{0,1}(\\d*):{0,1}(\\d*)";
|
char *pattern = "^(\\d+)-(\\d+)-(\\d+)\\s*(\\d*):{0,1}(\\d*):{0,1}(\\d*)";
|
||||||
|
@ -2092,67 +2093,77 @@ SWITCH_DECLARE(switch_time_t) switch_str_time(const char *in)
|
||||||
switch_time_exp_lt(&tm, switch_micro_time_now());
|
switch_time_exp_lt(&tm, switch_micro_time_now());
|
||||||
|
|
||||||
|
|
||||||
if ((time_only = switch_regex_perform(in, pattern3, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if ((time_only = switch_regex_perform(in, pattern3, &re, &match_data))) {
|
||||||
tm.tm_hour = 0;
|
tm.tm_hour = 0;
|
||||||
tm.tm_min = 0;
|
tm.tm_min = 0;
|
||||||
tm.tm_sec = 0;
|
tm.tm_sec = 0;
|
||||||
} else {
|
} else {
|
||||||
tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = tm.tm_usec = 0;
|
tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = tm.tm_usec = 0;
|
||||||
|
|
||||||
if (!(proceed = switch_regex_perform(in, pattern, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
|
if (!(proceed = switch_regex_perform(in, pattern, &re, &match_data))) {
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
proceed = switch_regex_perform(in, pattern2, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
|
proceed = switch_regex_perform(in, pattern2, &re, &match_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proceed || time_only) {
|
if (proceed || time_only) {
|
||||||
|
unsigned int replace_size;
|
||||||
|
|
||||||
if (time_only > 1) {
|
if (time_only > 1) {
|
||||||
switch_regex_copy_substring(in, ovector, time_only, 1, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 1, replace, &replace_size);
|
||||||
tm.tm_hour = atoi(replace);
|
tm.tm_hour = atoi(replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (time_only > 2) {
|
if (time_only > 2) {
|
||||||
switch_regex_copy_substring(in, ovector, time_only, 2, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 2, replace, &replace_size);
|
||||||
tm.tm_min = atoi(replace);
|
tm.tm_min = atoi(replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (time_only > 3) {
|
if (time_only > 3) {
|
||||||
switch_regex_copy_substring(in, ovector, time_only, 3, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 3, replace, &replace_size);
|
||||||
tm.tm_sec = atoi(replace);
|
tm.tm_sec = atoi(replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proceed > 1) {
|
if (proceed > 1) {
|
||||||
switch_regex_copy_substring(in, ovector, proceed, 1, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 1, replace, &replace_size);
|
||||||
tm.tm_year = atoi(replace) - 1900;
|
tm.tm_year = atoi(replace) - 1900;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proceed > 2) {
|
if (proceed > 2) {
|
||||||
switch_regex_copy_substring(in, ovector, proceed, 2, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 2, replace, &replace_size);
|
||||||
tm.tm_mon = atoi(replace) - 1;
|
tm.tm_mon = atoi(replace) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proceed > 3) {
|
if (proceed > 3) {
|
||||||
switch_regex_copy_substring(in, ovector, proceed, 3, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 3, replace, &replace_size);
|
||||||
tm.tm_mday = atoi(replace);
|
tm.tm_mday = atoi(replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proceed > 4) {
|
if (proceed > 4) {
|
||||||
switch_regex_copy_substring(in, ovector, proceed, 4, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 4, replace, &replace_size);
|
||||||
tm.tm_hour = atoi(replace);
|
tm.tm_hour = atoi(replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proceed > 5) {
|
if (proceed > 5) {
|
||||||
switch_regex_copy_substring(in, ovector, proceed, 5, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 5, replace, &replace_size);
|
||||||
tm.tm_min = atoi(replace);
|
tm.tm_min = atoi(replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proceed > 6) {
|
if (proceed > 6) {
|
||||||
switch_regex_copy_substring(in, ovector, proceed, 6, replace, sizeof(replace));
|
replace_size = sizeof(replace);
|
||||||
|
switch_regex_copy_substring(match_data, 6, replace, &replace_size);
|
||||||
tm.tm_sec = atoi(replace);
|
tm.tm_sec = atoi(replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
switch_time_exp_get(&local_time, &tm);
|
switch_time_exp_get(&local_time, &tm);
|
||||||
switch_time_exp_lt(&local_tm, local_time);
|
switch_time_exp_lt(&local_tm, local_time);
|
||||||
|
@ -2163,7 +2174,7 @@ SWITCH_DECLARE(switch_time_t) switch_str_time(const char *in)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_regex_safe_free(re);
|
switch_regex_and_match_data_safe_free(re, match_data);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue