#include "Shell.class.h" #include #include APP(Shell); Shell::Shell() : ShellApp("Shell.app", "The Melon command line interpreter"), cwd(FS::cwdNode()) { } int Shell::run() { struct { //Command list String name; void (Shell::*cmd)(Vector&); } commands[] = { {"ls", &Shell::ls}, {"cd", &Shell::cd}, {"pwd", &Shell::pwd}, {"rm", &Shell::rm}, {"mkdir", &Shell::mkdir}, {"cat", &Shell::cat}, {"wf", &Shell::wf}, {"run", &Shell::run}, {"", 0} }; cwd = FS::cwdNode(); while (1) { outvt << "{" << cwd.getName() << "}: " << FLUSH; String s = invt.get(); if (s.empty()) continue; while (s[0] == WChar(" ") or s[0] == WChar("\t")) { s = s.substr(1, s.size() - 1); } if (s.empty()) continue; if (s[0] == WChar("#")) continue; //Parse string Vector cmd; cmd.push(String()); bool inQuote = false; for (u32int i = 0; i < s.size(); i++) { if (s[i] == WChar("'")) { inQuote = !inQuote; } else if (s[i] == WChar("\\")) { i++; cmd.back() += s[i]; } else if (s[i] == WChar(" ") and !inQuote) { cmd.push(String()); } else { cmd.back() += s[i]; } } //Run command if (cmd[0] == "exit") { if (cmd.size() == 1) return 0; return cmd[1].toInt(); } else if (cmd[0] == "halt") { Sys::halt(); outvt << "Something went wrong.\n"; } else if (cmd[0] == "reboot") { Sys::reboot(); outvt << "Something went wrong.\n"; } else if (cmd[0] == "uptime") { outvt << "Uptime : " << (s64int)Sys::uptime() << "s\n"; } else if (cmd[0] == "free") { outvt << "Free RAM : " << (s64int)Sys::freeRam() << " Kio of " << (s64int)Sys::totalRam() << " Kio\n"; } else if (cmd[0] == "uid") { outvt << "User ID : " << (s64int)(pr.getUid()) << "\n"; } else if (cmd[0] == "help") { while (cmd.size() > 1) cmd.pop(); cmd.push("/Applications/Shell/Help.txt"); cat(cmd); } else { u32int i = 0; bool found = false; while (!commands[i].name.empty()) { if (commands[i].name == cmd[0]) { found = true; if (commands[i].cmd == 0) { outvt << "Not implemented yet.\n"; } else { (this->*(commands[i].cmd))(cmd); } break; } i++; } if (!found) outvt << "Unknown command : " << cmd[0] << "\n"; } } }