argpar_iter_parse_next(): make the `error` parameter optional
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Mon, 31 May 2021 21:29:27 +0000 (17:29 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 3 Jun 2021 17:41:01 +0000 (13:41 -0400)
You don't want to know the details of the error? No problemo.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Change-Id: I82f024f3cc78554f5eaa8a72998e9226c5195a4b

argpar/argpar.c
argpar/argpar.h

index 1ee5539ec0b221cd1457237ba434ecb1974ea2f0..a37efd000c9edf2edbbf65c5c02f2069e47ee151 100644 (file)
@@ -140,13 +140,18 @@ char *argpar_asprintf(const char * const fmt, ...)
 }
 
 static __attribute__((format(ARGPAR_PRINTF_FORMAT, 2, 3)))
-bool append_string_printf(char ** const str, const char *fmt, ...)
+bool try_append_string_printf(char ** const str, const char *fmt, ...)
 {
        char *new_str = NULL;
-       char *addendum;
+       char *addendum = NULL;
        bool success;
        va_list args;
 
+       if (!str) {
+               success = true;
+               goto end;
+       }
+
        ARGPAR_ASSERT(str);
        va_start(args, fmt);
        addendum = argpar_vasprintf(fmt, args);
@@ -411,7 +416,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        struct argpar_item_opt *opt_item;
 
        if (strlen(short_opts) == 0) {
-               append_string_printf(error, "Invalid argument");
+               try_append_string_printf(error, "Invalid argument");
                goto error;
        }
 
@@ -423,7 +428,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        descr = find_descr(descrs, *iter->short_opt_ch, NULL);
        if (!descr) {
                ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT;
-               append_string_printf(error, "Unknown option `-%c`",
+               try_append_string_printf(error, "Unknown option `-%c`",
                        *iter->short_opt_ch);
                goto error;
        }
@@ -444,7 +449,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
                 */
                if (!opt_arg || (iter->short_opt_ch[1] &&
                                strlen(opt_arg) == 0)) {
-                       append_string_printf(error,
+                       try_append_string_printf(error,
                                "Missing required argument for option `-%c`",
                                *iter->short_opt_ch);
                        used_next_orig_arg = false;
@@ -509,7 +514,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
        const char *long_opt_name = long_opt_arg;
 
        if (strlen(long_opt_arg) == 0) {
-               append_string_printf(error, "Invalid argument");
+               try_append_string_printf(error, "Invalid argument");
                goto error;
        }
 
@@ -520,8 +525,8 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
 
                /* Isolate the option name */
                if (long_opt_name_size > max_len) {
-                       append_string_printf(error, "Invalid argument `--%s`",
-                               long_opt_arg);
+                       try_append_string_printf(error,
+                               "Invalid argument `--%s`", long_opt_arg);
                        goto error;
                }
 
@@ -533,7 +538,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
        /* Find corresponding option descriptor */
        descr = find_descr(descrs, '\0', long_opt_name);
        if (!descr) {
-               append_string_printf(error, "Unknown option `--%s`",
+               try_append_string_printf(error, "Unknown option `--%s`",
                        long_opt_name);
                ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT;
                goto error;
@@ -547,7 +552,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
                } else {
                        /* `--long-opt arg` style */
                        if (!next_orig_arg) {
-                               append_string_printf(error,
+                               try_append_string_printf(error,
                                        "Missing required argument for option `--%s`",
                                        long_opt_name);
                                goto error;
@@ -561,7 +566,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
                 * Unexpected `--opt=arg` style for a long option which
                 * doesn't accept an argument.
                 */
-               append_string_printf(error,
+               try_append_string_printf(error,
                        "Unexpected argument for option `--%s`", long_opt_name);
                goto error;
        }
@@ -615,13 +620,17 @@ enum parse_orig_arg_opt_ret parse_orig_arg_opt(const char * const orig_arg,
 }
 
 static
-bool prepend_while_parsing_arg_to_error(char ** const error,
+bool try_prepend_while_parsing_arg_to_error(char ** const error,
                const unsigned int i, const char * const arg)
 {
        char *new_error;
        bool success;
 
-       ARGPAR_ASSERT(error);
+       if (!error) {
+               success = true;
+               goto end;
+       }
+
        ARGPAR_ASSERT(*error);
        new_error = argpar_asprintf("While parsing argument #%u (`%s`): %s",
                i + 1, arg, *error);
@@ -674,7 +683,10 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next(
        const char *next_orig_arg;
 
        ARGPAR_ASSERT(iter->i <= iter->argc);
-       *error = NULL;
+
+       if (error) {
+               *error = NULL;
+       }
 
        if (iter->i == iter->argc) {
                status = ARGPAR_ITER_PARSE_NEXT_STATUS_END;
@@ -712,11 +724,13 @@ 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:
-               prepend_while_parsing_arg_to_error(error, iter->i, orig_arg);
+               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:
-               prepend_while_parsing_arg_to_error(error, iter->i, orig_arg);
+               try_prepend_while_parsing_arg_to_error(error, iter->i,
+                       orig_arg);
                status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR;
                break;
        default:
index 1187def7ccdf8021bf6948165a936117bdc8f21a..c6f79cf64f6e5ad445464ab7dd1cb02b5c52d9d4 100644 (file)
@@ -323,8 +323,9 @@ enum argpar_iter_parse_next_status {
  *
  * On failure (status codes
  * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT` and
- * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR`), this function sets `*error`
- * to a descriptive error string. Free `*error` with free().
+ * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR`), this function sets `*error`,
+ * if not `NULL`, to a descriptive error string. Free `*error` with
+ * free().
  *
  * Create an argument parsing iterator with argpar_iter_create().
  */
This page took 0.037213 seconds and 4 git commands to generate.