errr parser_reg(struct parser *p, const char *fmt, enum parser_error (*func)(struct parser *p)) { errr r; char *cfmt; struct parser_hook *h; assert(p); assert(fmt); assert(func); h = mem_alloc(sizeof *h); cfmt = string_make(fmt); h->next = p->hooks; h->func = func; r = parse_specs(h, cfmt); if (r) { mem_free(h); mem_free(cfmt); return r; } p->hooks = h; mem_free(cfmt); return 0; }
bool gcc_cmdlinet::parse(int argc, const char **argv) { assert(argc>0); add_arg(argv[0]); argst args; args.reserve(argc-1); for(int i=1; i<argc; i++) args.push_back(argv[i]); bool result=parse_arguments(args, false); parse_specs(); return result; }