From d8f2c10b7108fff6b7e437291093a1cadc15ab9f Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Sat, 6 May 2023 00:39:44 -0400 Subject: refactor --- lib/args.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 lib/args.c (limited to 'lib/args.c') diff --git a/lib/args.c b/lib/args.c new file mode 100644 index 0000000..f907746 --- /dev/null +++ b/lib/args.c @@ -0,0 +1,111 @@ +#include "args.h" +#include "error.h" +#include "convert.h" + +#include +#include +#include + +#ifndef MAJOR +#define MAJOR 0 +#endif + +#ifndef MINOR +#define MINOR 0 +#endif + +#ifndef PATCH +#define PATCH 0 +#endif + +void check_arg (char* arg) { + if (arg == NULL) { + error("expected another argument after option"); + } +} + +void global_help(void (*help)(void)) { + printf("LazySphere v%d.%d.%d multi-call binary.\n\n", MAJOR, MINOR, PATCH); + help(); + exit(EXIT_SUCCESS); +} + +void parse_help(int argc, char** argv, void (*help)(void)) { + int i; + + if (argc < 1) return; + + for (i = 0; i < argc; i++) { + if (!prefix("-", argv[i]) || streql("-", argv[i])) break; + if (help != NULL && streql("--help", argv[i])) global_help(help); + } +} + +int parse_args(int argc, char** argv, void (*help)(void), int (*short_arg)(char, char*), int (*long_arg)(char*, char*)) { + int start, i, current; + char* next_arg; + + if (argc < 1) return 0; + + start = 0; + for (i = 0; i < argc; i++) { + + if (!prefix("-", argv[i]) || streql("-", argv[i])) break; + if (help != NULL && streql("--help", argv[i])) global_help(help); + + if (i + 1 == argc) { + next_arg = NULL; + } else { + next_arg = argv[i+1]; + } + + current = i; + + if (prefix("--", argv[i])) { + int r; + + if (long_arg == NULL) { + goto exit; + } + + r = long_arg(argv[current], next_arg); + + if (r == ARG_USED) { + i++; + start++; + } else if (r == ARG_IGNORE) { + goto exit; + } else if (r == ARG_INVALID) { + error("invalid argument %s", argv[current]); + + } + } else { + size_t j; + int r; + + if (short_arg == NULL) { + goto exit; + } + + for (j = 1; j < strlen(argv[current]); j++) { + + r = short_arg(argv[current][j], next_arg); + + if (r == ARG_USED) { + i++; + start++; + } else if (r == ARG_IGNORE) { + goto exit; + } else if (r == ARG_INVALID) { + error("invalid argument -%c", argv[current][j]); + } + } + } + + start++; + } + +exit: + + return start; +} -- cgit v1.2.3-freya