X-Git-Url: http://git.efficios.com/?p=argpar.git;a=blobdiff_plain;f=argpar%2Fargpar.c;h=f324d7fb130355a42ef07583cfcd520f09f2e324;hp=72caa49dfd79c1272d47cb3a1279c766444d4abb;hb=f3ab5ca1c03d5ae622ac53b7c1da30ebd21db199;hpb=871eba329ad77b01051cd29ec372f8ae5a401882 diff --git a/argpar/argpar.c b/argpar/argpar.c index 72caa49..f324d7f 100644 --- a/argpar/argpar.c +++ b/argpar/argpar.c @@ -33,8 +33,8 @@ /* * An argpar iterator. * - * Such a structure contains the state of an iterator between - * calls to argpar_iter_parse_next(). + * Such a structure contains the state of an iterator between calls to + * argpar_iter_next(). */ struct argpar_iter { /* @@ -47,7 +47,7 @@ struct argpar_iter { /* * Index of the argument to process in the next - * argpar_iter_parse_next() call. + * argpar_iter_next() call. */ unsigned int i; @@ -58,7 +58,7 @@ struct argpar_iter { * Current character of the current short option group: if it's * not `NULL`, the parser is in within a short option group, * therefore it must resume there in the next - * argpar_iter_parse_next() call. + * argpar_iter_next() call. */ const char *short_opt_ch; }; @@ -400,7 +400,7 @@ enum parse_orig_arg_opt_ret { PARSE_ORIG_ARG_OPT_RET_OK, PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT = -1, PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG = -2, - PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT = -3, + PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG = -3, PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG = -4, PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY = -5, }; @@ -420,7 +420,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts, if (strlen(short_opts) == 0) { try_append_string_printf(error, "Invalid argument"); - ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT; + ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG; goto error; } @@ -519,7 +519,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg, if (strlen(long_opt_arg) == 0) { try_append_string_printf(error, "Invalid argument"); - ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT; + ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG; goto error; } @@ -532,7 +532,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg, if (long_opt_name_size > max_len) { try_append_string_printf(error, "Invalid argument `--%s`", long_opt_arg); - ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT; + ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG; goto error; } @@ -679,11 +679,11 @@ void argpar_iter_destroy(struct argpar_iter * const iter) } ARGPAR_HIDDEN -enum argpar_iter_parse_next_status argpar_iter_parse_next( +enum argpar_iter_next_status argpar_iter_next( struct argpar_iter * const iter, const struct argpar_item ** const item, char ** const error) { - enum argpar_iter_parse_next_status status; + enum argpar_iter_next_status status; enum parse_orig_arg_opt_ret parse_orig_arg_opt_ret; const char *orig_arg; const char *next_orig_arg; @@ -695,7 +695,7 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next( } if (iter->i == iter->argc) { - status = ARGPAR_ITER_PARSE_NEXT_STATUS_END; + status = ARGPAR_ITER_NEXT_STATUS_END; goto end; } @@ -710,14 +710,14 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next( iter->non_opt_index); if (!non_opt_item) { - status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR; + status = ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY; goto end; } iter->non_opt_index++; iter->i++; *item = &non_opt_item->base; - status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK; + status = ARGPAR_ITER_NEXT_STATUS_OK; goto end; } @@ -727,20 +727,35 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next( (struct argpar_item **) item); switch (parse_orig_arg_opt_ret) { case PARSE_ORIG_ARG_OPT_RET_OK: - status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK; + status = ARGPAR_ITER_NEXT_STATUS_OK; break; case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT: - try_prepend_while_parsing_arg_to_error(error, iter->i, - orig_arg); - status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT; - break; case PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG: - case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT: + case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG: case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG: - case PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY: try_prepend_while_parsing_arg_to_error(error, iter->i, orig_arg); - status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR; + + switch (parse_orig_arg_opt_ret) { + case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT: + status = ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT; + break; + case PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG: + status = ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG; + break; + case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG: + status = ARGPAR_ITER_NEXT_STATUS_ERROR_INVALID_ARG; + break; + case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG: + status = ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG; + break; + default: + abort(); + } + + break; + case PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY: + status = ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY; break; default: abort(); @@ -751,7 +766,7 @@ end: } ARGPAR_HIDDEN -unsigned int argpar_iter_get_ingested_orig_args( +unsigned int argpar_iter_ingested_orig_args( const struct argpar_iter * const iter) { return iter->i; @@ -782,27 +797,32 @@ struct argpar_parse_ret argpar_parse(const unsigned int argc, } while (true) { - const enum argpar_iter_parse_next_status status = - argpar_iter_parse_next(iter, &item, &parse_ret.error); - - if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR) { + const enum argpar_iter_next_status status = + argpar_iter_next(iter, &item, &parse_ret.error); + + switch (status) { + case ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG: + case ARGPAR_ITER_NEXT_STATUS_ERROR_INVALID_ARG: + case ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG: + case ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY: goto error; - } else if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_END) { - break; - } else if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT) { + case ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT: if (fail_on_unknown_opt) { parse_ret.ingested_orig_args = - argpar_iter_get_ingested_orig_args(iter); + argpar_iter_ingested_orig_args(iter); goto error; } free(parse_ret.error); parse_ret.error = NULL; + goto success; + case ARGPAR_ITER_NEXT_STATUS_END: + goto success; + default: + ARGPAR_ASSERT(status == ARGPAR_ITER_NEXT_STATUS_OK); break; } - ARGPAR_ASSERT(status == ARGPAR_ITER_PARSE_NEXT_STATUS_OK); - if (!push_item(parse_ret.items, item)) { goto error; } @@ -810,8 +830,9 @@ struct argpar_parse_ret argpar_parse(const unsigned int argc, item = NULL; } +success: ARGPAR_ASSERT(!parse_ret.error); - parse_ret.ingested_orig_args = argpar_iter_get_ingested_orig_args(iter); + parse_ret.ingested_orig_args = argpar_iter_ingested_orig_args(iter); goto end; error: