fix: shell cmds with args where not called the most efficient way and ARRAY_SIZE wasnt right
This commit is contained in:
parent
484e013ceb
commit
a64262ee13
@ -1,6 +1,6 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
void stack_cmd(char arg)
|
void stack_cmd(char *arg)
|
||||||
{
|
{
|
||||||
(void)arg;
|
(void)arg;
|
||||||
print_stack();
|
print_stack();
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "terminal.h"
|
#include "terminal.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
#define BORDER "==========================================================="
|
#define BORDER "==========================================================="
|
||||||
#define HEADER "Welcome to bozOShell - Available Commands"
|
#define HEADER "Welcome to bozOShell - Available Commands"
|
||||||
@ -14,27 +15,22 @@ struct shell_command {
|
|||||||
char name[16];
|
char name[16];
|
||||||
char description[256];
|
char description[256];
|
||||||
void (*fn)(char *arg);
|
void (*fn)(char *arg);
|
||||||
uint8_t name_len;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ARRAY_SIZE(array) sizeof(array) / sizeof(array[0])
|
const struct shell_command cmds[] = {
|
||||||
#define COMMAND_ADDER(name, description, function) \
|
{"help", "Print this help menu", help_cmd},
|
||||||
{name, description, function, ARRAY_SIZE(name) - 1}
|
{"reboot", "Reboot the system", reboot_cmd},
|
||||||
|
{"poweroff", "Shut down the system", poweroff_cmd},
|
||||||
const struct shell_command commands[] = {
|
{"halt", "Stop all CPU functions", halt_cmd},
|
||||||
COMMAND_ADDER("help", "Print this help menu", help_cmd),
|
{"stack", "Print the stack trace", stack_cmd},
|
||||||
COMMAND_ADDER("reboot", "Reboot the system", reboot_cmd),
|
{"heap", "Print the heaps", heap_cmd},
|
||||||
COMMAND_ADDER("poweroff", "Shut down the system", poweroff_cmd),
|
{"clear", "Clear the current terminal", clear_cmd},
|
||||||
COMMAND_ADDER("halt", "Stop all CPU functions", halt_cmd),
|
{"date", "Display the current time and date", date_cmd},
|
||||||
COMMAND_ADDER("stack", "Print the stack trace", stack_cmd),
|
{"merdella", "Surprise", merdella_cmd},
|
||||||
COMMAND_ADDER("heap", "Print the heaps", heap_cmd),
|
{"color", "Change the screen color", color_cmd},
|
||||||
COMMAND_ADDER("clear", "Clear the current terminal", clear_cmd),
|
|
||||||
COMMAND_ADDER("date", "Display the current time and date", date_cmd),
|
|
||||||
COMMAND_ADDER("merdella", "Surprise", merdella_cmd),
|
|
||||||
COMMAND_ADDER("color", "Change the screen color", color_cmd),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NB_CMDS (sizeof(commands) / sizeof(commands[0]))
|
#define NB_CMDS ARRAY_SIZE(cmds)
|
||||||
|
|
||||||
extern struct screen *screen;
|
extern struct screen *screen;
|
||||||
|
|
||||||
@ -48,11 +44,10 @@ void help_cmd(char *arg)
|
|||||||
kprintf("%s\n", BORDER);
|
kprintf("%s\n", BORDER);
|
||||||
|
|
||||||
for (size_t i = 0; i < NB_CMDS; i++) {
|
for (size_t i = 0; i < NB_CMDS; i++) {
|
||||||
kprintf(" %s", commands[i].name);
|
kprintf(" %s", cmds[i].name);
|
||||||
for (size_t j = 0; j < (padding - strlen(commands[i].name));
|
for (size_t j = 0; j < (padding - strlen(cmds[i].name)); j++)
|
||||||
j++)
|
|
||||||
kprintf(" ");
|
kprintf(" ");
|
||||||
kprintf(": %s\n", commands[i].description);
|
kprintf(": %s\n", cmds[i].description);
|
||||||
}
|
}
|
||||||
|
|
||||||
kprintf("%s\n", BORDER);
|
kprintf("%s\n", BORDER);
|
||||||
@ -65,9 +60,9 @@ static void auto_complete(void)
|
|||||||
const char *last_match;
|
const char *last_match;
|
||||||
|
|
||||||
for (size_t i = 0; i < NB_CMDS; i++) {
|
for (size_t i = 0; i < NB_CMDS; i++) {
|
||||||
if (!strncmp(screen->line, commands[i].name, len)) {
|
if (!strncmp(screen->line, cmds[i].name, len)) {
|
||||||
nb_matches++;
|
nb_matches++;
|
||||||
last_match = commands[i].name;
|
last_match = cmds[i].name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (nb_matches != 1)
|
if (nb_matches != 1)
|
||||||
@ -119,15 +114,12 @@ void shell_init()
|
|||||||
read_line();
|
read_line();
|
||||||
bool invalid = true;
|
bool invalid = true;
|
||||||
for (unsigned i = 0; i < NB_CMDS; i++) {
|
for (unsigned i = 0; i < NB_CMDS; i++) {
|
||||||
if (!strncmp(commands[i].name, screen->line,
|
if (!strncmp(cmds[i].name, screen->line,
|
||||||
commands[i].name_len)) {
|
strlen(cmds[i].name))) {
|
||||||
commands[i].fn(
|
char *args = strchr(screen->line, ' ');
|
||||||
screen->line + commands[i].name_len +
|
if (args)
|
||||||
(strlen(screen->line) >
|
args++; // skip the space
|
||||||
commands[i]
|
cmds[i].fn(args);
|
||||||
.name_len)); // "reboot " => arg = ""
|
|
||||||
// not " " and "reboot" =>
|
|
||||||
// "" without invalid read
|
|
||||||
invalid = false;
|
invalid = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user