aboutsummaryrefslogtreecommitdiff
path: root/smash/builtin.c
blob: 63a4013b37c4577e5dbfefab221201b28e33511f (plain)
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