Merge b87c179f7e0a72ac9d919b1fbf89def984d42ef9 into e490fe6d7db20ca82431ee4822fe444b4ccd9e68

This commit is contained in:
Christian Marangi 2024-12-11 16:22:20 +00:00 committed by GitHub
commit 1c17a6d465
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 489 additions and 339 deletions

View File

@ -231,9 +231,9 @@ CORE_LIBS+=libfreeswitch_libyuv.la
endif
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_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)
if HAVE_PNG

View File

@ -13,7 +13,7 @@ DOWNLOAD=http://files.freeswitch.org/downloads/libs
JPEG=v8d
OPENSSL=1.0.1l
SQLITE=autoconf-3080403
PCRE=8.35
PCRE2=10.42
CURL=7.40.0
SPEEX=1.2rc1
LIBEDIT=20140618-3.1
@ -45,7 +45,7 @@ has-git:
@git --version || (echo "please install git by running 'make install-git'" && false)
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)
libjpeg: jpeg-8d/.done
@ -66,9 +66,9 @@ sqlite-$(SQLITE):
(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)
pcre: pcre-$(PCRE)/.done
pcre-$(PCRE)/.done: pcre-$(PCRE)
pcre-$(PCRE):
pcre2: pcre2-$(PCRE2)/.done
pcre2-$(PCRE2)/.done: pcre2-$(PCRE2)
pcre2-$(PCRE2):
(test -d $@) || (wget -4 -O $@.tar.gz $(DOWNLOAD)/$@.tar.gz && tar zxfv $@.tar.gz)
(cd $@ && ./configure --prefix=$(PREFIX) && make && sudo make install && touch .done)

View File

@ -6,8 +6,8 @@
# 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
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
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 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
cd freeswitch.git && make

View File

@ -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
DOWNLOAD=http://files.freeswitch.org/downloads/libs
OPENSSL=1.0.1j

View File

@ -12,7 +12,7 @@ DOWNLOAD=http://files.freeswitch.org/downloads/libs
JP=v8d
SSL=1.0.1j
SQLITE=autoconf-3080403
PCRE=8.35
PCRE2=10.42
CURL=7.35.0
SPEEX=1.2rc1
LIBEDIT=20140618-3.1
@ -43,7 +43,7 @@ has-git:
@git --version || (echo "please install git by running 'gmake install-git'" && false)
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)
libjpeg: jpeg-8d/.done
@ -64,9 +64,9 @@ sqlite-$(SQLITE):
(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)
pcre: pcre-$(PCRE)/.done
pcre-$(PCRE)/.done: pcre-$(PCRE)
pcre-$(PCRE):
pcre2: pcre2-$(PCRE2)/.done
pcre2-$(PCRE2)/.done: pcre2-$(PCRE2)
pcre2-$(PCRE2):
(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)

View File

