summaryrefslogtreecommitdiff
path: root/Source/Library/Userland/App/ShellApp.proto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Library/Userland/App/ShellApp.proto.cpp')
-rw-r--r--Source/Library/Userland/App/ShellApp.proto.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/Source/Library/Userland/App/ShellApp.proto.cpp b/Source/Library/Userland/App/ShellApp.proto.cpp
new file mode 100644
index 0000000..a3d9737
--- /dev/null
+++ b/Source/Library/Userland/App/ShellApp.proto.cpp
@@ -0,0 +1,139 @@
+#include "ShellApp.proto.h"
+
+ShellApp::ShellApp(String name, String desc)
+ : Application(), invt(VirtualTerminal::getIn()), outvt(VirtualTerminal::getOut()) {
+ appName = name, appDesc = desc;
+ if (!invt.valid()) exit(1);
+ if (!outvt.valid()) exit(2);
+
+ addFlag("h", "help", "Show this help screen");
+}
+
+void ShellApp::init() {
+ //Parse flags
+ u32int argc = pr.argc();
+ for (u32int i = 0; i < argc; i++) {
+ String arg = pr.argv(i);
+ if (arg == "-") {
+ i++;
+ if (i == argc) {
+ args.push("-");
+ } else {
+ for (; i < argc; i++) args.push(pr.argv(i));
+ }
+ } else if (arg[0] == WChar("-")) {
+ if (arg.substr(0, 5) == "--no-") {
+ bool found = false;
+ for (u32int i = 0; i < flags.size(); i++) {
+ if (flags[i].type == FT_BOOL) {
+ if (arg == String("--no-") + flags[i].lName) {
+ flags[i].boolVal = false;
+ found = true;
+ }
+ }
+ }
+ if (!found) outvt << "Unknown option : " << arg << "\n";
+ } else if (arg.substr(0, 2) == "--") {
+ bool found = false;
+ for (u32int i = 0; i < flags.size(); i++) {
+ if (flags[i].type == FT_BOOL) {
+ if (arg == String("--") + flags[i].lName) {
+ flags[i].boolVal = true;
+ found = true;
+ }
+ } else {
+ if (arg.substr(2, 1 + flags[i].lName.size()) == flags[i].lName + "=") {
+ found = true;
+ flags[i].strVal = arg.substr(3 + flags[i].lName.size(), arg.size());
+ if (flags[i].type == FT_INT) flags[i].intVal = flags[i].strVal.toInt();
+ }
+ }
+ }
+ if (!found) outvt << "Unknown option : " << arg << "\n";
+ } else {
+ for (u32int j = 1; j < arg.size(); j++) {
+ bool found = false;
+ for (u32int k = 0; k < flags.size(); k++) {
+ if (flags[k].sName == arg[j]) {
+ found = true;
+ if (flags[k].type == FT_BOOL) flags[k].boolVal = true;
+ if (flags[k].type == FT_INT) flags[k].intVal = pr.argv(++i).toInt();
+ if (flags[k].type == FT_STR) flags[k].strVal = pr.argv(++i);
+ break;
+ }
+ }
+ if (!found) {
+ outvt << "Unknown option : -" << String(arg[j]) << "\n";
+ exit(-1);
+ }
+ }
+ }
+ } else {
+ args.push(arg);
+ }
+ }
+
+ //Eventually show help screen
+ if (bFlag("help")) {
+ outvt << appName << ": " << appDesc << "\n";
+ outvt << "Usage: \t" << appName << " <flags> [-] <arguments>\n\n";
+ outvt << "Possible flags :\n";
+ for (u32int i = 0; i < flags.size(); i++) {
+ outvt << " --" << flags[i].lName << "\t" << (flags[i].sName != 0 ? "-" : "") << String(flags[i].sName) << "\t";
+ if (flags[i].type == FT_STR) outvt << "Default: " << flags[i].strVal << "\n";
+ if (flags[i].type == FT_INT) outvt << "Default: " << flags[i].intVal << "\n";
+ if (flags[i].type == FT_BOOL) outvt << "Default: " << (flags[i].boolVal && flags[i].lName != "help" ? "on" : "off") << "\n";
+ if (!flags[i].desc.empty()) outvt << "\t" << flags[i].desc << "\n";
+ outvt << "\n";
+ }
+ exit(0);
+ }
+}
+
+//******************** FLAG HANDLING *****************
+
+flag_t *ShellApp::getFlag(String name) {
+ for (u32int i = 0; i < flags.size(); i++) {
+ if (flags[i].lName == name) return &flags[i];
+ }
+ return NULL;
+}
+
+void ShellApp::addFlag(WChar sName, String lName, String desc, int type, String deflt) {
+ if (lName.empty()) return;
+ if (getFlag(lName) != false) return;
+ flag_t temp;
+ temp.sName = sName;
+ temp.lName = lName;
+ temp.type = type;
+ temp.desc = desc;
+ if (type == FT_BOOL) {
+ temp.boolVal = !deflt.empty();
+ } else if (type == FT_STR) {
+ temp.strVal = deflt;
+ } else if (type == FT_INT) {
+ temp.intVal = deflt.toInt();
+ }
+ flags.push(temp);
+}
+
+String ShellApp::sFlag(String name) {
+ flag_t* f = getFlag(name);
+ if (f == 0) return "";
+ if (f->type != FT_STR) return "";
+ return f->strVal;
+}
+
+int ShellApp::iFlag(String name) {
+ flag_t* f = getFlag(name);
+ if (f == 0) return 0;
+ if (f->type != FT_INT) return 0;
+ return f->intVal;
+}
+
+bool ShellApp::bFlag(String name) {
+ flag_t *f = getFlag(name);
+ if (f == 0) return false;
+ if (f->type != FT_BOOL) return false;
+ return f->boolVal;
+}