From e488abb90671880aadc9b15d029df4b3eea16712 Mon Sep 17 00:00:00 2001 From: bigsketti Date: Wed, 12 Feb 2025 00:44:45 -0500 Subject: [PATCH] refactored handleCommand() to be more modular --- cshell | Bin 17168 -> 17504 bytes src/cShell.c | 249 ++++++++++++++++++++++++++++---------------------- src/cShell.h | 5 +- src/history.h | 8 +- src/main.c | 2 + 5 files changed, 148 insertions(+), 116 deletions(-) diff --git a/cshell b/cshell index b261d70f9f7c4194eb4689f227b9fc96d4f22aad..776bf1b8114fdab5050921f9c8ebc8b5c5c504f7 100755 GIT binary patch delta 5345 zcmai24^)&@7JoA^pvb>L5C&0!qk^=cm?0p_K$>G^OL=TFa}{A!ia#=f)s~HkXtOK@ zz0J)wceh;Iw%t~fw&S`UqqRcHRyuZCx2%JwIy*F^W9o`!JNvuu-EV~PwELYibKkx9 zcYp8Q`|f++K*u&y|6`_(Y-@js2tIaEC}KN{vhw4@w9SyC7((W7d|qXLPY)vshY;Y+4a0;Q6XDiKOw~(cYtQ`UWRSpC_4z~dE3!$2}4mGo*wU+?*f6=?qpj2$Z!^mSw)yv^WMfo+zTtU|1D#MO5rV3khy z0BS6}omYb#EraRTbXrUIDBW$%QyguUuIs1}Zyd}-=wXTnU6!V+^d@6E-!ip&jzY;2 zz~9>4WCbvj%e)sRUp{bX5>?j6zd<%HAX_vKdfYtBbpz!{E#)zH$kVp5Zf0&z`aq@q zA#IBtgbojmMa!lk(M(hQh3iy6Q^mn>kPQnkl~K-?!FZJ}wSuNS9H71fV=Q32>c=?J z2a_+(4Xy^Zd~^AKaS_b{Aed$u2klWbV422-SN|`|{;Mom6F6$6LGu}|N1CdhXsAN+ zlcW^)C1s_H0v~vPhBAJC+WLxki~8FPiWQ8>SnD@<7>MSDj#h=rSu-~I@*(p6ha+?5?Z?lr>ZAo!4Nh^ z_|gHwfkF?oTdWHBw!Rq>aZ!k(|Qeuc}e@BzOL?! zlNeFZBhi}83tgSE=NP*El021?7PDQcimU#TwAikXTc|9&h#y>%3vESrzwvLiY(Bl? zu++0$&>nbH@A*ooI}Xz;n>KbjMc`aTkQGU`Ti)Y{r^v%S|KLUWk!^zGnTuSNmQ8+2 zv)!_f!4&}e$_O6!ntg0ZUb7kfL%}WGV`-WSic|&c@m{znOH-39yI|^-t5Q?thSUq| zxI^{vSaAVt6CLfXo7HVZFWoh|skDDC{EoJyHItD;d#fLyU_PtKg?v`B1KT=Bg{soc zx*(5_FP(n~QxD7tpbs2vtrcpkd%St)xkA{sp=!r3T79ez^M>)|i5ieIO7J=&rsm@h*Vg>k9<3p?~%j zY6BT_CJ{RKYL7!shD`DY0`no4LRLdM&LJK$ z;cLX3#X`}5!J9Cgg8Uq^4wVbXb@?geWXPqoIgs~2u7j+Cd<^nl$QL0SA&-X1)mc+* z{m4Q60-PTij}+9e&RLL!^0}-m_fBM%iU~wnZ2UI!jWH2nN#^LtQ6dedhw+hvfj|yq z(C;L#t`6O^yWo!nKNqlw;2Hb%?!vW^sCZw`XrORYuWV2O<^-<%$Bd1C&~&-xQx#KNm#t-m!ACG@EEZ;RUXW*H^-P|&dloQ z81efA&5~-C&&RQB3Ho9m_C)o7wY@6%4H1pl4{azKp2@KPtQu8 za2>pq>ETpuR_%jfG3@Esn6ais^3hqz`FBFMin!okmUyG7$I0ZD@$BzfI?;EfkH(Osdv#nhKIFcLAx&mha-2 z8ZWER#9NG? z$jPcp5BB54o7oSq6{QwsI>Pwx#(9pqaeUW11yQD`s=Dfx`dund%-)_zs`G)GCP4#! z_sV63(=1SHH^|L}2ULW970cO01(BMdTHaf+UnezYLQn{-{f?ym&c1AiLP&Ga^{tlFUoDITq|#x z(<+b8u_V!f!CtB-_@50qtt2ZW54Pdn4&+IXAt%eml1Vly25r5;5&Ykd9GH{kUIY(* zX*C$$KISka{bHfVxB`uuYO4@SFu*NQP{L1-u{?vtkn7?5&#?H-9B)WF1>*@_p0?so1^lt3{ugBsb~Aw? z{fsmg5R#wpaC|xAjF*KW?MzJZbcjaAqcBo-&MTEO!o%eU^GZxRrL}ZYSshh;*b{O} z#INC_VpCT17;gbX#!zFJ_Q=lCNv2QbE2WcUMd>J;k>WM~A0xEvD~(^gk1usYrt#+L zS*|YL(BHyfc!Q4khn}>~94j}M#LEi%i>8RK%l7+C=93Z9RbCKvbT%`D%l+jAqmRzf L>NwdrchY|WuI?;a delta 4308 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 -#include -#include -#include -#include -#include -#include -#include - #include "cShell.h" -// TODO: research tab completion, very big quality of life feature +// TODO: research tab completion + +// command prototypes so handleCommand() works +// built in commands are prefixed with "cmd_" +void cmd_exit(); +void cmd_help(); +void cmd_version(); +void cmd_cd(char **args, char **cwd, char **trimmedCWD); +void cmd_mkfile(char **args); +void cmd_mkdir(char **args); +void cmd_rmfile(char **args); +void cmd_rmdir(char **args); +void cmd_ls(char **args); +void cmd_mode(char **args); +void printClamShell(); +char *trimCWD(char *cwd); +void execute(char **args); +void parseInput(char *input, char **args); +char* getCWD(); +void listDirectorys(const char *path); void handleCommand(char **args, char **cwd, char **trimmedCWD) { if (args[0] == NULL) { return; } - + if (strcmp("exit", args[0]) == 0) { - exit(0); - } - - if (strcmp("help", args[0]) == 0) { - printf("Welcome to cShell, my shitty terminal written in C\n\n"); + 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(); - printf( - "\nBuilt-in commands:\n" - "\texit\n" - "\thelp\n" - "\tversion\n" - "\tgenerate_clam\n" - "\tcd \n" - "\tmkdir \n" - "\trmdir \n" - "\tmkfile \n" - "\trmfile \n" - "\tls \n" - "\tmode <-arg>\n" - "\t\tnormal mode: -n\n" - "\t\tevil mode: -e\n" - "\t\thacker mode: -h\n\n" - ); return; + } else { + execute(args); } +} - if (strcmp("version", args[0]) == 0) { - printf("cShell version: %f\n", VERSION); - return; - } +void cmd_help() { + printf("Welcome to cShell, my shitty terminal written in C\n\n"); + printClamShell(); + printf( + "\nBuilt-in commands:\n" + "\texit\n" + "\thelp\n" + "\tversion\n" + "\tgenerate_clam\n" + "\tcd \n" + "\tmkdir \n" + "\trmdir \n" + "\tmkfile \n" + "\trmfile \n" + "\tls \n" + "\tmode <-arg>\n" + "\t\tnormal mode: -n\n" + "\t\tevil mode: -e\n" + "\t\thacker mode: -h\n\n" + ); +} - if (strcmp("cd", args[0]) == 0) { - if (args[1] == NULL) { - fprintf(stderr, "Missing argument for command \"cd\"\n"); +void cmd_exit() { + exit(0); +} + +void cmd_version() { + printf("cShell version: %f\n", VERSION); +} + +void cmd_cd(char **args, char **cwd, char **trimmedCWD) { + if (args[1] == NULL) { + fprintf(stderr, "Missing argument for command \"cd\"\n"); + } else { + if (chdir(args[1]) != 0) { + perror("chdir failed\n"); } else { - if (chdir(args[1]) != 0) { - perror("chdir failed\n"); - } else { - free(*cwd); - *cwd = getCWD(); - *trimmedCWD = trimCWD(*cwd); - } + free(*cwd); + *cwd = getCWD(); + *trimmedCWD = trimCWD(*cwd); } - return; } +} - if (strcmp("mkfile", args[0]) == 0) { - FILE *file = fopen(args[1], "w"); +void cmd_mkfile(char **args) { + FILE *file = fopen(args[1], "w"); if (file == NULL) { perror("Error making file"); } else { printf("success\n"); } +} + +void cmd_mkdir(char **args) { + if (mkdir(args[1], 0777) != 0) { + perror("Error making directory"); + } else { + printf("success\n"); + } +} + +void cmd_rmfile(char **args) { + if (remove(args[1]) != 0) { + perror("Error removing file"); + } else { + printf("success\n"); + } +} + +void cmd_rmdir(char **args) { + if (rmdir(args[1]) != 0) { + perror("Error removing directory"); + } else { + printf("success\n"); + } +} + +void cmd_ls(char **args) { + const char *path = args[1] ? args[1] : "."; + listDirectorys(path); +} + +void cmd_mode(char **args) { + if (strcmp("-h", args[1]) == 0) { + printf("\033[32m"); + printf("Hacker mode activated\n"); + return; + } else if (strcmp("-e", args[1]) == 0) { + printf("\033[31m"); + printf("Evil mode activated\n"); + return; + } else if (strcmp("-n", args[1]) == 0) { + printf("\033[0m"); + printf("Normal mode activated\n"); + return; + } else { + printf("Invalid arguement, type \"help\" for help\n"); return; } - - if (strcmp("mkdir", args[0]) == 0) { - if (mkdir(args[1], 0777) != 0) { - perror("Error making directory"); - } else { - printf("success\n"); - } - return; - } - - if (strcmp("rmfile", args[0]) == 0) { - if (remove(args[1]) != 0) { - perror("Error removing file"); - } else { - printf("success\n"); - } - return; - } - - if (strcmp("rmdir", args[0]) == 0) { - if (rmdir(args[1]) != 0) { - perror("Error removing directory"); - } else { - printf("success\n"); - } - return; - } - - if (strcmp("ls", args[0]) == 0) { - const char *path = args[1] ? args[1] : "."; - listDirectorys(path); - return; - } - - if (strcmp("mode", args[0]) == 0) { - if (strcmp("-h", args[1]) == 0) { - printf("\033[32m"); - printf("Hacker mode activated\n"); - return; - } else if (strcmp("-e", args[1]) == 0) { - printf("\033[31m"); - printf("Evil mode activated\n"); - return; - } else if (strcmp("-n", args[1]) == 0) { - printf("\033[0m"); - printf("Normal mode activated\n"); - return; - } else { - printf("Invalid arguement, type \"help\" for help\n"); - return; - } - } - - if (strcmp("generate_clam", args[0]) == 0) { - printClamShell(); - return; - } - - // execute the external command - execute(args); } void printClamShell() { diff --git a/src/cShell.h b/src/cShell.h index 3ff3255..98d829c 100644 --- a/src/cShell.h +++ b/src/cShell.h @@ -1,3 +1,6 @@ +#ifndef CSHELL_H +#define CSHELL_H + #include #include #include @@ -7,8 +10,6 @@ #include #include -#ifndef CSHELL_H -#define CSHELL_H #define INPUT_SIZE 1024 #define VERSION 0.1f diff --git a/src/history.h b/src/history.h index a5e8977..7f29544 100644 --- a/src/history.h +++ b/src/history.h @@ -3,9 +3,9 @@ char* history[500]; -void createHistoryDir() {}; -void initHistory() {}; -void writeHistory() {}; -void accessHistory() {}; +void createHistoryDir() {}; // create history in /home/user/cshell_history +void initHistory() {}; // read history from file on start +void writeHistory() {}; // write history at end of session +void accessHistory() {}; // handle user up arrow key to history #endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index b93a584..7ccb094 100644 --- a/src/main.c +++ b/src/main.c @@ -22,6 +22,8 @@ int main() { parseInput(input, args); + // capture input here and add to history + handleCommand(args, &cwd, &trimmedCWD); } free(cwd);