diff options
author | Vladimir Gavrilov <105977161+0xA50C1A1@users.noreply.github.com> | 2025-05-12 10:46:54 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-12 09:46:54 +0200 |
commit | 43248244b8753f9ee2162e7e8ce3f407c2149d6f (patch) | |
tree | 3c5ee5f0be1555dd5238c51dcf262a2666c5cbf7 | |
parent | 292d26f0dbb3eede04647b63fccd10216abb47bb (diff) |
Micro-optimizations of 'ndpi_strncasestr' and 'LINE_*' macros (#2808)
-rw-r--r-- | src/include/ndpi_private.h | 21 | ||||
-rw-r--r-- | src/lib/ndpi_main.c | 10 |
2 files changed, 15 insertions, 16 deletions
diff --git a/src/include/ndpi_private.h b/src/include/ndpi_private.h index 0ec33498b..620ce2532 100644 --- a/src/include/ndpi_private.h +++ b/src/include/ndpi_private.h @@ -72,25 +72,16 @@ typedef struct default_ports_tree_node { } default_ports_tree_node_t; -#define LINE_EQUALS(ndpi_int_one_line_struct, string_to_compare) \ - ((ndpi_int_one_line_struct).len == strlen(string_to_compare) && \ - LINE_CMP(ndpi_int_one_line_struct, string_to_compare, strlen(string_to_compare)) == 1) - #define LINE_STARTS(ndpi_int_one_line_struct, string_to_compare) \ - ((ndpi_int_one_line_struct).len >= strlen(string_to_compare) && \ - LINE_CMP(ndpi_int_one_line_struct, string_to_compare, strlen(string_to_compare)) == 1) + ((ndpi_int_one_line_struct).ptr != NULL && \ + (ndpi_int_one_line_struct).len >= strlen(string_to_compare) && \ + strncasecmp((const char *)((ndpi_int_one_line_struct).ptr), string_to_compare, strlen(string_to_compare)) == 0) #define LINE_ENDS(ndpi_int_one_line_struct, string_to_compare) \ ((ndpi_int_one_line_struct).len >= strlen(string_to_compare) && \ - ndpi_strncasestr((const char *)((ndpi_int_one_line_struct).ptr) + \ - ((ndpi_int_one_line_struct).len - strlen(string_to_compare)), \ - string_to_compare, strlen(string_to_compare)) == \ - (const char *)((ndpi_int_one_line_struct).ptr) + ((ndpi_int_one_line_struct).len - strlen(string_to_compare))) - -#define LINE_CMP(ndpi_int_one_line_struct, string_to_compare, string_to_compare_length) \ - ((ndpi_int_one_line_struct).ptr != NULL && \ - ndpi_strncasestr((const char *)((ndpi_int_one_line_struct).ptr), string_to_compare, \ - string_to_compare_length) == (const char *)((ndpi_int_one_line_struct).ptr)) + strncasecmp((const char *)((ndpi_int_one_line_struct).ptr) + \ + ((ndpi_int_one_line_struct).len - strlen(string_to_compare)), \ + string_to_compare, strlen(string_to_compare)) == 0) #define NDPI_MAX_PARSE_LINES_PER_PACKET 64 diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c index 0146f5b18..0cc57e19b 100644 --- a/src/lib/ndpi_main.c +++ b/src/lib/ndpi_main.c @@ -10533,10 +10533,18 @@ const char * ndpi_strncasestr(const char *s, const char *find, size_t len) { const size_t s_len = strnlen(s, len); + /* If 'find' is longer than 's', no match is possible */ + if (find_len > s_len) { + return NULL; + } + const char *const end_of_search = s + s_len - find_len + 1; + /* Cache the lowercased first character of 'find' */ + const unsigned char fc = tolower((unsigned char) *find); + for (; s < end_of_search; ++s) { - if (tolower((unsigned char)*s) == tolower((unsigned char)*find)) { + if (tolower((unsigned char)*s) == fc) { if (strncasecmp(s + 1, find + 1, find_len - 1) == 0) { return s; } |