Module: kamailio
Branch: master
Commit: ecf6610d5e4505f20062a2d39674b1e77630844a
URL:
https://github.com/kamailio/kamailio/commit/ecf6610d5e4505f20062a2d39674b1e…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2021-03-03T17:39:12+01:00
textops: added search_str(text, re)
- similar to search(re), but performs the regex match over the parameter
'text' instead of sip message buffer
---
Modified: src/modules/textops/textops.c
---
Diff:
https://github.com/kamailio/kamailio/commit/ecf6610d5e4505f20062a2d39674b1e…
Patch:
https://github.com/kamailio/kamailio/commit/ecf6610d5e4505f20062a2d39674b1e…
---
diff --git a/src/modules/textops/textops.c b/src/modules/textops/textops.c
index 6f3c6f9b5e..1b045dc89c 100644
--- a/src/modules/textops/textops.c
+++ b/src/modules/textops/textops.c
@@ -148,6 +148,7 @@ static int is_present_hf_re_pv_f(sip_msg_t* msg, char* key, char*
foo);
static int is_audio_on_hold_f(struct sip_msg *msg, char *str1, char *str2 );
static int regex_substring_f(struct sip_msg *msg, char *input, char *regex,
char *matched_index, char *match_count, char *dst);
+static int w_search_str(sip_msg_t *msg, char *ptext, char *pre);
static int fixup_substre(void**, int);
static int hname_fixup(void** param, int param_no);
static int free_hname_fixup(void** param, int param_no);
@@ -314,6 +315,9 @@ static cmd_export_t cmds[]={
{"cmp_istr", (cmd_function)cmp_istr_f, 2,
fixup_spve_spve, 0,
ANY_ROUTE},
+ {"search_str", (cmd_function)w_search_str, 2,
+ fixup_spve_spve, 0,
+ ANY_ROUTE},
{"starts_with", (cmd_function)starts_with_f, 2,
fixup_spve_spve, 0,
ANY_ROUTE},
@@ -4593,6 +4597,61 @@ static int fixup_subst_hf(void** param, int param_no)
return 0;
}
+/**
+ *
+ */
+static int ki_search_str(sip_msg_t *msg, str *stext, str *sre)
+{
+ int ret;
+ regex_t re;
+ regmatch_t pmatch;
+
+
+ if(sre==NULL || sre->len<=0) {
+ return 2;
+ }
+
+ if(stext==NULL || stext->len<=0) {
+ return -2;
+ }
+
+ memset(&re, 0, sizeof(regex_t));
+ if (regcomp(&re, sre->s, REG_EXTENDED|REG_ICASE|REG_NEWLINE)!=0) {
+ LM_ERR("failed to compile regex: %.*s\n", sre->len, sre->s);
+ return -2;
+ }
+
+ if (regexec(&re, stext->s, 1, &pmatch, 0)!=0) {
+ ret = -1;
+ } else {
+ ret = 1;
+ }
+
+ regfree(&re);
+
+ return ret;
+}
+
+/**
+ *
+ */
+static int w_search_str(sip_msg_t *msg, char *ptext, char *pre)
+{
+ str stext;
+ str sre;
+
+ if(fixup_get_svalue(msg, (gparam_t*)ptext, &stext)!=0) {
+ LM_ERR("cannot get first parameter\n");
+ return -2;
+ }
+ if(fixup_get_svalue(msg, (gparam_t*)pre, &sre)!=0) {
+ LM_ERR("cannot get second parameter\n");
+ return -2;
+ }
+
+ return ki_search_str(msg, &stext, &sre);
+}
+
/**
*
*/
@@ -4945,6 +5004,11 @@ static sr_kemi_t sr_kemi_textops_exports[] = {
{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},
+ { str_init("textops"), str_init("search_str"),
+ SR_KEMIP_INT, ki_search_str,
+ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+ },
{ str_init("textops"), str_init("starts_with"),
SR_KEMIP_INT, ki_starts_with,
{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,