1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#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
|