diff --git a/kernel-src/include/kernel/cmdline.h b/kernel-src/include/kernel/cmdline.h new file mode 100644 index 00000000..9ae6ccb9 --- /dev/null +++ b/kernel-src/include/kernel/cmdline.h @@ -0,0 +1,7 @@ +#ifndef _CMDLINE_H +#define _CMDLINE_H + +char *cmdline_get(char *); +void cmdline_parse(); + +#endif diff --git a/kernel-src/sys/cmdline.c b/kernel-src/sys/cmdline.c new file mode 100644 index 00000000..0901a443 --- /dev/null +++ b/kernel-src/sys/cmdline.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include + +static volatile struct limine_kernel_file_request kfreq = { + .id = LIMINE_KERNEL_FILE_REQUEST, + .revision = 0 +}; + +static hashtable_t pairtable; + +char *cmdline_get(char *key) { + void *v; + return hashtable_get(&pairtable, &v, key, strlen(key)) == 0 ? v : NULL; +} + +void cmdline_parse() { + __assert(hashtable_init(&pairtable, 16) == 0); + __assert(kfreq.response); + struct limine_file *kernelfile = kfreq.response->kernel_file; + __assert(kernelfile); + char *cmdline = kernelfile->cmdline; + __assert(cmdline); + + size_t bufferlen = strlen(cmdline) + 1; + char buffer[bufferlen]; + memset(buffer, 0, bufferlen); + char *cmdp = cmdline; + char *buffp = buffer; + + bool doconvert = true; + + while (*cmdp) { + char cmdchar = *cmdp++; + if (cmdchar == ' ' && doconvert) + *buffp++ = '\0'; + else if (cmdchar == '"') { + doconvert = !doconvert; + --bufferlen; + } else + *buffp++ = cmdchar; + } + buffer[bufferlen] = '\0'; + + int i = 0; + while (i < bufferlen) { + char *iterator = &buffer[i]; + bool pair = false; + while (*iterator) { + if (*iterator == '=') { + pair = true; + *iterator = '\0'; + } + ++iterator; + } + + size_t keylen = strlen(&buffer[i]); + if (pair) { + char *valuep = &buffer[i + keylen + 1]; + size_t valuelen = strlen(valuep); + + char *value = alloc(valuelen) + 1; + __assert(value); + strcpy(value, valuep); + __assert(hashtable_set(&pairtable, value, &buffer[i], keylen, true) == 0); + i += valuelen + 1; + } else { + char *value = alloc(keylen + 1); + __assert(value); + strcpy(value, &buffer[i]); + __assert(hashtable_set(&pairtable, value, &buffer[i], keylen, true) == 0); + } + i += keylen + 1; + } +}