#include "builtin.h" #include "../lib/sys/exit.h" #include "../lib/cstr/cstr.h" #include "../lib/sys/io.h" #include "../lib/sys/chdir.h" #include "../lib/io/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) { if (argc != 2) { wstd("cd [path]\n"); return -1; } return chdir(argv[1]); } int __builtin_fn_help(int argc, const char **argv) { wstdf("%s\n%s\n\n%s\n%s\n\n%s\n", "Welcome to smash [ \033[1msma\033[0mll \033[1msh\033[0mell ].", "\033[2mDon't blame me if it doesn't work, it's definitly a skill issue!\033[0m", "Syntax:", " command [args] | command [args] | ... | command [args]", "Author Nathan P. Reiner " ); 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