aboutsummaryrefslogtreecommitdiff
path: root/wildcard_cmp.c
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-06-06 01:58:42 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-07-20 23:52:55 +0200
commit0759122e4c7dd17af9f981040e44c747579478b6 (patch)
tree0c3519520c70819a70b8962e59a722825fb3bd16 /wildcard_cmp.c
parent3f642351232e51963c980a46260ce59076588c55 (diff)
downloadlibweb-0759122e4c7dd17af9f981040e44c747579478b6.tar.gz
Split wildcard_cmp into its own component
Future commits will make use of this function outside handler.c.
Diffstat (limited to 'wildcard_cmp.c')
-rw-r--r--wildcard_cmp.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/wildcard_cmp.c b/wildcard_cmp.c
new file mode 100644
index 0000000..8f7c7c1
--- /dev/null
+++ b/wildcard_cmp.c
@@ -0,0 +1,44 @@
+#include "wildcard_cmp.h"
+#include <string.h>
+
+static int wildcard_cmp(const char *s, const char *p)
+{
+ while (*p && *s)
+ {
+ const char *const wc = strchr(p, '*');
+
+ if (!wc)
+ return strcmp(s, p);
+
+ const size_t n = wc - p;
+
+ if (n)
+ {
+ const int r = strncmp(s, p, n);
+
+ if (r)
+ return r;
+
+ p += n;
+ s += n;
+ }
+ else if (*(wc + 1) == *s)
+ {
+ p = wc + 1;
+ s += n;
+ }
+ else if (*(wc + 1) == '*')
+ p++;
+ else
+ {
+ s++;
+ p += n;
+ }
+ }
+
+ while (*p)
+ if (*p++ != '*')
+ return -1;
+
+ return 0;
+}