aboutsummaryrefslogtreecommitdiff
path: root/smash/builtin.c
blob: a5bbd17610f9172b2676b15dbdd4021b0087db90 (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
93
94
95
96
97
98
99
#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 <nathan@nathanreiner.xyz>"
	);

	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