@ -1323,7 +1323,7 @@ PKG_CHECK_MODULES([TPL], [libtpl >= 1.5],[
PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.6.20])
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([YAML], [yaml-0.1 >= 0.1.4],[
AM_CONDITIONAL([HAVE_YAML],[true])],[

View File

@ -142,7 +142,7 @@ BuildRequires: libtool >= 1.5.17
BuildRequires: openssl-devel >= 1.0.1e
BuildRequires: sofia-sip-devel >= 1.13.17
BuildRequires: spandsp3-devel >= 3.0
BuildRequires: pcre-devel
BuildRequires: pcre2-devel
BuildRequires: speex-devel
BuildRequires: sqlite-devel >= 3.6.20
BuildRequires: libtiff-devel
@ -156,7 +156,7 @@ BuildRequires: zlib-devel
BuildRequires: libxml2-devel
BuildRequires: libsndfile-devel
Requires: curl >= 7.19
Requires: pcre
Requires: pcre2
Requires: speex
Requires: sqlite >= 3.6.20
Requires: libtiff

10
libs/.gitignore vendored
View File

@ -554,7 +554,7 @@ opal
/win32/celt/*/*/libcelt.log
/win32/libg722_1/*/*/libg722_1.log
/win32/libshout/*/*/libshout.log
/win32/pcre/pcre_chartables.c
/win32/pcre2/pcre2_chartables.c
/win32/tmp*.bat
!/xmlrpc-c/include/xmlrpc-c/config.h.in
/xmlrpc-c/stamp-h2
@ -610,9 +610,9 @@ opal
broadvoice/config/compile
ilbc/config/compile
libg722_1/config/compile
pcre/compile
pcre2/compile
srtp/build/compile
/pcre-*/
/pcre2-*/
/speex-*/
/curl-*/
/sqlite-*.zip
@ -637,8 +637,8 @@ curl-*/
curl-*
flite-*/
flite-*
pcre-*/
pcre-*
pcre2-*/
pcre2-*
libsndfile-*/
libsndfile-*
opencv-*/

View File

@ -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\include\private\apu_select_dbm.hw ..\..\apr-util\include\private\apu_select_dbm.h
@echo Fixing up the pcre headers
copy ..\..\pcre\config.hw ..\..\pcre\config.h
copy ..\..\pcre\pcre.hw ..\..\pcre\pcre.h
@echo Fixing up the pcre2 headers
copy ..\..\pcre2\config.hw ..\..\pcre2\config.h
copy ..\..\pcre2\pcre2.hw ..\..\pcre2\pcre2.h
@echo Generating the import list...
set MWCIncludes=..\include;..\include\arch\netware;..\include\arch\unix;..\..\apr-util\include;+%NovellLibC%

View File

@ -172,7 +172,7 @@
* - APR (http://apr.apache.org)
* - APR-Util (http://apr.apache.org)
* - SQLite (http://www.sqlite.org)
* - Pcre (http://www.pcre.org/)
* - Pcre2 (http://www.pcre.org/)
* - SRTP (http://srtp.sourceforge.net/srtp.html)
*
* Additionally, the various external modules make use of several external modules:

View File

@ -25,7 +25,7 @@
*
* 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
@ -40,18 +40,21 @@ SWITCH_BEGIN_EXTERN_C
* @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,
const unsigned char *tables);
SWITCH_DECLARE(switch_regex_t *) switch_regex_compile(const char *pattern, int options, int *errorcode, unsigned int *erroroffset,
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(int) switch_regex_perform(const char *field, const char *expression, switch_regex_t **new_re, int *ovector, uint32_t olen);
SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_count, const char *data, const char *field_data,
char *substituted, switch_size_t len, int *ovector);
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_match_data_t *match_data, const char *data,
char *substituted, switch_size_t len);
/*!
\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(void) switch_capture_regex(switch_regex_t *re, int match_count, const char *field_data,
int *ovector, const char *var, switch_cap_callback_t callback, void *user_data);
SWITCH_DECLARE(void) switch_capture_regex(switch_regex_match_data_t *match_data, int match_count,
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_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) {\
switch_regex_free(re);\
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);\
}
/** @} */

View File

@ -65,9 +65,9 @@ SWITCH_STANDARD_API(api_abstraction_function)
int proceed;
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;
char *substituted = NULL;
@ -78,7 +78,7 @@ SWITCH_STANDARD_API(api_abstraction_function)
goto end;
}
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;
} else {
api_args = arguments;
@ -89,7 +89,7 @@ SWITCH_STANDARD_API(api_abstraction_function)
} else {
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 {
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);

View File

@ -2014,7 +2014,7 @@ SWITCH_STANDARD_API(replace_function)
SWITCH_STANDARD_API(regex_function)
{
switch_regex_t *re = NULL;
int ovector[30];
switch_regex_match_data_t *match_data = NULL;
int argc;
char *mydata = NULL, *argv[4];
size_t len = 0;
@ -2054,7 +2054,7 @@ SWITCH_STANDARD_API(regex_function)
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) {
char *flags = "";
@ -2069,7 +2069,7 @@ SWITCH_STANDARD_API(regex_function)
switch_assert(substituted);
memset(substituted, 0, len);
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);
free(substituted);
@ -2091,7 +2091,7 @@ SWITCH_STANDARD_API(regex_function)
error:
stream->write_function(stream, "-ERR");
ok:
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
switch_safe_free(mydata);
return SWITCH_STATUS_SUCCESS;
}

View File

@ -3211,16 +3211,16 @@ SWITCH_STANDARD_APP(capture_function)
{
char *argv[3] = { 0 };
switch_regex_t *re = NULL;
int ovector[30] = {0};
switch_regex_match_data_t *match_data = NULL;
char *lbuf;
int proceed;
if (!zstr(data) && (lbuf = switch_core_session_strdup(session, data))
&& 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])))) {
switch_capture_regex(re, proceed, argv[1], ovector, argv[0], switch_regex_set_var_callback, session);
if ((proceed = switch_regex_perform(argv[1], argv[2], &re, &match_data))) {
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 {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "No data specified.\n");
}

View File

@ -365,7 +365,8 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
if (service && regex && replace) {
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_2 = NULL;
char *orig_uri;
@ -374,17 +375,17 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
int supported = 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, '(')) {
len = (uint32_t) (strlen(number) + strlen(replace) + 10) * proceed;
if (!(substituted = malloc(len))) {
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;
}
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;
} else {
orig_uri = replace;
@ -398,7 +399,7 @@ static void parse_naptr(const ldns_rr *naptr, const char *number, enum_record_t
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;
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))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
switch_safe_free(substituted);
switch_regex_safe_free(re);
switch_regex_safe_free(re2);
switch_regex_and_match_data_safe_free(re, match_data);
switch_regex_and_match_data_safe_free(re2, match_data2);
switch_mutex_unlock(MUTEX);
goto end;
}
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;
} else {
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(substituted_2);
switch_regex_safe_free(re2);
switch_regex_and_match_data_safe_free(re2, match_data2);
}
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_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
}
}

View File

