From 5e5f3401ff6a5b27d91b6e65997ca368aff97261 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Sat, 22 Jun 2019 20:44:03 +0300
Subject: [PATCH] Allow relative file URIs

---
 components/common/cpp/src/uri.cpp | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/components/common/cpp/src/uri.cpp b/components/common/cpp/src/uri.cpp
index fe78c9ffe..8417017ec 100644
--- a/components/common/cpp/src/uri.cpp
+++ b/components/common/cpp/src/uri.cpp
@@ -1,4 +1,8 @@
 #include <ftl/uri.hpp>
+// #include <filesystem>  TODO When available
+#include <cstdlib>
+#include <unistd.h>
+#include <loguru.hpp>
 
 using ftl::URI;
 using ftl::uri_t;
@@ -27,13 +31,28 @@ URI::URI(const URI &c) {
 void URI::_parse(uri_t puri) {
     UriUriA uri;
 
+	std::string suri = puri;
+
+	// NOTE: Non-standard additions to allow for Unix style relative file names.
+	if (suri[0] == '.') {
+		char cwdbuf[1024];
+		getcwd(cwdbuf, 1024);
+		suri = string("file://") + string(cwdbuf) + suri.substr(1);
+	} else if (suri[0] == '~') {
+#ifdef WIN32
+		suri = string("file://") + string(std::getenv("HOMEDRIVE")) + string(std::getenv("HOMEPATH")) + suri.substr(1);
+#else
+		suri = string("file://") + string(std::getenv("HOME")) + suri.substr(1);
+#endif
+	}
+
 #ifdef HAVE_URIPARSESINGLE
     const char *errpos;
     if (uriParseSingleUriA(&uri, puri, &errpos) != URI_SUCCESS) {
 #else
     UriParserStateA uris;
     uris.uri = &uri;
-    if (uriParseUriA(&uris, puri) != URI_SUCCESS) {
+    if (uriParseUriA(&uris, suri.c_str()) != URI_SUCCESS) {
 #endif
         m_valid = false;
         m_host = "none";
-- 
GitLab