FileSystemPath.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "FileSystemPath.h"
  2. #include "Vector.h"
  3. #include "kstdio.h"
  4. #include "StringBuilder.h"
  5. namespace AK {
  6. FileSystemPath::FileSystemPath(const String& s)
  7. : m_string(s)
  8. {
  9. m_is_valid = canonicalize();
  10. }
  11. bool FileSystemPath::canonicalize(bool resolve_symbolic_links)
  12. {
  13. // FIXME: Implement "resolve_symbolic_links"
  14. (void) resolve_symbolic_links;
  15. auto parts = m_string.split('/');
  16. Vector<String> canonical_parts;
  17. for (auto& part : parts) {
  18. if (part == ".")
  19. continue;
  20. if (part == "..") {
  21. if (!canonical_parts.is_empty())
  22. canonical_parts.take_last();
  23. continue;
  24. }
  25. if (!part.is_empty())
  26. canonical_parts.append(part);
  27. }
  28. if (canonical_parts.is_empty()) {
  29. m_string = m_basename = "/";
  30. return true;
  31. }
  32. m_basename = canonical_parts.last();
  33. StringBuilder builder;
  34. for (auto& cpart : canonical_parts) {
  35. builder.append('/');
  36. builder.append(cpart);
  37. }
  38. m_string = builder.build();
  39. return true;
  40. }
  41. }