From d4c8a8062ff722d7165f4b5faefe0f9b73d3738a Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Tue, 6 Jun 2023 01:58:42 +0200 Subject: Split wildcard_cmp into its own component Future commits will make use of this function outside handler.c. --- CMakeLists.txt | 1 + Makefile | 3 ++- handler.c | 43 +------------------------------------------ main.c | 1 + wildcard_cmp.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ wildcard_cmp.h | 6 ++++++ 6 files changed, 55 insertions(+), 43 deletions(-) create mode 100644 wildcard_cmp.c create mode 100644 wildcard_cmp.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 83c25b1..1b4a381 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ add_executable(${PROJECT_NAME} main.c page.c server.c + wildcard_cmp.c ) target_compile_options(${PROJECT_NAME} PRIVATE -Wall) target_compile_definitions(${PROJECT_NAME} PRIVATE _FILE_OFFSET_BITS=64) diff --git a/Makefile b/Makefile index 5e330be..09f3cb2 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,8 @@ OBJECTS = \ jwt.o \ main.o \ page.o \ - server.o + server.o \ + wildcard_cmp.o \ all: $(PROJECT) diff --git a/handler.c b/handler.c index 795d503..9103db0 100644 --- a/handler.c +++ b/handler.c @@ -3,6 +3,7 @@ #include "handler.h" #include "http.h" #include "server.h" +#include "wildcard_cmp.h" #include #include #include @@ -47,48 +48,6 @@ static int on_write(const void *const buf, const size_t n, void *const user) return server_write(buf, n, c->c); } -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; -} - static int on_payload(const struct http_payload *const p, struct http_response *const r, void *const user) { diff --git a/main.c b/main.c index 4a9dfa5..1ca7a3c 100644 --- a/main.c +++ b/main.c @@ -6,6 +6,7 @@ #include "hex.h" #include "http.h" #include "page.h" +#include "wildcard_cmp.h" #include #include #include 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 + +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; +} diff --git a/wildcard_cmp.h b/wildcard_cmp.h new file mode 100644 index 0000000..9024dbc --- /dev/null +++ b/wildcard_cmp.h @@ -0,0 +1,6 @@ +#ifndef WILDCARD_CMP_H +#define WILDCARD_CMP_H + +int wildcard_cmp(const char *s, const char *p); + +#endif /* WILDCARD_CMP_H */ -- cgit v1.2.3