From af81c0a0bc0de7c522c0914de10035ddb899c26b Mon Sep 17 00:00:00 2001 From: bigsketti Date: Wed, 12 Feb 2025 10:05:22 -0500 Subject: [PATCH] converted command handling to lookup table --- cshell | Bin 17504 -> 17824 bytes src/cShell.c | 76 ++++++++++++++++++++------------------------------- 2 files changed, 30 insertions(+), 46 deletions(-) diff --git a/cshell b/cshell index 776bf1b8114fdab5050921f9c8ebc8b5c5c504f7..48a7c7717e7a79f65dfb09a314f76470980e0500 100755 GIT binary patch delta 5161 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 Mk(pW=jml*I4-OE%(*OVf diff --git a/src/cShell.c b/src/cShell.c index fe648f1..ba9a561 100644 --- a/src/cShell.c +++ b/src/cShell.c @@ -1,7 +1,5 @@ #include "cShell.h" -// TODO: research tab completion - // command prototypes so handleCommand() works // built in commands are prefixed with "cmd_" void cmd_exit(); @@ -21,45 +19,38 @@ void parseInput(char *input, char **args); char* getCWD(); void listDirectorys(const char *path); +typedef struct { + char *name; + void (*func)(char **, char **, char **); +} Command; + +Command commands[] = { + {"exit", (void *)cmd_exit}, + {"help", (void *)cmd_help}, + {"version", (void *)cmd_version}, + {"cd", (void *)cmd_cd}, + {"mkfile", (void *)cmd_mkfile}, + {"mkdir", (void *)cmd_mkdir}, + {"rmfile", (void *)cmd_rmfile}, + {"rmdir", (void *)cmd_rmdir}, + {"ls", (void *)cmd_ls}, + {"mode", (void *)cmd_mode}, + {"clamgen", (void *)printClamShell}, + {NULL, NULL} +}; + void handleCommand(char **args, char **cwd, char **trimmedCWD) { if (args[0] == NULL) { return; } - - if (strcmp("exit", args[0]) == 0) { - cmd_exit(); - } else if (strcmp("help", args[0]) == 0) { - cmd_help(); - return; - } else if (strcmp("version", args[0]) == 0) { - cmd_version(); - return; - } else if (strcmp("cd", args[0]) == 0) { - cmd_cd(args, cwd, trimmedCWD); - return; - } else if (strcmp("mkfile", args[0]) == 0) { - cmd_mkfile(args); - return; - } else if (strcmp("mkdir", args[0]) == 0) { - cmd_mkdir(args); - return; - } else if (strcmp("rmfile", args[0]) == 0) { - cmd_rmfile(args); - return; - } else if (strcmp("rmdir", args[0]) == 0) { - - return; - } else if (strcmp("ls", args[0]) == 0) { - cmd_ls(args); - return; - } else if (strcmp("mode", args[0]) == 0) { - cmd_mode(args); - } else if (strcmp("generate_clam", args[0]) == 0) { - printClamShell(); - return; - } else { - execute(args); + + for (int i = 0; commands[i].name != NULL; i++) { + if (strcmp(args[0], commands[i].name) == 0) { + commands[i].func(args, cwd, trimmedCWD); + return; + } } + execute(args); } void cmd_help() { @@ -70,7 +61,7 @@ void cmd_help() { "\texit\n" "\thelp\n" "\tversion\n" - "\tgenerate_clam\n" + "\tclamgen\n" "\tcd \n" "\tmkdir \n" "\trmdir \n" @@ -180,15 +171,8 @@ void printClamShell() { } char *trimCWD(char *cwd) { - char *token = strtok(cwd, "/"); - char *trimmedCWD = NULL; - - while (token != NULL) { - trimmedCWD = token; - token = strtok(NULL, "/"); - } - - return trimmedCWD; + char *lastSlash = strrchr(cwd, '/'); + return lastSlash ? lastSlash + 1 : (char *)cwd; } void execute(char **args) {