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:
| M | app/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);
}