summaryrefslogtreecommitdiff
path: root/AK/FileSystemPath.cpp
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2018-10-28 08:54:20 +0100
committerAndreas Kling <awesomekling@gmail.com>2018-10-28 08:54:20 +0100
commit88ad59bfb18feead399c5250b426fc3dc3512b95 (patch)
treed535ca41ef6b24d5554a24efbf39415b39c4861f /AK/FileSystemPath.cpp
parent43475f248be4798b3400c14e0a019fcbc809e6db (diff)
downloadserenity-88ad59bfb18feead399c5250b426fc3dc3512b95.zip
Add a simple FileSystemPath class that can canonicalize paths.
Also a simple StringBuilder to help him out.
Diffstat (limited to 'AK/FileSystemPath.cpp')
-rw-r--r--AK/FileSystemPath.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/AK/FileSystemPath.cpp b/AK/FileSystemPath.cpp
new file mode 100644
index 0000000000..ab00a61c3c
--- /dev/null
+++ b/AK/FileSystemPath.cpp
@@ -0,0 +1,44 @@
+#include "FileSystemPath.h"
+#include "Vector.h"
+#include "kstdio.h"
+#include "StringBuilder.h"
+
+namespace AK {
+
+FileSystemPath::FileSystemPath(const String& s)
+ : m_string(s)
+{
+ m_isValid = canonicalize();
+}
+
+bool FileSystemPath::canonicalize(bool resolveSymbolicLinks)
+{
+ // FIXME: Implement "resolveSymbolicLinks"
+ auto parts = m_string.split('/');
+ Vector<String> canonicalParts;
+
+ for (auto& part : parts) {
+ if (part == ".")
+ continue;
+ if (part == "..") {
+ if (!canonicalParts.isEmpty())
+ canonicalParts.takeLast();
+ continue;
+ }
+ canonicalParts.append(part);
+ }
+ if (canonicalParts.isEmpty()) {
+ m_string = "/";
+ return true;
+ }
+ StringBuilder builder;
+ for (auto& cpart : canonicalParts) {
+ builder.append('/');
+ builder.append(move(cpart));
+ }
+ m_string = builder.build();
+ return true;
+}
+
+}
+