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
