summaryrefslogtreecommitdiff
path: root/Source/Applications/Shell/Shell.class.cpp
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-12-19 12:52:26 +0100
committerAlexis211 <alexis211@gmail.com>2009-12-19 12:52:26 +0100
commitb079ac88df4c2580310e44fda6a2a4ac5f0f840f (patch)
tree67d4ed5d2cbe1e0be1414a7eae4b7555acefd169 /Source/Applications/Shell/Shell.class.cpp
parentb2e3fc19bdad4c4d5c650e9ca759883db54b2e41 (diff)
parent6dc28352073c473a35a9d51796b02361c6c6486c (diff)
downloadMelon-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.cpp94
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";
+ }
+ }
+}
+
+