diff options
author | Andreas Kling <awesomekling@gmail.com> | 2018-10-28 08:54:20 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2018-10-28 08:54:20 +0100 |
commit | 88ad59bfb18feead399c5250b426fc3dc3512b95 (patch) | |
tree | d535ca41ef6b24d5554a24efbf39415b39c4861f /AK/FileSystemPath.cpp | |
parent | 43475f248be4798b3400c14e0a019fcbc809e6db (diff) | |
download | serenity-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.cpp | 44 |
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; +} + +} + |