From f3b30bbb9ac6b8899e5cceb54ee1152d51a45ddb Mon Sep 17 00:00:00 2001 From: xamidev Date: Fri, 9 Aug 2024 11:49:47 +0200 Subject: [PATCH] Add: argument handling & PoC: echo command --- iso/boot/kernel.elf | Bin 26400 -> 30624 bytes src/kernel/shell.c | 31 ++++++++++++++++++------ src/libc/stdint.h | 2 ++ src/libc/string.c | 51 ++++++++++++++++++++++++++++++++++++++++ src/libc/string.h | 1 + src/programs/misc.c | 19 ++++++++++++++- src/programs/programs.h | 1 + 7 files changed, 97 insertions(+), 8 deletions(-) diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 519ef6b899c1ab9da65771391d3ba676e56a2254..4abba8b26bf7dae3e1c05f7b97c2784000d56b56 100755 GIT binary patch delta 9399 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 ", 9); get_input(input_buffer, BUFFER_SIZE); puts("\n"); + + int argc = parse_input(input_buffer, argv, MAX_ARGS); - if (strcmp(input_buffer, "") == 0) { - continue; - } + if (argc == 0) continue; - command_func_t command = find_command(input_buffer); + command_func_t command = find_command(argv[0]); if (command) { - command(); + command(argc, argv); } else { - printf("Unknown command %s\n", input_buffer); + printf("Unknown command %s\n", argv[0]); } } } diff --git a/src/libc/stdint.h b/src/libc/stdint.h index 1da6019..657cf76 100644 --- a/src/libc/stdint.h +++ b/src/libc/stdint.h @@ -17,4 +17,6 @@ typedef uint8_t bool; #define true 1 #define false 0 +#define NULL ((void*)0) + #endif diff --git a/src/libc/string.c b/src/libc/string.c index 3e2de92..5c79755 100644 --- a/src/libc/string.c +++ b/src/libc/string.c @@ -1,3 +1,5 @@ +#include "stdint.h" + int strlen(const char* str) { int len = 0; @@ -17,3 +19,52 @@ int strcmp(const char* str1, const char* str2) } return *(const unsigned char*)str1 - *(const unsigned char*)str2; } + +char* strchr(const char* str, int c) +{ + while (*str) + { + if (*str == (char)c) + { + return (char*)str; + } + str++; + } + if (c == '\0') + { + return (char*)str; + } + return NULL; +} + +char* strtok(char* str, const char* delimiter) +{ + static char* last; + if (str) + { + last = str; + } else { + str = last; + } + + if (!str || *str == '\0') + { + return NULL; + } + + char* token_start = str; + while (*str && !strchr(delimiter, *str)) + { + str++; + } + + if (*str) + { + *str = '\0'; + last = str + 1; + } else { + last = NULL; + } + + return token_start; +} diff --git a/src/libc/string.h b/src/libc/string.h index 0f64804..384507e 100644 --- a/src/libc/string.h +++ b/src/libc/string.h @@ -3,5 +3,6 @@ int strlen(const char* str); int strcmp(const char* str1, const char* str2); +char* strtok(char* str, const char* delimiter); #endif diff --git a/src/programs/misc.c b/src/programs/misc.c index 7b3c959..0fa54ac 100644 --- a/src/programs/misc.c +++ b/src/programs/misc.c @@ -2,6 +2,7 @@ #include "../libc/stdio.h" #include "../kernel/system.h" +#include "../libc/string.h" // Print a rainbow colorful text for testing @@ -44,10 +45,26 @@ void program_uptime() void program_help() { - printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\tbf\tuptime\n"); + printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\tbf\tuptime\techo\n"); } +// Panic + void program_panic() { asm volatile("int $0x13"); } + +// Output input + +void program_echo(int argc, char* argv[]) +{ + for (int i=1; i