From e635977c8829078dc130811f3ce04ee74e03a9ae Mon Sep 17 00:00:00 2001 From: adjoly Date: Mon, 11 Aug 2025 21:52:57 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D=20wip:?= =?UTF-8?q?=20parsing=20kinda=20working?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- includes/help.h | 48 +++++++++++++++++++++++++++++++------------- includes/opt_parse.h | 6 +++++- src/help.c | 31 +++++++++++++++++++++------- src/main.c | 13 +++++++++++- src/opt_parse.c | 46 ++++++++++++++++++++++++++---------------- 6 files changed, 105 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index d6428ba..0245f58 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ DEPS = $(SRCS:$(SRCDIR)/%.c=$(OBJSDIR)/%.d) # $(info OBJ $(OBJS)) # $(info SRC $(SRCS)) -FLAGS = -Wall -Werror -Wextra -MMD -MP -g +FLAGS = -MMD -MP -g RED = \033[0;31m GREEN = \033[0;32m diff --git a/includes/help.h b/includes/help.h index 5d84dc2..2a348a2 100644 --- a/includes/help.h +++ b/includes/help.h @@ -1,28 +1,48 @@ #pragma once +#include typedef struct { - char *name; - char opt; - char *doc; + char *name; + char opt; + char *doc; + uint8_t arg_nb; + uint8_t grp; } options_t; static options_t options[] = { - { - "help", - '?', - "give this help list" - }, - { - "verbose", - 'v', - "verbose output" - } +#define GRP 0 // AKA random useless sh*t + {"usage", 'u', "give a short usage message", 0, GRP}, + {"help", '?', "give this help list", 0, GRP}, + {"version", 'V', "print program version", 0, GRP}, +#undef GRP +#define GRP 1 // AKA mandatory + {"verbose", 'v', "verbose output", 0, GRP}, +#undef GRP +#define GRP 2 // AKA bonus + {"count", 'c', "stop after sending NUMBER packets (--count=NUMBER)", 1, + GRP}, + {"size", 's', "send NUMBER data octets (--size=NUMBER)", 1, GRP}, + {"timeout", 'w', "stop after N seconds (--timeout=N)", 1, GRP} +#undef GRP }; -#define OPT_NB 2 +#define OPT_NB 5 #define FT_PING_V 0.1 +#define OPT_WHILE \ + int i = 0; \ + while (i < OPT_NB) + +#define OPT_HANDLE(i) \ + if (options[i].arg_nb == 1) { \ + if (!(av + 1) || !*(av + 1)) { \ + return EX_USAGE; \ + } \ + args->arg[i] = *(av + 1); \ + } \ + args->opts[i] = true; + /** * @brief Can be used to print the help message if no host (or addr) are * provided diff --git a/includes/opt_parse.h b/includes/opt_parse.h index 58201ab..a856dbd 100644 --- a/includes/opt_parse.h +++ b/includes/opt_parse.h @@ -1,9 +1,13 @@ #pragma once +#include + +#include #include typedef struct { - bool verbose; + bool opts[OPT_NB]; + char *arg[OPT_NB]; } args_t; /** diff --git a/src/help.c b/src/help.c index 9f4c829..1e6d719 100644 --- a/src/help.c +++ b/src/help.c @@ -4,18 +4,35 @@ #include void print_help(void) { - uint16_t i = 0; - printf("Usage: ping [OPTION...] HOST ...\n"); printf("Send ICMP ECHO_REQUEST packets to network hosts.\n\n"); - while (i < OPT_NB) { - printf(" -%c, --%s:\t %s\n", options[i].opt, options[i].name, options[i].doc); + printf(" All the mandatory options : \n"); + OPT_WHILE { + if (options[i].grp == 1) + printf(" -%c, --%s:\t %s\n", options[i].opt, options[i].name, + options[i].doc); i++; } - printf("\nMandatory or optional arguments to long options are also mandatory " - "or optional\nfor any corresponding short options.\n\n"); - printf("Report bugs to (pls don't).\n"); + i = 0; + printf(" All the bonuses options : \n"); + while (i < OPT_NB) { + if (options[i].grp == 2) + printf(" -%c, --%s:\t %s\n", options[i].opt, options[i].name, + options[i].doc); + i++; + } + printf(" All the prints and help function : \n"); + while (i < OPT_NB) { + if (options[i].grp == 0) + printf(" -%c, --%s:\t %s\n", options[i].opt, options[i].name, + options[i].doc); + i++; + } + printf( + "\nMandatory or optional arguments to long options are also mandatory " + "or optional\nfor any corresponding short options.\n\n"); + printf("Report bugs to :D.\n"); } void print_no_host(char *av) { diff --git a/src/main.c b/src/main.c index d22a8b1..c5b54c9 100644 --- a/src/main.c +++ b/src/main.c @@ -6,6 +6,17 @@ #include #include +void init_args_t(args_t *args) { + OPT_WHILE { + args->opts[i] = false; + args->arg[i] = NULL; + } +} + +void handle_options(args_t *args) { + // TODO: need to make this function D: +} + int main(int ac, char **av) { args_t args; if (ac > 1) { @@ -15,7 +26,7 @@ int main(int ac, char **av) { else if (ret != EXIT_SUCCESS) return ret; else - return EXIT_SUCCESS; + handle_options(&args); } else { print_no_host(*av); return EX_USAGE; diff --git a/src/opt_parse.c b/src/opt_parse.c index 0cd1974..a81fd2f 100644 --- a/src/opt_parse.c +++ b/src/opt_parse.c @@ -4,36 +4,48 @@ #include #include +#include #include +int handle_long_args(char **av, args_t *args) { + OPT_WHILE { + if (strncmp((*av) + 2, options[i].name, strlen(options[i].name)) == 0) { + OPT_HANDLE(i) + } + i++; + } + return EXIT_SUCCESS; +} + int opt_parse(char **av, args_t *args) { char *exec_name = *av; - (void)args; while (*av != NULL) { char *a = *av; if (*a == '-') { - switch ((char)*(a + 1)) { - case '-': - break; - case '?': - print_help(); - return -1; - case 'v': - printf("verboseeee"); - break; - }; + char opt = *(a + 1); + if (!opt) { + print_no_host(exec_name); + return EX_USAGE; + } else if (opt == '-') { + int ret = handle_long_args(av, args); + if (ret == EX_USAGE) { + print_no_host(exec_name); + return EX_USAGE; + } + } else { + OPT_WHILE { + if (opt == options[i].opt) { + OPT_HANDLE(i) + } + i++; + } + } } else { - } av++; } - - if (av) { - print_no_host(exec_name); - return EX_USAGE; - } return EXIT_SUCCESS; }