40 lines
746 B
C++
40 lines
746 B
C++
|
|
#include "FsHelpers.h"
|
||
|
|
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
std::string FsHelpers::normalisePath(const std::string& path) {
|
||
|
|
std::vector<std::string> components;
|
||
|
|
std::string component;
|
||
|
|
|
||
|
|
for (const auto c : path) {
|
||
|
|
if (c == '/') {
|
||
|
|
if (!component.empty()) {
|
||
|
|
if (component == "..") {
|
||
|
|
if (!components.empty()) {
|
||
|
|
components.pop_back();
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
components.push_back(component);
|
||
|
|
}
|
||
|
|
component.clear();
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
component += c;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!component.empty()) {
|
||
|
|
components.push_back(component);
|
||
|
|
}
|
||
|
|
|
||
|
|
std::string result;
|
||
|
|
for (const auto& c : components) {
|
||
|
|
if (!result.empty()) {
|
||
|
|
result += "/";
|
||
|
|
}
|
||
|
|
result += c;
|
||
|
|
}
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}
|