diff --git a/include/myke/util/slingurl.h b/include/myke/util/slingurl.h new file mode 100644 index 0000000..bb6ec17 --- /dev/null +++ b/include/myke/util/slingurl.h @@ -0,0 +1,10 @@ +// +// Created by rick on 26-03-21. +// + +#ifndef NEW_KERNEL_SLINGURL_H +#define NEW_KERNEL_SLINGURL_H + +void slingurl_decompose(const char* url); + +#endif //NEW_KERNEL_SLINGURL_H diff --git a/include/string.h b/include/string.h index 12aefd2..df307c3 100644 --- a/include/string.h +++ b/include/string.h @@ -19,6 +19,8 @@ size_t strlen(const char *str); const char *strchr(const char *s, char c); +const char *strrchr(const char *s, char c); + int memcmp(const void *s1, const void *s2, size_t n); int strcmp(const char *s1, const char *s2); diff --git a/kernel/command.c b/kernel/command.c index ea5c52d..da9911e 100644 --- a/kernel/command.c +++ b/kernel/command.c @@ -22,6 +22,7 @@ #ifdef ENABLE_SELF_TEST #include +#include #endif @@ -56,6 +57,8 @@ void exec_self_test(const char *args); void smash(const char *args); +void slingurl(const char* args); + #endif cmd_handler cmd_handlers[] = { @@ -65,6 +68,7 @@ cmd_handler cmd_handlers[] = { {"ide", ide}, {"shutdown", shutdown}, {"explode", explode}, + {"slingurl", slingurl}, #ifdef ENABLE_SELF_TEST {"self-test", exec_self_test}, {"smash", smash}, @@ -72,6 +76,10 @@ cmd_handler cmd_handlers[] = { {NULL, NULL}, }; +void slingurl(const char* args) { + slingurl_decompose(args); +} + void smash(const char *args) { char data[16]; memset(data, 'A', 32); diff --git a/kernel/libc/string.c b/kernel/libc/string.c index 365012b..fcfaa2c 100644 --- a/kernel/libc/string.c +++ b/kernel/libc/string.c @@ -56,6 +56,19 @@ const char *strchr(const char *s, char c) { } } +const char *strrchr(const char *s, char c) { + int index = strlen(s); + while (1) { + if (s[index] == c) { + return &s[index]; + } + if (index == 0) { + return NULL; + } + index--; + } +} + int memcmp(const void *s1, const void *s2, size_t n) { uint8_t a, b; for (size_t i = 0; i < n; ++i) { diff --git a/kernel/util/slingurl.c b/kernel/util/slingurl.c new file mode 100644 index 0000000..7fadc65 --- /dev/null +++ b/kernel/util/slingurl.c @@ -0,0 +1,71 @@ +// +// Created by rick on 26-03-21. +// + +#include + +#include +#include +#include + +void slingurl_decompose(const char* url) { + uint32_t urllen = strlen(url); + if (urllen <= 0) { + printf("Url empty"); + return; + } + char* lurl = malloc(urllen + 1); + strcpy(lurl, url); + + // get path section + char* path = lurl; + + // find fist selector + char* selector = strchr(lurl, '.'); + int nselectors = 0; + // to lazy to deal with urls without selectors and extension + if (selector == NULL) goto free_malloc; + selector[0] = 0; + selector += 1; + + // find suffix + char* suffix = strchr(selector, '/'); + if (suffix != NULL) { + suffix[0] = 0; + suffix += 1; + } + + // pick last "suffix" as extension + char* extension = strrchr(selector, '.'); + if (extension == NULL) { + // no dots in suffix section, so only an extension + extension = selector; + selector = NULL; + } else { + extension[0] = 0; + extension += 1; + } + + if (selector != NULL) { + nselectors = 1; + char* cselector = selector; + while ((cselector = strchr(cselector, '.')) != NULL) { + cselector[0] = 0; + cselector += 1; + nselectors++; + } + } + + printf("path: %s\n", path); + printf("selectors: "); + char* cselector = selector; + for (int i = 0; i < nselectors; ++i) { + printf("%s,", cselector); + cselector += strlen(cselector) + 1; + } + printf("\n"); + printf("extension: %s\n", extension); + printf("suffix: %s\n", suffix); + free_malloc: + free(lurl); +} \ No newline at end of file