12 const os_char *dot = strrchr(file,
'.');
16 return !strcmp(dot + 1,
"mb");
20 assert(res &&
"NULL input");
23 struct args arguments;
31 if(arguments.
argc == 0) {
37 const char *name = arguments.
argv[0];
39 if(strcmp(name,
"help") == 0) {
41 }
else if(strcmp(name,
"list") == 0) {
43 }
else if(strcmp(name,
"date") == 0) {
45 }
else if(strcmp(name,
"time") == 0) {
47 }
else if(strcmp(name,
"stop") == 0) {
53 res->
val.proc_id = atoi(arguments.
argv[1]);
55 }
else if(strcmp(name,
"exit") == 0) {
57 }
else if(strcmp(name,
"cd") == 0) {
59 if(arguments.
argc != 2) {
63 const unsigned int len = strlen(arguments.
argv[1]);
64 res->
val.new_dir = malloc(len + 1);
65 memcpy(res->
val.new_dir, arguments.
argv[1], len);
66 res->
val.new_dir[len] =
'\0';
68 }
else if(strcmp(name,
"clear") == 0) {
70 }
else if(strcmp(name,
"set") == 0) {
71 if(arguments.
argc < 2 || arguments.
argc > 3) {
74 }
else if(arguments.
argc == 2) {
76 const unsigned int name_len = strlen(arguments.
argv[1]);
77 res->
val.env.name = malloc(name_len + 1);
78 memcpy(res->
val.env.name, arguments.
argv[1], name_len);
79 res->
val.env.name[name_len] =
'\0';
80 res->
val.env.val = NULL;
81 }
else if(arguments.
argc == 3) {
83 const unsigned int name_len = strlen(arguments.
argv[1]);
84 res->
val.env.name = malloc(name_len + 1);
85 memcpy(res->
val.env.name, arguments.
argv[1], name_len);
86 res->
val.env.name[name_len] =
'\0';
88 const unsigned int val_len = strlen(arguments.
argv[2]);
89 res->
val.env.val = malloc(val_len + 1);
90 memcpy(res->
val.env.val, arguments.
argv[2], val_len);
91 res->
val.env.val[val_len] =
'\0';
93 }
else if(strcmp(name,
"unset") == 0) {
94 if(arguments.
argc != 2) {
99 const unsigned int len = strlen(arguments.
argv[1]);
100 res->
val.env.name = malloc(len + 1);
101 memcpy(res->
val.env.name, arguments.
argv[1], len);
102 res->
val.env.name[len] =
'\0';
103 res->
val.env.val = NULL;
105 }
else if(strcmp(name,
"env") == 0) {
106 if(arguments.
argc == 1) {
108 }
else if(arguments.
argc == 2) {
110 const unsigned int len = strlen(arguments.
argv[1]);
111 res->
val.env.name = malloc(len + 1);
112 memcpy(res->
val.env.name, arguments.
argv[1], len);
113 res->
val.env.name[len] =
'\0';
114 res->
val.env.val = NULL;
119 }
else if(strcmp(name,
"kill") == 0) {
125 res->
val.proc_id = atoi(arguments.
argv[1]);
127 }
else if(strcmp(name,
"resume") == 0) {
133 res->
val.proc_id = atoi(arguments.
argv[1]);
135 }
else if(strcmp(name,
"child") == 0) {
141 res->
val.proc_id = atoi(arguments.
argv[1]);
143 }
else if(strcmp(name,
"addpath") == 0) {
144 if(arguments.
argc != 2) {
149 const size_t len = strlen(arguments.
argv[1]);
150 res->
val.new_path = (os_char *)malloc((len + 1) *
sizeof(os_char));
151 res->
val.new_path[len] =
'\0';
152 memcpy(res->
val.new_path, arguments.
argv[1], strlen(arguments.
argv[1]) *
sizeof(os_char));
154 }
else if(strcmp(name,
"delete") == 0) {
155 if(arguments.
argc > 2 || arguments.
argc < 2) {
161 const unsigned int dir_len = strlen(arguments.
argv[1]);
162 res->
val.filename = malloc(dir_len + 1);
163 memcpy(res->
val.filename, arguments.
argv[1], dir_len);
164 res->
val.filename[dir_len] =
'\0';
166 }
else if(strcmp(name,
"lsdir") == 0) {
167 if(arguments.
argc != 2) {
173 const unsigned int dir_len = strlen(arguments.
argv[1]);
174 res->
val.dir = malloc(dir_len + 1);
175 memcpy(res->
val.dir, arguments.
argv[1], dir_len);
176 res->
val.dir[dir_len] =
'\0';
179 if(arguments.
argc != 1) {
197 free(obj->
val.new_dir);
202 free(obj->
val.env.name);
203 free(obj->
val.env.val);
206 free(obj->
val.new_path);
209 free(obj->
val.filename);
void args_deep_copy_init(struct args *obj, const struct args *source)
Initialize the object by deep copying source
void args_destroy(struct args *obj)
bool args_init_from_str(struct args *obj, const os_char *input)
Build args from an input string.
void cmd_init_from_str(struct cmd *res, const char *str)
Build command from raw input.
void cmd_destroy(struct cmd *obj)
bool is_minibat_file(const os_char *file)
void format_usage(char *fmt,...)
Used format_xxx instead of printf and such for uniform output.
void format_error(char *fmt,...)
Used format_xxx instead of printf and such for uniform output.
Result after parsing an arbitrary string.
Resulting struct after parsing the input.
bool is_number(const char *c)