diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-06-06 01:58:42 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-07-20 23:52:55 +0200 |
| commit | 0759122e4c7dd17af9f981040e44c747579478b6 (patch) | |
| tree | 0c3519520c70819a70b8962e59a722825fb3bd16 /wildcard_cmp.c | |
| parent | 3f642351232e51963c980a46260ce59076588c55 (diff) | |
| download | libweb-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.c | 44 |
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; +} |
