code / wheres

Lines496 YAML273 C178 Markdown33 make12
(67 lines)
1 #include <stdbool.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
6 #ifndef streq
7 #define streq(str, target) (strcmp(str, target) == 0)
8 #endif
10 #ifndef startswith
11 #define startswith(str, target) (strncmp(str, target, strlen(target)) == 0)
12 #endif
14 #define USAGE_ERROR(program_name, usage, ...) \
15 ({ \
16 printf("%s: ", program_name); \
17 printf(__VA_ARGS__); \
18 printf("\n\n%s", usage); \
19 exit(1); \
20 })
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];
28 *i += 2;
29 return ret;
30 } else if (argv[*i][strlen(flag)] == '=') {
31 const char *ret = &argv[*i][strlen(flag) + 1];
32 *i += 1;
33 return ret;
35 } else if (argv[*i][0] == '-' && argv[*i][1] == shortflag) {
36 if (argv[*i][2] == '=') {
37 const char *ret = &argv[*i][3];
38 *i += 1;
39 return ret;
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];
43 *i += 2;
44 return ret;
47 return NULL;
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]));
53 *i += 1;
54 return true;
55 } else if (argv[*i][0] == '-' && argv[*i][1] != '-') {
56 if (argv[*i][1] == shortflag && argv[*i][2] == '\0') {
57 *i += 1;
58 return true;
60 char *c = strchr(argv[*i], shortflag);
61 if (c) {
62 memmove(c, c + 1, strlen(c));
63 return true;
66 return false;