[sr-dev] git:master:7772e14f: core: _strnstr() and _strnistr() defined in core

Daniel-Constantin Mierla miconda at gmail.com
Tue Mar 15 12:41:13 CET 2016


Module: kamailio
Branch: master
Commit: 7772e14fc298956f57429a67ea4524818b22a158
URL: https://github.com/kamailio/kamailio/commit/7772e14fc298956f57429a67ea4524818b22a158

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2016-03-15T12:40:47+01:00

core: _strnstr() and _strnistr() defined in core

- alternative to strnstr() which is not in all OSes, pluse the
  insensitive option

---

Modified: str.c
Modified: str.h

---

Diff:  https://github.com/kamailio/kamailio/commit/7772e14fc298956f57429a67ea4524818b22a158.diff
Patch: https://github.com/kamailio/kamailio/commit/7772e14fc298956f57429a67ea4524818b22a158.patch

---

diff --git a/str.c b/str.c
index c9c4d33..fda76c9 100644
--- a/str.c
+++ b/str.c
@@ -1,5 +1,6 @@
 /*
  *
+ * Copyright (C) 2015 kamailio.org
  * Copyright (C) 2014 Victor Seva <vseva at sipwise.com>
  *
  * This file is part of kamailio, a free SIP server.
@@ -48,3 +49,53 @@ int str_append(str *orig, str *suffix, str *dest)
 	memcpy(dest->s+orig->len, suffix->s, suffix->len);
 	return 0;
 }
+
+/*
+* Find the first occurrence of find in s, where the search is limited to the
+* first slen characters of s.
+*/
+char * _strnstr(const char* s, const char* find, size_t slen)
+{
+	char c, sc;
+	size_t len;
+
+	if ((c = *find++) != '\0') {
+		len = strlen(find);
+		do {
+			do {
+				if (slen-- < 1 || (sc = *s++) == '\0')
+					return (NULL);
+			} while (sc != c);
+			if (len > slen)
+				return (NULL);
+		} while (strncmp(s, find, len) != 0);
+		s--;
+	}
+	return ((char *)s);
+}
+
+/*
+ * Find the first case insensitive occurrence of find in s, where the
+ * search is limited to the first slen characters of s.
+ * Based on FreeBSD strnstr.
+ */
+char* _strnistr(const char *s, const char *find, size_t slen)
+{
+	char c, sc;
+	size_t len;
+
+	if ((c = *find++) != '\0') {
+		len = strlen(find);
+		do {
+			do {
+				if ((sc = *s++) == '\0' || slen-- < 1)
+					return (NULL);
+			} while (sc != c);
+			if (len > slen)
+				return (NULL);
+		} while (strncasecmp(s, find, len) != 0);
+		s--;
+	}
+	return ((char *)s);
+}
+
diff --git a/str.h b/str.h
index 9ef8809..de226c7 100644
--- a/str.h
+++ b/str.h
@@ -21,6 +21,8 @@
 #ifndef str_h
 #define str_h
 
+#include <string.h>
+
 /** @defgroup str_string Counted-Length Strings 
  * @{
  * 
@@ -125,4 +127,7 @@ typedef struct _str str;
  */
 int str_append(str *orig, str *suffix, str *dest);
 
+char* _strnstr(const char *s, const char *find, size_t slen);
+char* _strnistr(const char *s, const char *find, size_t slen);
+
 #endif




More information about the sr-dev mailing list