PatchworkOS
Loading...
Searching...
No Matches
builtin.c
Go to the documentation of this file.
1#include "builtin.h"
2
3#include <errno.h>
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include <sys/io.h>
8#include <sys/proc.h>
9
10static uint64_t builtin_cd(uint64_t argc, const char** argv);
11static uint64_t builtin_help(uint64_t argc, const char** argv);
12static uint64_t builtin_clear(uint64_t argc, const char** argv);
13
14static builtin_t builtins[] = {
15 {
16 .name = "cd",
17 .callback = builtin_cd,
18 .description = "Change the current working directory.",
19 .usage = "cd [directory]",
20 },
21 {
22 .name = "help",
23 .callback = builtin_help,
24 .description = "Show this help message.",
25 .usage = "help",
26 },
27 {
28 .name = "clear",
29 .callback = builtin_clear,
30 .description = "Clear the terminal screen.",
31 .usage = "clear",
32 },
33};
34
35static uint64_t builtin_cd(uint64_t argc, const char** argv)
36{
37 if (argc < 2)
38 {
39 chdir("/usr");
40 return 0;
41 }
42
43 if (chdir(argv[1]) == ERR)
44 {
45 fprintf(stderr, "cd: %s\n", strerror(errno));
46 return ERR;
47 }
48
49 return 0;
50}
51
52static uint64_t builtin_help(uint64_t argc, const char** argv)
53{
54 (void)argc;
55 (void)argv;
56
57 printf("\033[33mBUILTINS:\033[0m\n");
58 for (uint64_t i = 0; i < sizeof(builtins) / sizeof(builtins[0]); i++)
59 {
60 printf(" %-20s\033[0m \t\033[90m%s\033[0m\n", builtins[i].usage, builtins[i].description);
61 }
62
63 printf("\n\033[33mFEATURES:\033[0m\n");
64 printf(" command1 | command2\t\033[90mPipe output\033[0m\n");
65 printf(" command > file \t\033[90mRedirect standard output\033[0m\n");
66 printf(" command < file \t\033[90mRedirect standard input\033[0m\n");
67 printf(" command 2> file \t\033[90mRedirect standard error\033[0m\n");
68 printf("\n\033[33mKEYBINDINGS:\033[0m\n");
69 printf(" Back/Left/Right \t\033[90mEdit input\033[0m\n");
70 printf(" Up/Down \t\033[90mNavigate history\033[0m\n");
71 printf(" Ctrl+C \t\033[90mTerminate process\033[0m\n");
72
73 printf("\n\033[90mExternal commands are executed from /bin and /usr/bin.\033[0m\n");
74
75 return 0;
76}
77
78static uint64_t builtin_clear(uint64_t argc, const char** argv)
79{
80 (void)argc;
81 (void)argv;
82
83 printf("\033[2J\033[H");
84 return 0;
85}
86
87bool builtin_exists(const char* name)
88{
89 for (uint64_t i = 0; i < sizeof(builtins) / sizeof(builtins[0]); i++)
90 {
91 if (strcmp(name, builtins[i].name) == 0)
92 {
93 return true;
94 }
95 }
96
97 return false;
98}
99
100uint64_t builtin_execute(uint64_t argc, const char** argv)
101{
102 if (argc == 0)
103 {
104 return 0;
105 }
106
107 for (uint64_t i = 0; i < sizeof(builtins) / sizeof(builtins[0]); i++)
108 {
109 if (strcmp(argv[0], builtins[i].name) == 0)
110 {
111 builtins[i].callback(argc, argv);
112 return 0;
113 }
114 }
115
116 return ERR;
117}
static uint64_t builtin_help(uint64_t argc, const char **argv)
Definition builtin.c:52
uint64_t builtin_execute(uint64_t argc, const char **argv)
Definition builtin.c:100
static builtin_t builtins[]
Definition builtin.c:14
static uint64_t builtin_clear(uint64_t argc, const char **argv)
Definition builtin.c:78
static uint64_t builtin_cd(uint64_t argc, const char **argv)
Definition builtin.c:35
bool builtin_exists(const char *name)
Definition builtin.c:87
#define errno
Error number variable.
Definition errno.h:27
uint64_t chdir(const char *path)
System call for changing the cwd.
Definition chdir.c:9
#define ERR
Integer error value.
Definition ERR.h:17
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC int printf(const char *_RESTRICT format,...)
Definition printf.c:5
FILE * stderr
Definition std_streams.c:18
_PUBLIC int fprintf(FILE *_RESTRICT stream, const char *_RESTRICT format,...)
Definition fprintf.c:5
_PUBLIC char * strerror(int errnum)
Definition strerror.c:6
_PUBLIC int strcmp(const char *s1, const char *s2)
Definition strcmp.c:3
const char * name
Definition builtin.h:8
uint64_t(* callback)(uint64_t argc, const char **argv)
Definition builtin.h:11