aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorPetr <30545094+pasabanov@users.noreply.github.com>2024-07-18 20:40:09 +0300
committerGitHub <noreply@github.com>2024-07-18 19:40:09 +0200
commit92d0b8d91f6a88f1be350ed21c863a17ba433825 (patch)
tree4225b15cb6311541c719f3d94c4dfe601a9212f8 /src/lib
parentc35a5ca087bdace26d454dd73337a63f04f23e20 (diff)
ndpi_strncasestr: optimization, fixes, tests (#2507)
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ndpi_main.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c
index 902562d98..b904b83de 100644
--- a/src/lib/ndpi_main.c
+++ b/src/lib/ndpi_main.c
@@ -9765,18 +9765,28 @@ char *ndpi_strnstr(const char *haystack, const char *needle, size_t len)
* Same as ndpi_strnstr but case-insensitive.
* Please note that this function is *NOT* equivalent to strncasecmp().
*/
-const char * ndpi_strncasestr(const char *str1, const char *str2, size_t len) {
- size_t str1_len = strnlen(str1, len);
- size_t str2_len = strlen(str2);
- int i; /* signed! */
+const char * ndpi_strncasestr(const char *s, const char *find, size_t len) {
- for(i = 0; i < (int)(str1_len - str2_len + 1); i++){
- if(str1[0] == '\0')
- return NULL;
- else if(strncasecmp(str1, str2, str2_len) == 0)
- return(str1);
+ if (!s || !find) {
+ return NULL;
+ }
+
+ const size_t find_len = strlen(find);
+
+ if (find_len == 0) {
+ return s;
+ }
+
+ const size_t s_len = strnlen(s, len);
+
+ const char *const end_of_search = s + s_len - find_len + 1;
- str1++;
+ for (; s < end_of_search; ++s) {
+ if (tolower((unsigned char)*s) == tolower((unsigned char)*find)) {
+ if (strncasecmp(s + 1, find + 1, find_len - 1) == 0) {
+ return s;
+ }
+ }
}
return NULL;