diff options
author | Alexis211 <alexis211@gmail.com> | 2009-12-19 12:52:26 +0100 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-12-19 12:52:26 +0100 |
commit | b079ac88df4c2580310e44fda6a2a4ac5f0f840f (patch) | |
tree | 67d4ed5d2cbe1e0be1414a7eae4b7555acefd169 /Source/Applications/Shell/Shell.class.cpp | |
parent | b2e3fc19bdad4c4d5c650e9ca759883db54b2e41 (diff) | |
parent | 6dc28352073c473a35a9d51796b02361c6c6486c (diff) | |
download | Melon-b079ac88df4c2580310e44fda6a2a4ac5f0f840f.tar.gz Melon-b079ac88df4c2580310e44fda6a2a4ac5f0f840f.zip |
Merge branch 'framework'
Diffstat (limited to 'Source/Applications/Shell/Shell.class.cpp')
-rw-r--r-- | Source/Applications/Shell/Shell.class.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/Source/Applications/Shell/Shell.class.cpp b/Source/Applications/Shell/Shell.class.cpp new file mode 100644 index 0000000..3d406c8 --- /dev/null +++ b/Source/Applications/Shell/Shell.class.cpp @@ -0,0 +1,94 @@ +#include "Shell.class.h" +#include <Binding/Sys.ns.h> +#include <Binding/Process.class.h> + +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<String>&); + } 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() << "}: "; + String s = invt.readLine(); + 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<String> 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"; + } + } +} + + |