7 #define streq(str, target) (strcmp(str, target) == 0)
11 #define startswith(str, target) (strncmp(str, target, strlen(target)) == 0)
14 #define USAGE_ERROR(program_name, usage, ...) \
16 printf("%s: ", program_name); \
17 printf(__VA_ARGS__); \
18 printf("\n\n%s", usage); \
22 static const char *pop_str_arg(const char *program_name, const char *usage, const char *flag, char shortflag, int *i,
23 int argc, char *argv[]) {
24 if (startswith(argv[*i], flag)) {
25 if (argv[*i][strlen(flag)] == '\0') {
26 if (*i + 1 >= argc) USAGE_ERROR(program_name, usage, "No argument provided for %s", flag);
27 const char *ret = argv[*i + 1];
30 } else if (argv[*i][strlen(flag)] == '=') {
31 const char *ret = &argv[*i][strlen(flag) + 1];
35 } else if (argv[*i][0] == '-' && argv[*i][1] == shortflag) {
36 if (argv[*i][2] == '=') {
37 const char *ret = &argv[*i][3];
40 } else if (argv[*i][2] == '\0') {
41 if (*i + 1 >= argc) USAGE_ERROR(program_name, usage, "No argument provided for -%c", shortflag);
42 const char *ret = argv[*i + 1];
50 static bool pop_bool_arg(const char *flag, char shortflag, int *i, int argc, char *argv[]) {
51 if (streq(argv[*i], flag)) {
52 memmove(&argv[*i], &argv[*i + 1], sizeof(char * [argc - *i - 1]));
55 } else if (argv[*i][0] == '-' && argv[*i][1] != '-') {
56 if (argv[*i][1] == shortflag && argv[*i][2] == '\0') {
60 char *c = strchr(argv[*i], shortflag);
62 memmove(c, c + 1, strlen(c));