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

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
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 <[email protected]>
  *
  * 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


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to