| 58 | static bool allocated = false; |
| 59 | |
| 60 | bool parse_args(int *argc, char ***argv, ...) |
| 61 | { |
| 62 | char **a; |
| 63 | va_list ap; |
| 64 | |
| 65 | va_start(ap, argv); |
| 66 | *argc = 1; |
| 67 | a = malloc(sizeof(*a) * (*argc + 1)); |
| 68 | a[0] = (*argv)[0]; |
| 69 | while ((a[*argc] = va_arg(ap, char *)) != NULL) { |
| 70 | (*argc)++; |
| 71 | a = realloc(a, sizeof(*a) * (*argc + 1)); |
| 72 | } |
| 73 | |
| 74 | if (allocated) |
| 75 | free(*argv); |
| 76 | |
| 77 | *argv = a; |
| 78 | allocated = true; |
| 79 | |
| 80 | return opt_parse(argc, *argv, save_err_output); |
| 81 | } |
| 82 | |
| 83 | bool parse_early_args(int *argc, char ***argv, ...) |
| 84 | { |