#include "builtin.h" #include "../lib/sys/exit.h" #include "../lib/cstr/cstr.h" #include "../lib/sys/io.h" #include "../lib/sys/chdir.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) { if (argc != 2) { write(STDOUT_FD, "path missing\n", 9); return -1; } return chdir(argv[1]); } 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