@ -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)
{
switch_regex_t *re = NULL;
int proceed = 0, ovector[30];
switch_regex_match_data_t *match_data = NULL;
int proceed = 0;
char *substituted = NULL;
uint32_t len = 0;
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);
}
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 */
if (!(substituted = switch_core_alloc(pool, len))) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Memory Error!\n");
goto done;
}
memset(substituted, 0, len);
switch_perform_substitution(re, proceed, dst, number, substituted, len, ovector);
switch_perform_substitution(match_data, dst, substituted, len);
} else {
goto done;
}
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
return substituted;
done:
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
switch_safe_free(tmp_regex);
return number;
}

View File

@ -124,6 +124,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
int proceed = 0;
char *expression_expanded = NULL, *field_expanded = 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 *tzoff = NULL, *tzname_ = NULL;
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 *expression = NULL;
const char *field_data = NULL;
int ovector[30];
switch_bool_t anti_action = SWITCH_TRUE;
break_t do_break_i = BREAK_ON_FALSE;
int time_match;
@ -214,7 +214,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
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,
"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");
@ -271,7 +271,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
} else {
if (field && strchr(expression, '(')) {
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) {
@ -297,7 +297,7 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_
abort();
}
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;
} else {
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_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) ||
(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:
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
switch_safe_free(field_expanded);
switch_safe_free(expression_expanded);
return proceed;

View File

@ -117,7 +117,8 @@ static void translate_number(char *number, char *profile, char **translated, swi
translate_rule_t *hi = NULL;
translate_rule_t *rule = 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;
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) {
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;
if (!(substituted = malloc(len))) {
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;
}
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))) {
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_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
break;
}
}

View File

@ -170,9 +170,8 @@ SWITCH_STANDARD_DIALPLAN(asterisk_dialplan_hunt)
char *expression = NULL, expression_buf[1024] = { 0 };
char substituted[2048] = "";
const char *field_data = caller_profile->destination_number;
int proceed = 0;
switch_regex_t *re = NULL;
int ovector[30] = { 0 };
switch_regex_match_data_t *match_data = NULL;
char *cid = NULL;
expression = expression_buf;
@ -221,8 +220,8 @@ SWITCH_STANDARD_DIALPLAN(asterisk_dialplan_hunt)
field_data = "";
}
if (!(proceed = switch_regex_perform(field_data, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
switch_regex_safe_free(re);
if (!(switch_regex_perform(field_data, expression, &re, &match_data))) {
switch_regex_and_match_data_safe_free(re, match_data);
switch_safe_free(field_expanded);
continue;
}
@ -267,11 +266,11 @@ SWITCH_STANDARD_DIALPLAN(asterisk_dialplan_hunt)
}
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;
}
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
if (!extension) {
if (zstr(field_data)) {

View File

@ -103,6 +103,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
int proceed = 0, save_proceed = 0;
char *expression_expanded = NULL, *field_expanded = NULL;
switch_regex_t *re = NULL, *save_re = NULL;
switch_regex_match_data_t *match_data = NULL, *save_match_data = NULL;
int offset = 0;
const char *tmp, *tzoff = NULL, *tzname_ = NULL, *req_nesta = NULL;
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 *regex_rule = NULL;
const char *field_data = NULL;
int ovector[30];
switch_bool_t anti_action = SWITCH_TRUE;
break_t do_break_i = BREAK_ON_FALSE;
int time_match;
@ -292,7 +292,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
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) ) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
"%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_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_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_field_data = strdup(field_data);
save_re = re;
save_match_data = match_data;
save_proceed = proceed;
re = NULL;
}
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
switch_safe_free(field_expanded);
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 = "";
}
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) ) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
"%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) {
re = save_re;
match_data = save_match_data;
save_re = NULL;
save_match_data = NULL;
expression = expression_expanded = save_expression;
save_expression = NULL;
@ -506,7 +509,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
} else {
if (field && expression && strchr(expression, '(')) {
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) {
@ -534,7 +537,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
goto done;
}
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;
} else {
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_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) ||
(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:
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
switch_safe_free(field_expanded);
switch_safe_free(expression_expanded);

View File

@ -912,7 +912,7 @@ char *sofia_glue_get_extra_headers(switch_channel_t *channel, const char *prefix
switch_event_header_t *hi = NULL;
const char *exclude_regex = 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");
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 ( !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);
stream.write_function(&stream, "%s: %s\r\n", hname, value);
} 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_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
}
}
}

View File

@ -1883,20 +1883,22 @@ authed:
if (vhost->rewrites) {
switch_event_header_t *rule = vhost->rewrites->headers;
switch_regex_t *re = NULL;
int ovector[30];
switch_regex_match_data_t *match_data = NULL;
int proceed;
while(rule) {
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,
"%d request [%s] matched expr [%s]\n", proceed, request->uri, expression);
request->uri = rule->value;
switch_regex_and_match_data_safe_free(re, match_data);
break;
}
rule = rule->next;
switch_regex_and_match_data_safe_free(re, match_data);
}
}

View File

@ -250,9 +250,9 @@ static void event_handler(switch_event_t *event)
if (*hp->value == '/') {
switch_regex_t *re = NULL;
int ovector[30];
cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
switch_regex_safe_free(re);
switch_regex_match_data_t *match_data = NULL;
cmp = !!switch_regex_perform(hval, comp_to, &re, &match_data);
switch_regex_and_match_data_safe_free(re, match_data);
} else {
cmp = !strcasecmp(hval, comp_to);
}

