codecrafters-shell-c

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 9d332950dd77f13f48c8bff595208b70c1139d9d
parent 2c285c8d56d5123400372bbfa919a17ea35351f9
Author: 5hif7y <[email protected]>
Date:   Tue, 31 Dec 2024 20:56:12 -0300

some fixes, args in dynamic memory, and adding win10 support

Diffstat:
Mapp/main.c | 50++++++++++++++++++++++++++++++++++++--------------
1 file changed, 36 insertions(+), 14 deletions(-)

diff --git a/app/main.c b/app/main.c @@ -2,7 +2,12 @@ #include <string.h> #include <stdbool.h> #include <stdlib.h> -#include <unistd.h> + +#ifdef _WIN32 + #define F_OK 0 +#else + #include <unistd.h> +#endif void parse_input(const char *input, char *cmd, char **args, int *argc); bool find_executable(const char *cmd, char *result_path); @@ -23,12 +28,12 @@ int main() { // Exit on error if(fgets(input, sizeof(input), stdin) == NULL){ - running = false; + running = false; } // remove \n int n = strlen(input); - if(n > 0 && input[n - 1] == '\n'){ + if (n > 0 && input[n - 1] == '\n'){ input[n - 1] = '\0'; } @@ -39,16 +44,17 @@ int main() { if(!strcmp(cmd, "exit")){ //printf("Exiting...\n"); running = false; - } else if(!strcmp(cmd, "echo")){ + } else if (!strcmp(cmd, "echo")){ for (int i = 0; i < argc; i++){ printf("%s ", args[i]); } printf("\n"); - } else if(!strcmp(cmd, "type")){ - if(argc > 0){ + } else if (!strcmp(cmd, "type")){ + if (argc > 0){ char path[512]; - if(!strcmp(args[0], "echo") || !strcmp(args[0], "exit") - || !strcmp(args[0], "type")){ + if (!strcmp(args[0], "echo") + || !strcmp(args[0], "exit") + || !strcmp(args[0], "type")){ printf("%s is a shell builtin\n", args[0]); } else if (find_executable(args[0], path)) { printf("%s is %s\n", args[0], path); @@ -59,8 +65,13 @@ int main() { printf("Usage: type [command]\n"); } } else { - printf("%s: command not found\n", input); + printf("%s: command not found\n", cmd); } + + //free mem + for (int i = 0; i < argc; i++){ + free(args[i]); + } } return 0; } @@ -74,13 +85,16 @@ void parse_input(const char *input, char *cmd, char **args, int *argc){ char *token = strtok(input_cpy, " "); if(token != NULL){ - strcpy(cmd, token); + strcpy(cmd, token); } *argc = 0; while((token = strtok(NULL, " ")) != NULL){ - args[*argc] = token; - (*argc)++; + args[*argc] = malloc(strlen(token) + 1); + if (args[*argc] != NULL) { + strcpy(args[*argc], token); + (*argc)++; + } } args[*argc] = NULL; @@ -104,11 +118,19 @@ bool find_executable(const char *cmd, char *result_path){ char *dir = strtok(path_copy, &separator); while (dir != NULL){ snprintf(result_path, 512, "%s/%s", dir, cmd); - +#ifdef _WIN32 + const char *extensions[] = {".exe", NULL}; // Extension support list + for (const char **ext = extensions; *ext != NULL; ext++){ + snprintf(result_path, 512, "%s\\%s%s", dir, cmd, *ext); + if (access(result_path, F_OK) == 0){ + return true; + } + } +#else if(access(result_path, X_OK) == 0){ return true; } - +#endif dir = strtok(NULL, &separator); }