void fn_cd (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); /* if(words.size() > 1) { wordvec nav_path = split(words[1], "/"); state.final_cd(nav_path); } else { wordvec root_dir{}; state.final_cd(root_dir); } */ if(words.size() > 2){ complain() << "cd: Too many arguments" << endl; return; } if(words.size() > 1) path_name_set(words.at(1)); if(words.size() == 1){ state.setCwd(state.get_root()); return; } else if(words.at(1).at(0) == '/'){ state.setCwd(state.get_root()); } wordvec nav_path = split(words.at(1), "/"); state.final_cd(nav_path); }
void fn_rmr (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); if(words.size() == 1){ complain() << "rmr: Specify file name" << endl; } else if(words.size() > 2){ complain() << "rmr: Too many arguments" << endl; } else if(words.at(1) == "." or words.at(1) == ".." or (words.at(1).at(0) == '/' and words.at(1).length() == 1)){ complain() << "rmr: Cannot remove directory" << endl; } else { path_name_set(words.at(1)); const auto placeholder = state.get_cwd(); if(words.at(1).at(0) == '/') state.setCwd(state.get_root()); wordvec navpath = split(words[1], "/"); string ffname = navpath.back(); if(navpath.size() == 1){ state.function_rmr(state.get_cwd(), ffname); return; } wordvec filepath(&navpath[0], &navpath[navpath.size() - 1]); state.function_final_rmr(ffname, filepath); state.setCwd(placeholder); } }
void fn_cat (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); if(words.size() < 2){ complain() << "cat: Too few arguments" << endl; } else { const string firstword = words.at(1); path_name_set(firstword); if(firstword.at(0) == '/' and firstword.length() > 1){ string navname = firstword.substr(1, firstword.length()); cout << navname << endl; const auto placeholder = state.get_cwd(); wordvec nav_path {}; nav_path = split(navname, "/"); state.setCwd(state.get_root()); state.final_func_cat(nav_path); state.setCwd(placeholder); return; } else if(firstword.length() == 1 and firstword.at(0) == '/'){ complain() << "cat: /: File is Directory" << endl; return; } wordvec nav_path = split(firstword, "/"); state.final_func_cat(nav_path); } }
void fn_cd (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); inode_ptr ogcwd = state.getCwd(); if (words.size() == 1){ state.setCwd(state.getRoot()->getContents()->getNode("/")); return; } if (words.size() > 2) return; if (ogcwd == state.getRoot()->getContents()->getNode("/") && words[1] == "..") return; inode_ptr res = resolvePath(words[1], state.getCwd()); if (res == nullptr) return; if (!res->isDirectory()) return; state.setCwd(res); }
void fn_make (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); if(words.size() < 2){ complain() << "make: Specify pathname" << endl; return; } const auto placeholder = state.get_cwd(); if(words.at(1).at(0) == '/'){ state.setCwd(state.get_root()); } wordvec nav_path = split(words[1], "/"); wordvec insertion(&words[2], &words[words.size()]); state.final_make_file(nav_path, insertion); state.setCwd(placeholder); }
void fn_ls (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); inode_ptr ogcwd = state.getCwd(); inode_ptr res = ogcwd; if(words.size() > 1) res = resolvePath(words[1], state.getCwd()); if (res == nullptr) return; auto pathList = res->getContents()->getAllPaths(); state.setCwd(res); fn_pwd(state, words); for (size_t i = 0; i < pathList.size(); i++){ cout << pathList[i] << endl; } state.setCwd(ogcwd); }
void fn_lsr (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); inode_ptr ogcwd = state.getCwd(); inode_ptr newCwd = ogcwd; if (words.size() > 0){ newCwd = resolvePath(words[1], state.getCwd()); state.setCwd(newCwd); } auto pathList = newCwd->getContents()->getAllDirs(); wordvec ls {"ls"}; fn_ls(state, ls); for(int i = 0; i < pathList.size(); i++){ DFS(pathList[i], state); } state.setCwd(ogcwd); }
void fn_mkdir (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); //NEED TO CHECK IF THE DIR IS ALREADY IN THE DIR. if(words.size() < 2){ complain() << "mkdir: Too few arguments" << endl; } else if(words.size() > 2) { complain() << "mkdir: Too many arguments" << endl; } else { path_name_set(words.at(1)); const auto placeholder = state.get_cwd(); if(words.at(1).at(0) == '/') { state.setCwd(state.get_root()); } path_name_set(words.at(1)); wordvec nav_path = split(words.at(1), "/"); state.final_mkdir(nav_path); state.setCwd(placeholder); } }
void DFS(string s, inode_state& state){ wordvec newLs {"ls", s}; fn_ls(state, newLs); auto dirList = state.getCwd()->getContents()->getAllDirs(); if (dirList.size() == 0) return; map<string, int> disc; for (int i = 0; i < dirList.size(); i++){ disc[dirList[i]] = 0; } for (auto it = disc.begin(); it != disc.end(); ++it){ if (it->second == 0){ disc[it->first] = 1; inode_ptr ogcwd = state.getCwd(); state.setCwd(state.getCwd()->getContents()->getNode(it->first)); DFS(it->first, state); state.setCwd(ogcwd); } } }
void fn_lsr (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); if(words.size() > 2){ complain() << "lsr: Too many arguments" << endl; return; } else if(words.size() == 1){ state.function_list_r(state.get_cwd()); } else if(words.at(1).at(0) == '/'){ if(words.at(1).length() == 1){ state.function_list_r(state.get_root()); return; } const auto placeholder = state.get_cwd(); state.setCwd(state.get_root()); wordvec nav_path = split(words.at(1), "/"); state.function_list_r(state.get_working_ptr(nav_path)); state.setCwd(placeholder); } else { wordvec nav_path = split(words[1], "/"); state.function_list_r(state.get_working_ptr(nav_path)); } }