Add error enumerators to `enum argpar_iter_parse_next_status`
[argpar.git] / argpar / argpar.c
index a37efd000c9edf2edbbf65c5c02f2069e47ee151..0468011374de8b03c4ce4b2e00fc0fa375f500fc 100644 (file)
@@ -398,8 +398,11 @@ end:
 
 enum parse_orig_arg_opt_ret {
        PARSE_ORIG_ARG_OPT_RET_OK,
-       PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT = -2,
-       PARSE_ORIG_ARG_OPT_RET_ERROR = -1,
+       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_ARG = -3,
+       PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG = -4,
+       PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY = -5,
 };
 
 static
@@ -417,6 +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_ARG;
                goto error;
        }
 
@@ -427,9 +431,9 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        /* Find corresponding option descriptor */
        descr = find_descr(descrs, *iter->short_opt_ch, NULL);
        if (!descr) {
-               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT;
                try_append_string_printf(error, "Unknown option `-%c`",
                        *iter->short_opt_ch);
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT;
                goto error;
        }
 
@@ -453,6 +457,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
                                "Missing required argument for option `-%c`",
                                *iter->short_opt_ch);
                        used_next_orig_arg = false;
+                       ret = PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG;
                        goto error;
                }
        }
@@ -460,6 +465,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        /* Create and append option argument */
        opt_item = create_opt_item(descr, opt_arg);
        if (!opt_item) {
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY;
                goto error;
        }
 
@@ -480,9 +486,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        goto end;
 
 error:
-       if (ret == PARSE_ORIG_ARG_OPT_RET_OK) {
-               ret = PARSE_ORIG_ARG_OPT_RET_ERROR;
-       }
+       ARGPAR_ASSERT(ret != PARSE_ORIG_ARG_OPT_RET_OK);
 
 end:
        return ret;
@@ -515,6 +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_ARG;
                goto error;
        }
 
@@ -527,6 +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_ARG;
                        goto error;
                }
 
@@ -555,6 +561,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
                                try_append_string_printf(error,
                                        "Missing required argument for option `--%s`",
                                        long_opt_name);
+                               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG;
                                goto error;
                        }
 
@@ -568,6 +575,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
                 */
                try_append_string_printf(error,
                        "Unexpected argument for option `--%s`", long_opt_name);
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG;
                goto error;
        }
 
@@ -587,9 +595,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
        goto end;
 
 error:
-       if (ret == PARSE_ORIG_ARG_OPT_RET_OK) {
-               ret = PARSE_ORIG_ARG_OPT_RET_ERROR;
-       }
+       ARGPAR_ASSERT(ret != PARSE_ORIG_ARG_OPT_RET_OK);
 
 end:
        return ret;
@@ -704,7 +710,7 @@ 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_PARSE_NEXT_STATUS_ERROR_MEMORY;
                        goto end;
                }
 
@@ -724,14 +730,32 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next(
                status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK;
                break;
        case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG:
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG:
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG:
                try_prepend_while_parsing_arg_to_error(error, iter->i,
                        orig_arg);
-               status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT;
+
+               switch (parse_orig_arg_opt_ret) {
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
+                       status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT;
+                       break;
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG:
+                       status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG;
+                       break;
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG:
+                       status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG;
+                       break;
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG:
+                       status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG;
+                       break;
+               default:
+                       abort();
+               }
+
                break;
-       case PARSE_ORIG_ARG_OPT_RET_ERROR:
-               try_prepend_while_parsing_arg_to_error(error, iter->i,
-                       orig_arg);
-               status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR;
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY:
+               status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MEMORY;
                break;
        default:
                abort();
@@ -776,11 +800,13 @@ struct argpar_parse_ret argpar_parse(const unsigned int argc,
                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) {
+               switch (status) {
+               case ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG:
+               case ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG:
+               case ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG:
+               case ARGPAR_ITER_PARSE_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_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT:
                        if (fail_on_unknown_opt) {
                                parse_ret.ingested_orig_args =
                                        argpar_iter_get_ingested_orig_args(iter);
@@ -789,11 +815,14 @@ struct argpar_parse_ret argpar_parse(const unsigned int argc,
 
                        free(parse_ret.error);
                        parse_ret.error = NULL;
+                       goto success;
+               case ARGPAR_ITER_PARSE_NEXT_STATUS_END:
+                       goto success;
+               default:
+                       ARGPAR_ASSERT(status == ARGPAR_ITER_PARSE_NEXT_STATUS_OK);
                        break;
                }
 
-               ARGPAR_ASSERT(status == ARGPAR_ITER_PARSE_NEXT_STATUS_OK);
-
                if (!push_item(parse_ret.items, item)) {
                        goto error;
                }
@@ -801,6 +830,7 @@ 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);
        goto end;
This page took 0.024951 seconds and 4 git commands to generate.