diff --git a/Makefile.am b/Makefile.am index fdd339a68b..f40e24bae0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/build/Makefile.centos5 b/build/Makefile.centos5 index 92dc5467a8..3ee1ae4f2a 100644 --- a/build/Makefile.centos5 +++ b/build/Makefile.centos5 @@ -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) diff --git a/build/Makefile.centos6 b/build/Makefile.centos6 index 327c2e6454..44ebbd2a05 100644 --- a/build/Makefile.centos6 +++ b/build/Makefile.centos6 @@ -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 diff --git a/build/Makefile.openbsd b/build/Makefile.openbsd index f23dff4075..c2ae3cee9b 100644 --- a/build/Makefile.openbsd +++ b/build/Makefile.openbsd @@ -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 diff --git a/build/Makefile.solaris11 b/build/Makefile.solaris11 index dd35215961..8fc88aae9b 100644 --- a/build/Makefile.solaris11 +++ b/build/Makefile.solaris11 @@ -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) diff --git a/configure.ac b/configure.ac index 6991398ae7..2aaa0159be 100644 --- a/configure.ac +++ b/configure.ac @@ -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])],[ diff --git a/freeswitch.spec b/freeswitch.spec index 98ce36cb90..b5c3fdef60 100644 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -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 diff --git a/libs/.gitignore b/libs/.gitignore index 87da2671c6..bdbea852e6 100644 --- a/libs/.gitignore +++ b/libs/.gitignore @@ -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-*/ diff --git a/libs/apr/build/prebuildNW.bat b/libs/apr/build/prebuildNW.bat index 7b3f3a7b08..a882f2e1b0 100755 --- a/libs/apr/build/prebuildNW.bat +++ b/libs/apr/build/prebuildNW.bat @@ -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% diff --git a/src/include/switch.h b/src/include/switch.h index 68c20044c5..3ac1176670 100644 --- a/src/include/switch.h +++ b/src/include/switch.h @@ -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: diff --git a/src/include/switch_regex.h b/src/include/switch_regex.h index 22147c1809..42cf64a7b1 100644 --- a/src/include/switch_regex.h +++ b/src/include/switch_regex.h @@ -25,7 +25,7 @@ * * Michael Jerris * - * 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);\ + } + /** @} */ diff --git a/src/mod/applications/mod_abstraction/mod_abstraction.c b/src/mod/applications/mod_abstraction/mod_abstraction.c index 11144462ec..75e3ddd431 100644 --- a/src/mod/applications/mod_abstraction/mod_abstraction.c +++ b/src/mod/applications/mod_abstraction/mod_abstraction.c @@ -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); diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 5b9620a781..62c207b67d 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -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; } diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 58fce5f5d3..1b1a958623 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -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"); } diff --git a/src/mod/applications/mod_enum/mod_enum.c b/src/mod/applications/mod_enum/mod_enum.c index aa87f24826..1e9ac71a40 100644 --- a/src/mod/applications/mod_enum/mod_enum.c +++ b/src/mod/applications/mod_enum/mod_enum.c @@ -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); } } diff --git a/src/mod/applications/mod_lcr/mod_lcr.c b/src/mod/applications/mod_lcr/mod_lcr.c index ab7c163ce5..5d1b56a903 100644 --- a/src/mod/applications/mod_lcr/mod_lcr.c +++ b/src/mod/applications/mod_lcr/mod_lcr.c @@ -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; } diff --git a/src/mod/applications/mod_sms/mod_sms.c b/src/mod/applications/mod_sms/mod_sms.c index 68ad7d7ccc..aa8f45081d 100644 --- a/src/mod/applications/mod_sms/mod_sms.c +++ b/src/mod/applications/mod_sms/mod_sms.c @@ -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; diff --git a/src/mod/applications/mod_translate/mod_translate.c b/src/mod/applications/mod_translate/mod_translate.c index 34b1ad54fc..cd56faab7b 100644 --- a/src/mod/applications/mod_translate/mod_translate.c +++ b/src/mod/applications/mod_translate/mod_translate.c @@ -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; } } diff --git a/src/mod/dialplans/mod_dialplan_asterisk/mod_dialplan_asterisk.c b/src/mod/dialplans/mod_dialplan_asterisk/mod_dialplan_asterisk.c index 652d292e65..85e04f7874 100644 --- a/src/mod/dialplans/mod_dialplan_asterisk/mod_dialplan_asterisk.c +++ b/src/mod/dialplans/mod_dialplan_asterisk/mod_dialplan_asterisk.c @@ -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)) { diff --git a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c index f85a9855bb..f8b5ca908c 100644 --- a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c +++ b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c @@ -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); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 1452a7cf0f..f8704556e0 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -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); } } } diff --git a/src/mod/endpoints/mod_verto/mod_verto.c b/src/mod/endpoints/mod_verto/mod_verto.c index 36aba6db5e..5daea3a398 100644 --- a/src/mod/endpoints/mod_verto/mod_verto.c +++ b/src/mod/endpoints/mod_verto/mod_verto.c @@ -1883,22 +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_safe_free(re); + switch_regex_and_match_data_safe_free(re, match_data); break; } rule = rule->next; - switch_regex_safe_free(re); + switch_regex_and_match_data_safe_free(re, match_data); } } diff --git a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c index bd7bf8e26c..685bfaaccc 100644 --- a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c +++ b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c @@ -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); } diff --git a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c index 935f726ee1..1b0dd5125f 100644 --- a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c +++ b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c @@ -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); } diff --git a/src/mod/event_handlers/mod_rayo/Makefile.am b/src/mod/event_handlers/mod_rayo/Makefile.am index a9ca95d51b..2b8e4bc85f 100644 --- a/src/mod/event_handlers/mod_rayo/Makefile.am +++ b/src/mod/event_handlers/mod_rayo/Makefile.am @@ -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) diff --git a/src/mod/event_handlers/mod_rayo/srgs.c b/src/mod/event_handlers/mod_rayo/srgs.c index 7981c24ef2..e9cbc18076 100644 --- a/src/mod/event_handlers/mod_rayo/srgs.c +++ b/src/mod/event_handlers/mod_rayo/srgs.c @@ -28,7 +28,8 @@ */ #include #include -#include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include #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; } /** diff --git a/src/mod/languages/mod_managed/freeswitch_managed.h b/src/mod/languages/mod_managed/freeswitch_managed.h index aac135d629..f2949710a8 100644 --- a/src/mod/languages/mod_managed/freeswitch_managed.h +++ b/src/mod/languages/mod_managed/freeswitch_managed.h @@ -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 { diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx index 51de531a35..cf5b9212cf 100644 --- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx +++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx @@ -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); } diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs index bfcee9310e..68c8611ba7 100644 --- a/src/mod/languages/mod_managed/managed/swig.cs +++ b/src/mod/languages/mod_managed/managed/swig.cs @@ -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; + } +} + +} +//------------------------------------------------------------------------------ +// +// +// 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; + } +} + +} +//------------------------------------------------------------------------------ +// +// +// 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; + } +} + +} +//------------------------------------------------------------------------------ +// +// +// 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); diff --git a/src/mod/languages/mod_v8/include/fspcre.hpp b/src/mod/languages/mod_v8/include/fspcre.hpp index da1a3bbe2d..d2d2662f3a 100644 --- a/src/mod/languages/mod_v8/include/fspcre.hpp +++ b/src/mod/languages/mod_v8/include/fspcre.hpp @@ -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(); diff --git a/src/mod/languages/mod_v8/src/fseventhandler.cpp b/src/mod/languages/mod_v8/src/fseventhandler.cpp index 145984c83f..691e664d99 100644 --- a/src/mod/languages/mod_v8/src/fseventhandler.cpp +++ b/src/mod/languages/mod_v8/src/fseventhandler.cpp @@ -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); } diff --git a/src/mod/languages/mod_v8/src/fspcre.cpp b/src/mod/languages/mod_v8/src/fspcre.cpp index 1b1b97e2a7..0d1f835262 100644 --- a/src/mod/languages/mod_v8/src/fspcre.cpp +++ b/src/mod/languages/mod_v8/src/fspcre.cpp @@ -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 { diff --git a/src/mod/languages/mod_yaml/mod_yaml.c b/src/mod/languages/mod_yaml/mod_yaml.c index 4c824e7137..d675410a04 100644 --- a/src/mod/languages/mod_yaml/mod_yaml.c +++ b/src/mod/languages/mod_yaml/mod_yaml.c @@ -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) { diff --git a/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c b/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c index f35966145f..9b7f55d801 100644 --- a/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c +++ b/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c @@ -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) { diff --git a/src/switch_channel.c b/src/switch_channel.c index 9c7b8e433d..cb00605d75 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -33,7 +33,8 @@ #include #include -#include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include struct switch_cause_table { const char *name; @@ -4548,21 +4549,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); @@ -4571,7 +4573,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); } } } @@ -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_regex_safe_free(re); + switch_regex_and_match_data_safe_free(re, match_data); switch_safe_free(substituted); switch_safe_free(X); } else { diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 1443f989cf..31c27a91ea 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -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(¶ms, 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", diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 4075f0adce..305b1be28e 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -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; diff --git a/src/switch_ivr_menu.c b/src/switch_ivr_menu.c index 255c9a4f12..90f855ee39 100644 --- a/src/switch_ivr_menu.c +++ b/src/switch_ivr_menu.c @@ -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); } diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c index b39d42f657..e81e191c6f 100644 --- a/src/switch_ivr_play_say.c +++ b/src/switch_ivr_play_say.c @@ -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 diff --git a/src/switch_regex.c b/src/switch_regex.c index 21e54b29fe..15d363c9d5 100644 --- a/src/switch_regex.c +++ b/src/switch_regex.c @@ -24,39 +24,49 @@ * Contributor(s): * * Michael Jerris + * Christian Marangi # PCRE2 conversion * * - * switch_regex.c -- PCRE wrapper + * switch_regex.c -- PCRE2 wrapper * */ #include -#include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include 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); diff --git a/src/switch_utils.c b/src/switch_utils.c index 1293ca3fbd..1ce040f777 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -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; }