Advertisement
Adam_mz_

Untitled

Feb 2nd, 2022
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. // Инклюды не в алфавитном порядке (имхо, странный гайд, но как есть)
  2. #include "unixpath.h"
  3. #include <string>
  4. #include <vector>
  5.  
  6. std::vector<std::string> Tokenize(std::string_view str) {
  7.     std::vector<std::string> result;
  8.     std::string token;
  9.     for (size_t i = 0; i < str.size(); ++i) { // В данном случае можно использовать range-based for
  10.         if (str[i] == '/') {
  11.             if (!token.empty()) {
  12.                 result.push_back(token);
  13.                 token = "";
  14.             }
  15.         } else {
  16.             token.push_back(str[i]);
  17.         }
  18.     }
  19.     if (!token.empty()) {
  20.         result.push_back(token);
  21.     }
  22.     return result;
  23. }
  24.  
  25. std::string Unite(const std::vector<std::string>& path) {
  26.     std::string answer = "/";
  27.     for (const std::string& path_piece : path) {
  28.         // я бы заменил две строки ниже на   answer += path_piece + '/';
  29.         answer += path_piece;
  30.         answer.push_back('/');
  31.     }
  32.     if (answer.size() > 1) {
  33.         answer.pop_back();
  34.     }
  35.     return answer;
  36. }
  37.  
  38. std::string NormalizePath(std::string_view current_working_dir, std::string_view path) {
  39.  
  40.     if (current_working_dir.empty()) {
  41.         return "";
  42.     }
  43.     if (path[0] == '/') { // не уверен, если это проверка нужна. скажешь для чего ты её используешь :)
  44.         current_working_dir = "/";
  45.     }
  46.     std::vector<std::string> working_dir = Tokenize(current_working_dir);
  47.     std::vector<std::string> commands = Tokenize(path);
  48.     for (const std::string& command : commands) {
  49.         if (command == ".") {
  50.             continue;
  51.         } else if (command == ".." && !working_dir.empty()) {
  52.             working_dir.pop_back();
  53.         } else if (command != "..") {
  54.             working_dir.push_back(command);
  55.         }
  56.     }
  57.     return Unite(working_dir);
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement