:: commit 7863c92caea706fff5a9af347df189636c8692a7

mintsuki <mintsuki@protonmail.com> — 2020-10-17 03:37

parents: 0c5ccf14b4

Add URI parser

diff --git a/stage2/lib/config.c b/stage2/lib/config.c
index 4fcca19d..686b2d75 100644
--- a/stage2/lib/config.c
+++ b/stage2/lib/config.c
@@ -1,4 +1,5 @@
 #include <stddef.h>
+#include <stdbool.h>
 #include <lib/config.h>
 #include <lib/libc.h>
 #include <lib/blib.h>
@@ -116,3 +117,41 @@ char *config_get_value(char *buf, size_t index, size_t limit, const char *key) {
 
     return NULL;
 }
+
+// A URI takes the form of: resource://root/path
+// The following function splits up a URI into its componenets
+bool config_resolve_uri(char *uri, char **resource, char **root, char **path) {
+    *resource = *root = *path = NULL;
+
+    // Get resource
+    for (size_t i = 0; ; i++) {
+        if (strlen(uri + i) < 3)
+            return false;
+
+        if (!memcmp(uri + i, "://", 3)) {
+            *resource = uri;
+            uri[i] = 0;
+            uri += i + 3;
+            break;
+        }
+    }
+
+    for (size_t i = 0; ; i++) {
+        if (uri[i] == 0)
+            return false;
+
+        if (uri[i] == '/') {
+            *root = uri;
+            uri[i] = 0;
+            uri += i + 1;
+            break;
+        }
+    }
+
+    if (*uri == 0)
+        return false;
+
+    *path = uri;
+
+    return true;
+}
diff --git a/stage2/lib/config.h b/stage2/lib/config.h
index ff767c6f..788eb3c4 100644
--- a/stage2/lib/config.h
+++ b/stage2/lib/config.h
@@ -2,10 +2,12 @@
 #define __LIB__CONFIG_H__
 
 #include <stddef.h>
+#include <stdbool.h>
 
 int init_config(int drive, int part);
 int config_get_entry_name(char *ret, size_t index, size_t limit);
 int config_set_entry(size_t index);
 char *config_get_value(char *buf, size_t index, size_t limit, const char *key);
+bool config_resolve_uri(char *uri, char **resource, char **root, char **path);
 
 #endif
tab: 248 wrap: offon