Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Инклюды не в алфавитном порядке (имхо, странный гайд, но как есть)
- #include "unixpath.h"
- #include <string>
- #include <vector>
- std::vector<std::string> Tokenize(std::string_view str) {
- std::vector<std::string> result;
- std::string token;
- for (size_t i = 0; i < str.size(); ++i) { // В данном случае можно использовать range-based for
- if (str[i] == '/') {
- if (!token.empty()) {
- result.push_back(token);
- token = "";
- }
- } else {
- token.push_back(str[i]);
- }
- }
- if (!token.empty()) {
- result.push_back(token);
- }
- return result;
- }
- std::string Unite(const std::vector<std::string>& path) {
- std::string answer = "/";
- for (const std::string& path_piece : path) {
- // я бы заменил две строки ниже на answer += path_piece + '/';
- answer += path_piece;
- answer.push_back('/');
- }
- if (answer.size() > 1) {
- answer.pop_back();
- }
- return answer;
- }
- std::string NormalizePath(std::string_view current_working_dir, std::string_view path) {
- if (current_working_dir.empty()) {
- return "";
- }
- if (path[0] == '/') { // не уверен, если это проверка нужна. скажешь для чего ты её используешь :)
- current_working_dir = "/";
- }
- std::vector<std::string> working_dir = Tokenize(current_working_dir);
- std::vector<std::string> commands = Tokenize(path);
- for (const std::string& command : commands) {
- if (command == ".") {
- continue;
- } else if (command == ".." && !working_dir.empty()) {
- working_dir.pop_back();
- } else if (command != "..") {
- working_dir.push_back(command);
- }
- }
- return Unite(working_dir);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement