[sr-dev] git:master:38922466: textops: added functions to find a string inside another one

Daniel-Constantin Mierla miconda at gmail.com
Tue Mar 30 09:26:15 CEST 2021


Module: kamailio
Branch: master
Commit: 389224660bc748b7e9f69fadcbbed0faf8a44b5a
URL: https://github.com/kamailio/kamailio/commit/389224660bc748b7e9f69fadcbbed0faf8a44b5a

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2021-03-30T08:50:54+02:00

textops: added functions to find a string inside another one

---

Modified: src/modules/textops/textops.c

---

Diff:  https://github.com/kamailio/kamailio/commit/389224660bc748b7e9f69fadcbbed0faf8a44b5a.diff
Patch: https://github.com/kamailio/kamailio/commit/389224660bc748b7e9f69fadcbbed0faf8a44b5a.patch

---

diff --git a/src/modules/textops/textops.c b/src/modules/textops/textops.c
index 1b045dc89c..3d90e97a90 100644
--- a/src/modules/textops/textops.c
+++ b/src/modules/textops/textops.c
@@ -137,6 +137,8 @@ static int cmp_str_f(struct sip_msg *msg, char *str1, char *str2 );
 static int cmp_istr_f(struct sip_msg *msg, char *str1, char *str2 );
 static int starts_with_f(struct sip_msg *msg, char *str1, char *str2 );
 static int ends_with_f(struct sip_msg *msg, char *str1, char *str2 );
+static int str_find_f(sip_msg_t *msg, char *str1, char *str2 );
+static int str_ifind_f(sip_msg_t *msg, char *str1, char *str2 );
 static int remove_hf_re_f(struct sip_msg* msg, char* key, char* foo);
 static int remove_hf_exp_f(sip_msg_t* msg, char* ematch, char* eskip);
 static int is_present_hf_re_f(struct sip_msg* msg, char* key, char* foo);
@@ -324,6 +326,12 @@ static cmd_export_t cmds[]={
 	{"ends_with",  (cmd_function)ends_with_f, 2,
 		fixup_spve_spve, 0,
 		ANY_ROUTE},
+	{"str_find",  (cmd_function)str_find_f, 2,
+		fixup_spve_spve, 0,
+		ANY_ROUTE},
+	{"str_ifind",  (cmd_function)str_ifind_f, 2,
+		fixup_spve_spve, 0,
+		ANY_ROUTE},
 	{"is_audio_on_hold",  (cmd_function)is_audio_on_hold_f, 0,
 		0, 0,
 		ANY_ROUTE},
@@ -4271,6 +4279,78 @@ static int ki_ends_with(sip_msg_t *msg, str *vstr, str *vsuffix )
 	return -2;
 }
 
+static int ki_str_find(sip_msg_t *msg, str *txt, str *needle)
+{
+	char *p;
+
+	if(txt==NULL || needle==NULL) {
+		return -1;
+	}
+
+	if(needle->len > txt->len) {
+		return -1;
+	}
+	p = str_search(txt, needle);
+	if(p==NULL) {
+		return -1;
+	}
+
+	return (int)(1 + p - txt->s);
+}
+
+static int str_find_f(struct sip_msg *msg, char *str1, char *str2 )
+{
+	str s1;
+	str s2;
+
+	if(fixup_get_svalue(msg, (gparam_p)str1, &s1)!=0) {
+		LM_ERR("cannot get first parameter\n");
+		return -8;
+	}
+	if(fixup_get_svalue(msg, (gparam_p)str2, &s2)!=0) {
+		LM_ERR("cannot get second parameter\n");
+		return -8;
+	}
+
+	return ki_str_find(msg, &s1, &s2);
+}
+
+static int ki_str_ifind(sip_msg_t *msg, str *txt, str *needle)
+{
+	char *p;
+
+	if(txt==NULL || needle==NULL) {
+		return -1;
+	}
+
+	if(needle->len > txt->len) {
+		return -1;
+	}
+	p = str_casesearch(txt, needle);
+	if(p==NULL) {
+		return -1;
+	}
+
+	return (int)(1 + p - txt->s);
+}
+
+static int str_ifind_f(sip_msg_t *msg, char *str1, char *str2 )
+{
+	str s1;
+	str s2;
+
+	if(fixup_get_svalue(msg, (gparam_p)str1, &s1)!=0) {
+		LM_ERR("cannot get first parameter\n");
+		return -8;
+	}
+	if(fixup_get_svalue(msg, (gparam_p)str2, &s2)!=0) {
+		LM_ERR("cannot get second parameter\n");
+		return -8;
+	}
+
+	return ki_str_ifind(msg, &s1, &s2);
+}
+
 static int ki_is_audio_on_hold(sip_msg_t *msg)
 {
 	int sdp_session_num = 0, sdp_stream_num;
@@ -5019,6 +5099,16 @@ 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("str_find"),
+		SR_KEMIP_INT, ki_str_find,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("textops"), str_init("str_ifind"),
+		SR_KEMIP_INT, ki_str_ifind,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 	{ str_init("textops"), str_init("is_audio_on_hold"),
 		SR_KEMIP_INT, ki_is_audio_on_hold,
 		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,




More information about the sr-dev mailing list