From 828dd435725ea315abd2ea9875325ee3b17041a9 Mon Sep 17 00:00:00 2001 From: "Nathan P. Reiner" Date: Thu, 15 Dec 2022 18:20:33 +0100 Subject: did this while lecture (builtins, parsing, exec and env by stdlib) --- smash/builtin.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 smash/builtin.c (limited to 'smash/builtin.c') diff --git a/smash/builtin.c b/smash/builtin.c new file mode 100644 index 0000000..ad9c839 --- /dev/null +++ b/smash/builtin.c @@ -0,0 +1,86 @@ +#include "builtin.h" + +#include "../lib/sys/exit.h" +#include "../lib/cstr/cstr.h" +#include "../lib/sys/io.h" + +u64 __find_builtin_function_by_name(const char *name); + +int __builtin_fn_exit(int argc, const char **argv); +int __builtin_fn_cd(int argc, const char **argv); +int __builtin_fn_help(int argc, const char **argv); + +char *builtin_names[] = { + "exit", + "cd", + "help", + 0 +}; + +int (*builtin_functions[])(int argc, const char **argv) = { + __builtin_fn_exit, + __builtin_fn_cd, + __builtin_fn_help +}; + +int __builtin_fn_exit(int argc, const char **argv) +{ + exit(0); +} + +int __builtin_fn_cd(int argc, const char **argv) +{ + /* TODO: Implement */ +} + +int __builtin_fn_help(int argc, const char **argv) +{ + write(STDOUT_FD, "This is the help page...\n", 25); + write(STDOUT_FD, "TODO: help page\n", 16); + return 0; +} + +u64 __find_builtin_function_by_name(const char *name) +{ + char **p = builtin_names; + + while (*p) { + if (cstr_compare(*p, name) == 0) + return p - builtin_names; + ++p; + } + + return -1; + +} + +u8 has_builtin_with_name(const char *name) +{ + return __find_builtin_function_by_name(name) != -1; +} + +int run_builtin(const char *name, const char **argv) +{ + int argc = 0; + u64 builtin_index = __find_builtin_function_by_name(name); + const char **p = argv; + while (*p) { + ++argc; + ++p; + } + + return builtin_functions[builtin_index](argc, argv); +} + +#ifdef BUILTIN_UNIT_TEST + +int main() { + const char *argv[] = { "lelp", 0 }; + + if (has_builtin_with_name(argv[0])) + return run_builtin(argv[0], argv); + + return 0; +} + +#endif -- cgit v1.2.3-70-g09d2