diff options
Diffstat (limited to 'src/user/app/yosh/main.cpp')
-rw-r--r-- | src/user/app/yosh/main.cpp | 217 |
1 files changed, 108 insertions, 109 deletions
diff --git a/src/user/app/yosh/main.cpp b/src/user/app/yosh/main.cpp index fe3eeed..6277701 100644 --- a/src/user/app/yosh/main.cpp +++ b/src/user/app/yosh/main.cpp @@ -5,8 +5,6 @@ #include <readline.h> #include <IO/IOStream.h> -using namespace libc; - FILE cwd_f; char *cwd; @@ -14,26 +12,26 @@ void about() { stdio << "Trivial/Computing Environment v0.1.0 - yosh 3.\n"; } -void help(char *args[]) { - if (args[1] == 0) { +void help(String *args) { + if (!args[1]) { stdio << "Available commands: about, help, exit, ls, cd, goto.\n"; - } else if (strcmp(args[1], "about") == 0) { + } else if (args[1] == "about") { stdio << "Usage:\tabout\nShows some info about yosh. Very usefull.\n"; - } else if (strcmp(args[1], "help") == 0) { + } else if (args[1] == "help") { stdio << "Usage:\thelp\n\thelp <command>\n" << "Shows some info about the command you want, or commands in general.\n"; - } else if (strcmp(args[1], "exit") == 0) { + } else if (args[1] == "exit") { stdio << "Usage:\texit\n" << "Exits the shell.\nWill probably make your system panic if you only have a shell running.\n"; - } else if (strcmp(args[1], "cd") == 0) { + } else if (args[1] == "cd") { stdio << "Usage:\tcd <location>\nGoes to the location specified.\n"; - } else if (strcmp(args[1], "ls") == 0) { + } else if (args[1] == "ls") { stdio << "Usage:\tls\n\tls <location>...\nShows the content of the current/specified directory.\n"; - } else if (strcmp(args[1], "goto") == 0) { + } else if (args[1] == "goto") { stdio << "Usage:\tgoto <vt name>\nSwitchs focus to specified virtual terminal.\n" << "Type `ls /.ui` to see available terminals.\n"; } else { - stdio.printf("No such command: %s\n", args[1]); + stdio.printf("No such command: %s\n", args[1].c_str()); } } @@ -52,14 +50,14 @@ void simplify_path(char* p) { } } else { *it = 0; - if (strcmp(member, ".") == 0) { + if (libc::strcmp(member, ".") == 0) { char *i = member; while (1) { i[0] = i[2]; if (i[0] == 0) break; i++; } - } else if (strcmp(member, "..") == 0) { + } else if (libc::strcmp(member, "..") == 0) { *it = '/'; char* start = member - 2; char* next = member + 3; @@ -86,28 +84,28 @@ void simplify_path(char* p) { } } -char* path_cat (char* a, char* b, int trailing_slash) { +char* path_cat (char* a, char* b, bool trailing_slash = true) { char* ret; if (b[0] == '/') { - int lb = strlen(b); + int lb = libc::strlen(b); ret = (char*)malloc(lb + 2); - memcpy(ret, b, lb); + libc::memcpy(ret, b, lb); if (ret[lb - 1] != '/') { ret[lb] = '/'; lb++; } ret[lb] = 0; } else { - int la = strlen(a); - int lb = strlen(b); + int la = libc::strlen(a); + int lb = libc::strlen(b); ret = (char*)malloc(la + lb + 3); - memcpy(ret, a, la); + libc::memcpy(ret, a, la); if (ret[la-1] != '/') { ret[la] = '/'; la++; } - memcpy(ret + la, b, lb); + libc::memcpy(ret + la, b, lb); if (ret[la + lb - 1] != '/') { ret[la + lb] = '/'; lb++; @@ -116,40 +114,40 @@ char* path_cat (char* a, char* b, int trailing_slash) { } simplify_path(ret); if (!trailing_slash) { - int l = strlen(ret); + int l = libc::strlen(ret); if (ret[l-1] == '/') ret[l-1] = 0; } return ret; } -void cd(char **args) { - if (args[1] == 0) { - print("Usage: cd <directory>\n"); +void cd(String *args) { + if (!args[1]) { + stdio << "Usage: cd <directory>\n"; } - if (strcmp(args[1], ".") == 0) return; + if (args[1] == ".") return; - char* newcwd = path_cat(cwd, args[1], 1); + char* newcwd = path_cat(cwd, args[1].c_str()); file_info info; - int i = stat(newcwd, &info); + int i = libc::stat(newcwd, &info); if (i == E_NOT_FOUND) { - print("No such file or directory.\n"); + stdio << "No such file or directory.\n"; free(newcwd); } else if (i < 0) { stdio.printf("Error stating: %i\n", i); free(newcwd); } else if ((info.type & FT_DIR) == 0) { - print("Not a directory.\n"); + stdio << "Not a directory.\n"; free(newcwd); } else { - FILE nf = open(newcwd, 0); + FILE nf = libc::open(newcwd, 0); if (nf < 0) { stdio.printf("Error opening: %i\n", nf); free(newcwd); } else { free(cwd); cwd = newcwd; - close(cwd_f); + libc::close(cwd_f); cwd_f = nf; } } @@ -159,57 +157,57 @@ void ls_dir(FILE f) { file_info info; int i = 0; char buf[256]; - while (read(f, i, 256, buf) > 0) { + while (libc::read(f, i, 256, buf) > 0) { i++; - if (strcmp(buf, ".") == 0 || strcmp(buf, "..") == 0) continue; + if (libc::strcmp(buf, ".") == 0 || libc::strcmp(buf, "..") == 0) continue; stdio.printf(" %s", buf); - stat_relative(f, buf, &info); - if (info.type & FT_DIR) print("/"); - print(" \t"); + libc::stat_relative(f, buf, &info); + if (info.type & FT_DIR) stdio << "/"; + stdio << " \t"; - if (info.type & FT_FILE) print("file "); - if (info.type & FT_DIR) print("dir "); - if (info.type & FT_SYMLINK) print("symlink "); - if (info.type & FT_DEV) print("dev "); - if (info.type & FT_TERMINAL) print("term "); + if (info.type & FT_FILE) stdio << "file "; + if (info.type & FT_DIR) stdio << "dir "; + if (info.type & FT_SYMLINK) stdio << "symlink "; + if (info.type & FT_DEV) stdio << "dev "; + if (info.type & FT_TERMINAL) stdio << "term "; - print("\t"); + stdio << "\t"; if (info.type & FT_TERMINAL) { stdio.printf("%ix%i", info.size >> 16, info.size & 0xFFFF); } else if ((info.type & FT_DEV) == 0) { stdio.printf("%i", info.size); } - print("\n"); + stdio << "\n"; } } -void ls(char **args) { - if (args[1] == 0) { +void ls(String *args) { + if (!args[1]) { ls_dir(cwd_f); } else { int i; - for (i = 1; args[i] != 0; i++) { - stdio.printf("Contents of %s :\n", args[i]); - char* d = path_cat(cwd, args[i], 1); + for (i = 1; args[i]; i++) { + stdio.printf("Contents of %s :\n", args[i].c_str()); + char* d = path_cat(cwd, args[i].c_str()); file_info info; - int e = stat(d, &info); + int e = libc::stat(d, &info); if (e == E_NOT_FOUND) { - print(" No such file or directory\n"); + stdio << " No such file or directory\n"; } else if (e < 0) { stdio.printf(" Error stating: %i\n", e); } else if ((info.type & FT_DIR) == 0) { stdio.printf(" Not a directory.\n"); } else { - FILE ff = open(d, 0); + FILE ff = libc::open(d, 0); if (ff < 0) { stdio.printf(" Error opening: %i\n", ff); } else { ls_dir(ff); - close(ff); + libc::close(ff); } } free(d); @@ -217,12 +215,12 @@ void ls(char **args) { } } -void cat(char **args) { +void cat(String *args) { int i; - for (i = 1; args[i] != 0; i++) { - char *d = path_cat(cwd, args[i], 0); + for (i = 1; args[i]; i++) { + char *d = path_cat(cwd, args[i].c_str(), false); file_info info; - int e = stat(d, &info); + int e = libc::stat(d, &info); if (e == E_NOT_FOUND) { stdio.printf("No such file: %s\n", d); } else if (e < 0) { @@ -230,37 +228,37 @@ void cat(char **args) { } else if ((info.type & FT_FILE) == 0) { stdio.printf("Not a file: %s\n", d); } else { - FILE ff = open(d, 0); + FILE ff = libc::open(d, 0); char* buff = (char*)malloc(info.size); - read(ff, 0, info.size, buff); - close(ff); - write(term, 0, info.size, buff); + libc::read(ff, 0, info.size, buff); + libc::close(ff); + libc::write(stdio.term->fd, 0, info.size, buff); free(buff); } } } -void t_goto(char** args) { - if (args[1] == 0) { - print("Usage: goto <vt_name>\n"); +void t_goto(String *args) { + if (!args[1]) { + stdio << "Usage: goto <vt_name>\n"; return; } - char* p = path_cat("/.ui/", args[1], 0); + char* p = path_cat("/.ui/", args[1].c_str(), false); int i; - if ((i = link(p, "/.dev/vgatxt", LM_OUTPUT_TO)) == 0) { - link("/.dev/ps2kbd", p, LM_OUTPUT_TO); + if ((i = libc::link(p, "/.dev/vgatxt", LM_OUTPUT_TO)) == 0) { + libc::link("/.dev/ps2kbd", p, LM_OUTPUT_TO); } else { stdio.printf("Error %i\n", i); } } -int Main(char **sh_args) { +int Main(String *sh_args) { about(); - cwd = strdup("/"); - cwd_f = open(cwd, 0); + cwd = libc::strdup("/"); + cwd_f = libc::open(cwd, 0); - char *path = path_cat(sh_args[0], "..", 1); + char *path = path_cat(sh_args[0].c_str(), ".."); int bg_pr[128], bg_pr_c = 0; @@ -273,70 +271,73 @@ int Main(char **sh_args) { while (1) { stdio.printf("\x1b[33m %s \x1b[1m", cwd); - char *s = term->readline(); + String s = term->readline(); stdio.printf("\x1b[0m"); - if (s == 0) return -1; - if (*s == 0) continue; - - char *c_args[16] = {0}, *cmd; - c_args[0] = s; - int argc = 1; - for (cmd = s; *cmd != 0; cmd++) { - if (*cmd == ' ') { - *cmd = 0; - if (cmd[1] != ' ' && cmd[1] != 0) { - c_args[argc] = cmd + 1; + if (s.size() == 0) continue; + + String c_args[16]; + int argc = 0, start = 0; + for (int i = 0; i < s.size(); i++) { + if (s[i] == ' ') { + if (start == i) { + start++; + } else { + c_args[argc] = s.substr(start, i - start); argc++; - if (argc == 15) break; + start = i + 1; + if (argc == 15) { + break; + } } } } + c_args[argc++] = s.substr(start, s.size() - start); - if (strcmp(c_args[0], "about") == 0) { + if (c_args[0] == "about") { about(); - } else if (strcmp(c_args[0], "help") == 0) { + } else if (c_args[0] == "help") { help(c_args); - } else if (strcmp(c_args[0], "exit") == 0) { - print("Exiting the shell. See you later!\n"); + } else if (c_args[0] == "exit") { + stdio << "Exiting the shell. See you later!\n"; break; - } else if (strcmp(c_args[0], "cd") == 0) { + } else if (c_args[0] == "cd") { cd(c_args); - } else if (strcmp(c_args[0], "ls") == 0) { + } else if (c_args[0] == "ls") { ls(c_args); - } else if (strcmp(c_args[0], "goto") == 0) { + } else if (c_args[0] == "goto") { t_goto(c_args); - } else if (strcmp(c_args[0], "cat") == 0) { + } else if (c_args[0] == "cat") { cat(c_args); } else { FILE vt = term->fd; char *t = 0; - if (strcmp(c_args[0], "on") == 0) { - if (c_args[1] == 0 || c_args[2] == 0) { + String *first_arg = c_args + 1; + + if (c_args[0] == "on") { + if (!c_args[1] || !c_args[2]) { stdio.printf("Usage:\ton <vt> <command>\n"); continue; } - t = path_cat("/.ui/", c_args[1], 0); - vt = open(t, 0); + t = path_cat("/.ui/", c_args[1].c_str(), false); + vt = libc::open(t, 0); if (vt < 0 || vt == term->fd) { stdio.printf("Error: cannot open terminal %s (%i)\n", t, vt); free(t); continue; } - int i = 0; - while (1) { - c_args[i] = c_args[i+2]; - if (c_args[i] == 0) break; - i++; - } + first_arg += 2; } char *c; - if (strchr(c_args[0], '/')) { - c = path_cat(cwd, c_args[0], 0); + if (libc::strchr(c_args[0].c_str(), '/')) { + c = path_cat(cwd, c_args[0].c_str(), false); } else { - c = path_cat(path, c_args[0], 0); + c = path_cat(path, c_args[0].c_str(), false); } - int pid = run(c, c_args + 1, vt); + char *run_args[15] = {0}; + for (int i = 0; first_arg[i]; i++) run_args[i] = first_arg[i].c_str(); + + int pid = libc::run(c, run_args, vt); if (pid <= 0) { if (pid == E_NOT_FOUND) { stdio.printf("Error: no such file %s\n", c); @@ -345,7 +346,7 @@ int Main(char **sh_args) { } } else { if (vt == term->fd) { - int ret = waitpid(pid, 1); + int ret = libc::waitpid(pid, 1); stdio.printf("(yosh) child (pid %i) exited with status %i\n", pid, ret); } else { stdio.printf("(yosh) running on terminal %s, pid:%i\n", t, pid); @@ -356,11 +357,9 @@ int Main(char **sh_args) { free(c); } - for (; s < cmd; s++) if (*s == 0) *s = ' '; - int i = 0; while (i < bg_pr_c) { - int ret = waitpid(bg_pr[i], 0); + int ret = libc::waitpid(bg_pr[i], 0); if (ret != E_NOT_FINISHED) { stdio.printf("(yosh) child (pid %i) exited with status %i\n", bg_pr[i], ret); bg_pr_c--; |