#define READARG_IMPLEMENTATION #define READARG_DEBUG #include #include "../readarg.h" enum opt { OPT_HELP, OPT_VERSION, }; static int write_callback(void *ctx, const char *buf, size_t len); int main(int argc, char **argv) { const char *progname = argv[0] == NULL ? "test" : argv[0]; struct readarg_helpgen_writer writer = { .write = write_callback, .ctx = NULL, }; struct readarg_opt opts[] = { [OPT_HELP] = { .names = { [READARG_FORM_LONG] = READARG_STRINGS("help"), }, .arg.bounds.val = { 1, }, }, [OPT_VERSION] = { .names = { [READARG_FORM_SHORT] = READARG_STRINGS("V"), [READARG_FORM_LONG] = READARG_STRINGS("version"), }, .arg.bounds.val = { 1, }, }, { .names = { [READARG_FORM_SHORT] = READARG_STRINGS("e", "x"), [READARG_FORM_LONG] = READARG_STRINGS("expr", "expression"), }, .arg = { .name = "expression", .bounds.val = { 1, 4, }, }, }, { .names = { [READARG_FORM_SHORT] = READARG_STRINGS("c"), [READARG_FORM_LONG] = READARG_STRINGS("config"), }, .arg = { .name = "file", .bounds.val = { 2, }, }, }, { .names = { [READARG_FORM_SHORT] = READARG_STRINGS("i"), [READARG_FORM_LONG] = READARG_STRINGS("uri"), }, .arg = { .name = "uri", .bounds.inf = 1, }, }, { .names = { [READARG_FORM_SHORT] = READARG_STRINGS("b"), [READARG_FORM_LONG] = READARG_STRINGS("backup", "backup-file"), }, .arg = { .name = "file", .bounds.inf = 1, }, }, { .names = { [READARG_FORM_SHORT] = READARG_STRINGS("v"), [READARG_FORM_LONG] = READARG_STRINGS("verbose"), }, .arg.bounds.val = { 3, }, }, { .names = { [READARG_FORM_SHORT] = READARG_STRINGS("s"), [READARG_FORM_LONG] = READARG_STRINGS("sort"), }, .arg.bounds.inf = 1, }, }; struct readarg_arg opers[] = { { .name = "pattern", .bounds.inf = 1, }, { .name = "file", .bounds = { .val = { 1, }, .inf = 1, }, }, { .name = "name", .bounds = { .val = { 1, }, .inf = 1, }, }, }; struct readarg_parser rp; readarg_parser_init(&rp, opts, sizeof opts / sizeof *opts, opers, sizeof opers / sizeof *opers, (struct readarg_view_strings){ .strings = (const char **)argv + 1, .len = argc - 1, }); while (readarg_parse(&rp)); if (rp.error != READARG_ESUCCESS) { fprintf(stderr, "Error: %d\n", rp.error); readarg_helpgen_put_usage(&rp, &writer, progname, "Usage"); return 1; } if (rp.opts[OPT_HELP].arg.val.len >= 1) { readarg_helpgen_put_usage(&rp, &writer, progname, "Usage"); return 0; } if (rp.opts[OPT_VERSION].arg.val.len >= 1) { printf("0.0.0\n"); return 0; } struct readarg_opt *erropt = readarg_validate_opts(&rp); if (erropt != NULL) { fprintf(stderr, "Error: %d\n", rp.error); readarg_helpgen_put_usage(&rp, &writer, progname, "Usage"); return 1; } readarg_assign_opers(&rp); if (rp.error != READARG_ESUCCESS) { fprintf(stderr, "Error: %d\n", rp.error); readarg_helpgen_put_usage(&rp, &writer, progname, "Usage"); return 1; } printf("opt:\n"); { struct readarg_opt *curr = rp.opts; for (size_t i = 0; i < rp.nopts; i++) { for (size_t j = 0; j < sizeof curr[i].names / sizeof *curr[i].names; j++) { if (curr[i].names[j]) { for (size_t k = 0; curr[i].names[j][k]; k++) { printf("%s ", curr[i].names[j][k]); } } } printf("{ [%zu] ", curr[i].arg.val.len); if (curr[i].arg.name) { struct readarg_view_strings val = curr[i].arg.val; for (size_t j = 0; j < val.len; j++) { printf("%s ", val.strings[j]); } } printf("}\n"); } } printf("oper:\n"); { struct readarg_arg *curr = rp.opers; for (size_t i = 0; i < rp.nopers; i++) { printf("%s { [%zu] ", curr[i].name, curr[i].val.len); for (size_t j = 0; j < curr[i].val.len; j++) { printf("%s ", curr[i].val.strings[j]); } printf("}\n"); } } return 0; } static int write_callback(void *ctx, const char *buf, size_t len) { (void)ctx; return fwrite(buf, 1, len, stderr) == len; }