- Code: Select all
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void kernal(string command);
void makeDirRelative(string dir);
void echo(string arg);
void ls();
void ls(string arg);
void pwd();
void cat(string arg);
class permissions{
public:
bool read;
bool write;
bool execute;
permissions(string perms){
if(perms[0]=='r'){
read = true;
}else{
read = false;
}
if(perms[1]=='w'){
write = true;
}else{
write = false;
}
if(perms[2]=='x'){
execute = true;
}else{
execute = false;
}
}
};
class file{
public:
string name;
permissions *perms;
string contents;
file(string _name, string _perms, string _contents){
name = _name;
permissions a(_perms);
perms = &a;
contents = _contents;
}
};
class directory{
public:
string name;
permissions* perms;
directory* parent;
vector<directory> subdirs;
vector<file*> files;
directory(string _name, string _perms, directory *_parent){
parent = _parent;
name = _name;
permissions a(_perms);
perms = &a;
_parent->subdirs.push_back(*this);
}
directory(string _name, string _perms){
name = _name;
permissions a(_perms);
perms = &a;
}
};
directory * workingDir;
directory * relativeWorkingDir;
directory root("/","---");
int main(){
vector<directory> tree;
tree.push_back(root);
directory home("home","rwx",&root);
tree.push_back(home);
file text("intro","rwx","this is a file");
home.files.push_back(&text);
directory pretentious("pretentious","rwx",&home);
tree.push_back(pretentious);
file note("note","rwx","this is a file");
pretentious.files.push_back(¬e);
::workingDir = &pretentious;
string input;
for(;;){
getline(cin,input);
kernal(input);
}
return 0;
}
void kernal(string command){
vector<string> argv;
int base = 0;
int extension = 0;
int length = command.length();
while(extension < length){
while(command[extension] != ' ' && extension <= length){
extension ++;
}
if(command.substr(base,extension - base) != "")
argv.push_back(command.substr(base,extension - base));
base = extension +1;
extension += 1;
}
if(argv[0] == "echo" && argv.size() ==2 ){
echo(argv[1]);
}
if(argv[0] == "ls" && argv.size() ==1 ){
ls();
}
if(argv[0] == "ls" && argv.size() ==2 ){
ls(argv[1]);
}
if(argv[0] == "pwd" && argv.size() ==1 ){
pwd();
}
if(argv[0] == "cat" && argv.size() ==2 ){
cat(argv[1]);
}
}
void echo(string arg){
cout<<arg<<endl;
}
void ls(string arg){
makeDirRelative(arg);
for(int i = 0; i < relativeWorkingDir->subdirs.size(); i ++){
cout<<relativeWorkingDir->subdirs[i].name<<endl;
}
for(int i = 0; i < workingDir->files.size(); i ++){
cout<<relativeWorkingDir->files[i]->name<<endl;
}
}
void ls(){
for(int i = 0; i < workingDir->subdirs.size(); i ++){
cout<<workingDir->subdirs[i].name<<endl;
}
for(int i = 0; i < workingDir->files.size(); i ++){
cout<<workingDir->files[i]->name<<endl;
}
}
void pwd(){
cout<< workingDir->name<<endl;
}
void cat(string arg){
for(int i = 0; i < workingDir->files.size(); i ++){
if (workingDir->files[i]->name == arg){
cout<<workingDir->files[i]->contents<<endl;
}
}
}
void makeDirRelative(string dir){
vector<string> parts;
if(dir[0] == '/'){
::relativeWorkingDir= &root;
}
int base = 0;
int extension = 0;
int length = dir.length();
while(extension < length){
while(dir[extension] != '/' && extension <= length){
extension ++;
}
if(dir.substr(base,extension - base) != "")
parts.push_back(dir.substr(base,extension - base));
base = extension +1;
extension += 1;
}
for(int x = 0; x <parts.size(); x ++){
if(parts[x][0] == '.' && parts[x][1] == '.' ){
::relativeWorkingDir = workingDir->parent;
}else{
for(int i = 0; i < workingDir->subdirs.size(); i ++){
if(workingDir->subdirs[i].name == parts[x]){
*::relativeWorkingDir = workingDir->subdirs[i];
}
}
}
}
}