View File

@ -350,9 +350,9 @@ static void event_handler(switch_event_t *event)
if (*hp->value == '/') {
switch_regex_t *re = NULL;
int ovector[30];
cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
switch_regex_safe_free(re);
switch_regex_match_data_t *match_data = NULL;
cmp = !!switch_regex_perform(hval, comp_to, &re, &match_data);
switch_regex_and_match_data_safe_free(re, match_data);
} else {
cmp = !strcasecmp(hval, comp_to);
}

View File

@ -8,12 +8,12 @@ IKS_LA=$(IKS_BUILDDIR)/src/libiksemel.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 += 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_rayo_la_SOURCES =
mod_rayo_la_CFLAGS = $(AM_CFLAGS) -I$(IKS_DIR)/include $(PCRE_CFLAGS)
mod_rayo_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(IKS_LA) $(PCRE_LIBS) librayomod.la
mod_rayo_la_CFLAGS = $(AM_CFLAGS) -I$(IKS_DIR)/include $(PCRE2_CFLAGS)
mod_rayo_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(IKS_LA) $(PCRE2_LIBS) librayomod.la
mod_rayo_la_LDFLAGS = -avoid-version -module -no-undefined -shared
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
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_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_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_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_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_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)

View File

@ -28,7 +28,8 @@
*/
#include <switch.h>
#include <iksemel.h>
#include <pcre.h>
#define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h>
#include "srgs.h"
@ -179,7 +180,7 @@ struct srgs_grammar {
/** root rule */
struct srgs_node *root_rule;
/** compiled grammar regex */
pcre *compiled_regex;
pcre2_code *compiled_regex;
/** grammar in regex format */
char *regex;
/** grammar in JSGF format */
@ -846,7 +847,7 @@ static void srgs_grammar_destroy(struct srgs_grammar *grammar)
{
switch_memory_pool_t *pool = grammar->pool;
if (grammar->compiled_regex) {
pcre_free(grammar->compiled_regex);
pcre2_code_free(grammar->compiled_regex);
}
if (grammar->jsgf_file_name) {
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 ')':
/* escape special PCRE regex characters */
/* escape special PCRE2 regex characters */
stream->write_function(stream, "\\%c", node->value.string[i]);
break;
default:
@ -1082,10 +1083,10 @@ static int create_regexes(struct srgs_grammar *grammar, struct srgs_node *node,
/**
* Compile regex
*/
static pcre *get_compiled_regex(struct srgs_grammar *grammar)
static pcre2_code *get_compiled_regex(struct srgs_grammar *grammar)
{
int erroffset = 0;
const char *errptr = "";
PCRE2_SIZE erroffset = 0;
int errcode = 0;
int options = 0;
const char *regex;
@ -1096,7 +1097,7 @@ static pcre *get_compiled_regex(struct srgs_grammar *grammar)
switch_mutex_lock(grammar->mutex);
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);
}
}
@ -1225,7 +1226,6 @@ struct srgs_grammar *srgs_parse(struct srgs_parser *parser, const char *document
}
#define MAX_INPUT_SIZE 128
#define OVECTOR_SIZE MAX_TAGS
#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
* @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);
char search_input[MAX_INPUT_SIZE + 2];
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_input[input_size] = *search++;
result = pcre_exec(compiled_regex, NULL, search_input, input_size + 1, 0, PCRE_PARTIAL,
ovector, sizeof(ovector) / sizeof(ovector[0]));
match_data = pcre2_match_data_create_from_pattern(compiled_regex, NULL);
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) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "not match end\n");
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");
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)
{
int result = 0;
int ovector[OVECTOR_SIZE];
pcre *compiled_regex;
pcre2_code *compiled_regex;
pcre2_match_data *match_data;
*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))) {
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);
if (result > 0) {
@ -1310,24 +1315,33 @@ enum srgs_match_type srgs_grammar_match(struct srgs_grammar *grammar, const char
/* find matching instance... */
for (i = 1; i <= grammar->tag_count; i++) {
char substring_name[16] = { 0 };
PCRE2_SIZE buffer_size = MAX_INPUT_SIZE + 1;
buffer[0] = '\0';
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];
break;
}
}
if (is_match_end(compiled_regex, input)) {
return SMT_MATCH_END;
result = SMT_MATCH_END;
goto exit;
}
return SMT_MATCH;
}
if (result == PCRE_ERROR_PARTIAL) {
return SMT_MATCH_PARTIAL;
result = SMT_MATCH;
goto exit;
}
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;
}
/**

View File

@ -135,7 +135,13 @@ struct sqlite3 {
struct switch_ivr_digit_stream {
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[];
};
struct HashElem {

View File

@ -9309,44 +9309,48 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_regex_compile___(c
void * jresult ;
char *arg1 = (char *) 0 ;
int arg2 ;
char **arg3 = (char **) 0 ;
int *arg4 = (int *) 0 ;
unsigned char *arg5 = (unsigned char *) 0 ;
int *arg3 = (int *) 0 ;
unsigned int *arg4 = (unsigned int *) 0 ;
switch_regex_compile_context_t *arg5 = (switch_regex_compile_context_t *) 0 ;
switch_regex_t *result = 0 ;
arg1 = (char *)jarg1;
arg2 = (int)jarg2;
arg3 = (char **)jarg3;
arg4 = (int *)jarg4;
arg5 = (unsigned char *)jarg5;
result = (switch_regex_t *)switch_regex_compile((char const *)arg1,arg2,(char const **)arg3,arg4,(unsigned char const *)arg5);
arg3 = (int *)jarg3;
arg4 = (unsigned int *)jarg4;
arg5 = (switch_regex_compile_context_t *)jarg5;
result = (switch_regex_t *)switch_regex_compile((char const *)arg1,arg2,arg3,arg4,arg5);
jresult = (void *)result;
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 ;
char *arg1 = (char *) 0 ;
int *arg2 = (int *) 0 ;
int arg3 ;
int arg4 ;
char *arg5 = (char *) 0 ;
int arg6 ;
switch_regex_match_data_t *arg1 = (switch_regex_match_data_t *) 0 ;
int arg2 ;
char *arg3 = (char *) 0 ;
unsigned int *arg4 = (unsigned int *) 0 ;
int result;
arg1 = (char *)jarg1;
arg2 = (int *)jarg2;
arg3 = (int)jarg3;
arg4 = (int)jarg4;
arg5 = (char *)jarg5;
arg6 = (int)jarg6;
result = (int)switch_regex_copy_substring((char const *)arg1,arg2,arg3,arg4,arg5,arg6);
arg1 = (switch_regex_match_data_t *)jarg1;
arg2 = (int)jarg2;
arg3 = (char *)jarg3;
arg4 = (unsigned int *)jarg4;
result = (int)switch_regex_copy_substring(arg1,arg2,arg3,arg4);
jresult = result;
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) {
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 ;
char *arg1 = (char *) 0 ;
char *arg2 = (char *) 0 ;
switch_regex_t **arg3 = (switch_regex_t **) 0 ;
int *arg4 = (int *) 0 ;
uint32_t arg5 ;
switch_regex_match_data_t **arg4 = (switch_regex_match_data_t **) 0 ;
int result;
arg1 = (char *)jarg1;
arg2 = (char *)jarg2;
arg3 = (switch_regex_t **)jarg3;
arg4 = (int *)jarg4;
arg5 = (uint32_t)jarg5;
result = (int)switch_regex_perform((char const *)arg1,(char const *)arg2,arg3,arg4,arg5);
arg4 = (switch_regex_match_data_t **)jarg4;
result = (int)switch_regex_perform((char const *)arg1,(char const *)arg2,arg3,arg4);
jresult = result;
return jresult;
}
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_perform_substitution___(void * jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5, void * jarg6, void * jarg7) {
switch_regex_t *arg1 = (switch_regex_t *) 0 ;
int arg2 ;
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_perform_substitution___(void * jarg1, char * jarg2, char * jarg3, void * jarg4) {
switch_regex_match_data_t *arg1 = (switch_regex_match_data_t *) 0 ;
char *arg2 = (char *) 0 ;
char *arg3 = (char *) 0 ;
char *arg4 = (char *) 0 ;
char *arg5 = (char *) 0 ;
switch_size_t arg6 ;
int *arg7 = (int *) 0 ;
switch_size_t *argp6 ;
switch_size_t arg4 ;
switch_size_t *argp4 ;
arg1 = (switch_regex_t *)jarg1;
arg2 = (int)jarg2;
arg1 = (switch_regex_match_data_t *)jarg1;
arg2 = (char *)jarg2;
arg3 = (char *)jarg3;
arg4 = (char *)jarg4;
arg5 = (char *)jarg5;
argp6 = (switch_size_t *)jarg6;
if (!argp6) {
argp4 = (switch_size_t *)jarg4;
if (!argp4) {
SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null switch_size_t", 0);
return ;
}
arg6 = *argp6;
arg7 = (int *)jarg7;
switch_perform_substitution(arg1,arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,arg7);
arg4 = *argp4;
switch_perform_substitution(arg1,(char const *)arg2,arg3,arg4);
}
@ -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) {
switch_regex_t *arg1 = (switch_regex_t *) 0 ;
SWIGEXPORT void SWIGSTDCALL CSharp_FreeSWITCHfNative_switch_capture_regex___(void * jarg1, int jarg2, char * jarg3, void * jarg4, void * jarg5) {
switch_regex_match_data_t *arg1 = (switch_regex_match_data_t *) 0 ;
int arg2 ;
char *arg3 = (char *) 0 ;
int *arg4 = (int *) 0 ;
char *arg5 = (char *) 0 ;
switch_cap_callback_t arg6 = (switch_cap_callback_t) 0 ;
void *arg7 = (void *) 0 ;
switch_cap_callback_t arg4 = (switch_cap_callback_t) 0 ;
void *arg5 = (void *) 0 ;
arg1 = (switch_regex_t *)jarg1;
arg1 = (switch_regex_match_data_t *)jarg1;
arg2 = (int)jarg2;
arg3 = (char *)jarg3;
arg4 = (int *)jarg4;
arg5 = (char *)jarg5;
arg6 = (switch_cap_callback_t)jarg6;
arg7 = (void *)jarg7;
switch_capture_regex(arg1,arg2,(char const *)arg3,arg4,(char const *)arg5,arg6,arg7);
arg4 = (switch_cap_callback_t)jarg4;
arg5 = (void *)jarg5;
switch_capture_regex(arg1,arg2,(char const *)arg3,arg4,arg5);
}

View File

@ -4365,18 +4365,47 @@ public class SWIGTYPE_p_p_payload_map_s {
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;
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);
}
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);
}
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;
}
}
@ -5641,18 +5670,18 @@ public class SWIGTYPE_p_p_void {
namespace FreeSWITCH.Native {
public class SWIGTYPE_p_pid_t {
public class SWIGTYPE_p_pcre2_real_code {
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);
}
protected SWIGTYPE_p_pid_t() {
protected SWIGTYPE_p_pcre2_real_code() {
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;
}
}
@ -5670,18 +5699,76 @@ public class SWIGTYPE_p_pid_t {
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;
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);
}
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);
}
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;
}
}
@ -7976,36 +8063,32 @@ else
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) {
var errorptr_ptr = global::System.IntPtr.Zero;
try {
global::System.IntPtr cPtr = freeswitchPINVOKE.switch_regex_compile(pattern, options, ref errorptr_ptr, SWIGTYPE_p_int.getCPtr(erroroffset), SWIGTYPE_p_unsigned_char.getCPtr(tables));
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 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) {
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));
SWIGTYPE_p_pcre2_real_code ret = (cPtr == global::System.IntPtr.Zero) ? null : new SWIGTYPE_p_pcre2_real_code(cPtr, false);
return ret;
}
public static int switch_regex_copy_substring(string subject, SWIGTYPE_p_int ovector, int stringcount, int stringnumber, string buffer, int size) {
int ret = freeswitchPINVOKE.switch_regex_copy_substring(subject, SWIGTYPE_p_int.getCPtr(ovector), stringcount, stringnumber, buffer, 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(SWIGTYPE_p_pcre2_real_match_data_8.getCPtr(match_data), stringnumber, buffer, SWIGTYPE_p_unsigned_int.getCPtr(size));
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) {
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) {
int ret = freeswitchPINVOKE.switch_regex_perform(field, expression, SWIGTYPE_p_p_real_pcre.getCPtr(new_re), SWIGTYPE_p_int.getCPtr(ovector), 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_pcre2_real_code.getCPtr(new_re), SWIGTYPE_p_p_pcre2_real_match_data_8.getCPtr(new_match_data));
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) {
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));
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_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();
}
@ -8019,8 +8102,8 @@ else
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) {
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));
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_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) {
@ -17862,19 +17945,22 @@ class freeswitchPINVOKE {
public static extern string switch_sql_concat();
[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___")]
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___")]
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___")]
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___")]
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___")]
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);
[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___")]
public static extern void switch_regex_set_var_callback(string jarg1, string jarg2, global::System.Runtime.InteropServices.HandleRef jarg3);

View File

@ -46,9 +46,9 @@ class FSPCRE : public JSBase
{
private:
switch_regex_t *_re;
switch_regex_match_data_t *_match_data;
char *_str;
int _proceed;
int _ovector[30];
int _freed;
void Init();

View File

@ -139,9 +139,10 @@ void FSEventHandler::QueueEvent(switch_event_t *event)
if (*hp->value == '/') {
switch_regex_t *re = NULL;
switch_regex_match_data_t *match_data = NULL;
int ovector[30];
cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
switch_regex_safe_free(re);
cmp = !!switch_regex_perform(hval, comp_to, &re, &match_data);
switch_regex_and_match_data_safe_free(re, match_data);
} else {
cmp = !strcasecmp(hval, comp_to);
}

View File

@ -40,7 +40,7 @@ static const char js_class_name[] = "PCRE";
FSPCRE::~FSPCRE(void)
{
if (!_freed && _re) {
switch_regex_safe_free(_re);
switch_regex_and_match_data_safe_free(_re, _match_data);
switch_safe_free(_str);
}
}
@ -53,9 +53,9 @@ string FSPCRE::GetJSClassName()
void FSPCRE::Init()
{
_re = NULL;
_match_data = NULL;
_str = NULL;
_proceed = 0;
memset(&_ovector, 0, sizeof(_ovector));
_freed = 0;
}
@ -74,11 +74,10 @@ JS_PCRE_FUNCTION_IMPL(Compile)
String::Utf8Value str2(info[1]);
string = js_safe_str(*str1);
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);
js_strdup(this->_str, string);
this->_proceed = switch_regex_perform(this->_str, regex_string, &this->_re, this->_ovector,
sizeof(this->_ovector) / sizeof(this->_ovector[0]));
this->_proceed = switch_regex_perform(this->_str, regex_string, &this->_re, &this->_match_data);
info.GetReturnValue().Set(this->_proceed ? true : false);
} else {
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;
substituted = (char *)malloc(len);
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));
free(substituted);
} else {

View File

@ -215,7 +215,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
int context_hit = 0;
int proceed = 0;
switch_regex_t *re = NULL;
int ovector[30];
switch_regex_match_data_t *match_data = NULL;
int parens = 0;
if (!caller_profile) {
@ -266,7 +266,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
parens = 0;
proceed = 0;
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
if ((p = strstr(field, "=~"))) {
*p = '\0';
@ -305,7 +305,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
last_field = strdup(field_data);
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");
}
@ -343,7 +343,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
if (parens) {
len = (uint32_t) (strlen(value) + strlen(last_field) + 10) * proceed;
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;
} else {
app_data = value;
@ -368,7 +368,7 @@ static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *
end:
switch_safe_free(last_field);
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
yaml_parser_delete(&parser);
if (input) {

View File

@ -531,20 +531,20 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
if ( regex && val ) {
switch_regex_t *re = NULL;
int ovector[30];
switch_regex_match_data_t *match_data = NULL;
int proceed;
char replace[1024] = "";
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 ) {
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);
val = replace;
}
else {
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) {

View File

@ -33,7 +33,8 @@
#include <switch.h>
#include <switch_channel.h>
#include <pcre.h>
#define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h>
struct switch_cause_table {
const char *name;
@ -4549,21 +4550,22 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(switch_channel_t *
char *digit_string = dtstr;
char *X = NULL;
switch_regex_t *re = NULL;
switch_regex_match_data_t *match_data = NULL;
char *substituted = NULL;
if (!zstr(var)) {
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 i = 0;
const char *replace = NULL;
PCRE2_SIZE replace_size;
X = malloc(len);
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) {
switch_size_t plen = strlen(replace);
memset(X, 'X', plen);
@ -4572,7 +4574,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(switch_channel_t *
switch_safe_free(substituted);
substituted = switch_string_replace(substituted ? substituted : dtstr, replace, X);
pcre_free_substring(replace);
pcre2_substring_free((PCRE2_UCHAR *)replace);
}
}
}
@ -4584,7 +4586,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(switch_channel_t *
}
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(X);
} else {

View File

@ -4344,7 +4344,8 @@ SWITCH_DECLARE(char *) switch_ivr_check_presence_mapping(const char *exten_name,
char *r = NULL;
switch_event_t *params = 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(&params, SWITCH_EVENT_REQUEST_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");
if (!zstr(regex) && !zstr(proto)) {
proceed = switch_regex_perform(exten_name, regex, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
switch_regex_safe_free(re);
proceed = switch_regex_perform(exten_name, regex, &re, &match_data);
switch_regex_and_match_data_safe_free(re, match_data);
if (proceed) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Mapping %s@%s to proto %s matching expression [%s]\n",

View File

@ -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) {
if (bp->is_regex) {
if (bp->repl) {
int ovector[30] = { 0 };
int proceed = 0;
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) {
char *substituted = NULL;
@ -385,13 +385,13 @@ static dm_match_t switch_ivr_dmachine_check_match(switch_ivr_dmachine_t *dmachin
substituted = malloc(len);
switch_assert(substituted);
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)) {
bp->substituted = switch_core_strdup(dmachine->pool, substituted);
}
free(substituted);
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
bp->rmatch = 1;
} else {
bp->substituted = NULL;

View File

@ -553,15 +553,15 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_menu_execute(switch_core_session_t *s
if (ap->re) {
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])))) {
switch_perform_substitution(re, ok, ap->arg, menu->buf, substituted, sizeof(substituted), ovector);
if ((ok = switch_regex_perform(menu->buf, ap->bind, &re, &match_data))) {
switch_perform_substitution(match_data, ap->arg, substituted, sizeof(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_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
} else {
ok = !strcmp(menu->buf, ap->bind);
}

View File

@ -178,7 +178,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_sessio
char *field_expanded = NULL;
char *field_expanded_alloc = 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;
searched = 1;
@ -204,7 +205,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_sessio
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");
} else {
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;
if (!(substituted = malloc(len))) {
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);
goto done;
}
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;
} else {
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);
if (done || status != SWITCH_STATUS_SUCCESS

View File

@ -24,39 +24,49 @@
* Contributor(s):
*
* 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 <pcre.h>
#define PCRE2_CODE_UNIT_WIDTH 8
#include <pcre2.h>
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)
{
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 erroffset = 0;
pcre *re = NULL;
int error_code = 0;
PCRE2_UCHAR error_str[128];
PCRE2_SIZE error_offset = 0;
pcre2_code *re = NULL;
pcre2_match_data *match_data;
int match_count = 0;
char *tmp = NULL;
uint32_t flags = 0;
@ -87,52 +97,56 @@ SWITCH_DECLARE(int) switch_regex_perform(const char *field, const char *expressi
expression = tmp;
if (*opts) {
if (strchr(opts, 'i')) {
flags |= PCRE_CASELESS;
flags |= PCRE2_CASELESS;
}
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 */
&error, /* for error message */
&erroffset, /* for error offset */
&error_code, /* for error code */
&error_offset, /* for error offset */
NULL); /* use default character tables */
if (error) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "COMPILE ERROR: %d [%s][%s]\n", erroffset, error, expression);
switch_regex_safe_free(re);
if (!re) {
pcre2_get_error_message(error_code, error_str, 128);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "COMPILE ERROR: %zu [%s][%s]\n", error_offset, error_str, expression);
goto end;
}
match_count = pcre_exec(re, /* result of pcre_compile() */
NULL, /* we didn't study the pattern */
field, /* the subject string */
match_data = pcre2_match_data_create_from_pattern(re, NULL);
match_count = pcre2_match(re, /* result of pcre_compile() */
(PCRE2_SPTR)field, /* the subject string */
(int) strlen(field), /* the length of the subject string */
0, /* start at offset 0 in the subject */
0, /* default options */
ovector, /* vector of integers for substring information */
olen); /* number of elements (NOT size in bytes) */
match_data, /* vector of integers for substring information */
NULL); /* number of elements (NOT size in bytes) */
if (match_count <= 0) {
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
match_count = 0;
}
*new_re = (switch_regex_t *) re;
*new_match_data = (switch_regex_match_data_t *) match_data;
end:
switch_safe_free(tmp);
return match_count;
}
SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_count, const char *data, const char *field_data,
char *substituted, switch_size_t len, int *ovector)
SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_match_data_t *match_data, const char *data,
char *substituted, switch_size_t len)
{
char index[10] = "";
const char *replace = NULL;
PCRE2_SIZE replace_size;
switch_size_t x, y = 0, z = 0;
int num = 0;
int brace;
@ -174,14 +188,14 @@ SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_c
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) {
switch_size_t r;
for (r = 0; r < strlen(replace) && y < (len - 1); r++) {
substituted[y++] = replace[r];
}
pcre_free_substring(replace);
pcre2_substring_free((PCRE2_UCHAR *)replace);
}
}
} 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,
int *ovector, const char *var, switch_cap_callback_t callback, void *user_data)
SWITCH_DECLARE(void) switch_capture_regex(switch_regex_match_data_t *match_data, int match_count,
const char *var, switch_cap_callback_t callback, void *user_data)
{
const char *replace;
PCRE2_SIZE replace_size;
int 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) {
callback(var, replace, user_data);
pcre_free_substring(replace);
callback(var, (const char *)replace, user_data);
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)
{
const char *error = NULL; /* Used to hold any errors */
int error_offset = 0; /* Holds the offset of an error */
pcre *pcre_prepared = NULL; /* Holds the compiled regex */
PCRE2_UCHAR error[128]; /* Used to hold any errors */
int error_code = 0; /* Holds the code of an error */
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 offset_vectors[255]; /* not used, but has to exist or pcre won't even try to find a match */
int pcre_flags = 0;
pcre2_match_data *match_data;
int pcre2_flags = 0;
uint32_t flags = 0;
char *tmp = NULL;
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;
if (*opts) {
if (strchr(opts, 'i')) {
flags |= PCRE_CASELESS;
flags |= PCRE2_CASELESS;
}
if (strchr(opts, 's')) {
flags |= PCRE_DOTALL;
flags |= PCRE2_DOTALL;
}
}
}
/* 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 */
if (error != NULL) {
/* Clean up after ourselves */
if (pcre_prepared) {
pcre_free(pcre_prepared);
pcre_prepared = NULL;
}
if (!pcre_prepared) {
pcre2_get_error_message(error_code, error, 128);
/* Note our 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 */
goto end;
}
if (*partial) {
pcre_flags = PCRE_PARTIAL;
pcre2_flags = PCRE2_PARTIAL_SOFT;
}
/* So far so good, run the regex */
match_data = pcre2_match_data_create_from_pattern(pcre_prepared, NULL);
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 */
if (pcre_prepared) {
pcre_free(pcre_prepared);
pcre2_code_free(pcre_prepared);
pcre_prepared = NULL;
}
@ -285,7 +302,7 @@ SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, c
if (match_count > 0) {
*partial = 0;
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 */
*partial = 1;
switch_goto_status(SWITCH_STATUS_SUCCESS, end);

View File

@ -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_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_match_data_t *match_data = NULL;
char replace[1024] = "";
switch_time_t ret = 0, local_time = 0;
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());
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_min = 0;
tm.tm_sec = 0;
} else {
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])))) {
switch_regex_safe_free(re);
proceed = switch_regex_perform(in, pattern2, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
if (!(proceed = switch_regex_perform(in, pattern, &re, &match_data))) {
switch_regex_and_match_data_safe_free(re, match_data);
proceed = switch_regex_perform(in, pattern2, &re, &match_data);
}
}
if (proceed || time_only) {
unsigned int replace_size;
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);
}
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);
}
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);
}
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;
}
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;
}
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);
}
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);
}
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);
}
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);
}
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_lt(&local_tm, local_time);
@ -2163,7 +2174,7 @@ SWITCH_DECLARE(switch_time_t) switch_str_time(const char *in)
return ret;
}
switch_regex_safe_free(re);
switch_regex_and_match_data_safe_free(re, match_data);
return ret;
}