Re: [PATCH v3 1/2] parse-options: export opterr, optbug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



(+cc: Stephen)
Dmitry Ivankov wrote:

> opterror and optbug functions are used by some of parsing routines
> in parse-options.c to report errors and bugs respectively.
>
> Export these functions to allow more custom parsing routines to use
> them in a uniform way.

In other words, exposing opterror() allows custom option types to
behave more like the built-in ones when producing messages like
"option `<opt>' expects a numerical value".  What should they pass
in the "flags" argument?  Does this deserve a mention in the
"Option Callbacks" section of
Documentation/technical/api-parse-options.txt?

Would opterror() be enough?  I don't see any current users of optbug
outside of parse_options_check() (which is part of low-level
machinery).

Aside from that, seems sensible.

[quoting in full for Stephen's convenience.  One quick comment
below.]
>
> Signed-off-by: Dmitry Ivankov <divanorama@xxxxxxxxx>
> ---
>  parse-options.c |    4 ++--
>  parse-options.h |    2 ++
>  2 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/parse-options.c b/parse-options.c
> index 879ea82..7b061af 100644
> --- a/parse-options.c
> +++ b/parse-options.c
> @@ -12,14 +12,14 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx,
>  #define OPT_SHORT 1
>  #define OPT_UNSET 2
>  
> -static int optbug(const struct option *opt, const char *reason)
> +int optbug(const struct option *opt, const char *reason)
>  {
>  	if (opt->long_name)
>  		return error("BUG: option '%s' %s", opt->long_name, reason);
>  	return error("BUG: switch '%c' %s", opt->short_name, reason);
>  }
>  
> -static int opterror(const struct option *opt, const char *reason, int flags)
> +int opterror(const struct option *opt, const char *reason, int flags)
>  {
>  	if (flags & OPT_SHORT)
>  		return error("switch `%c' %s", opt->short_name, reason);
> diff --git a/parse-options.h b/parse-options.h
> index 05eb09b..59e0b52 100644
> --- a/parse-options.h
> +++ b/parse-options.h
> @@ -165,6 +165,8 @@ extern NORETURN void usage_msg_opt(const char *msg,
>  				   const char * const *usagestr,
>  				   const struct option *options);
>  
> +extern int optbug(const struct option *opt, const char *reason);
> +extern int opterror(const struct option *opt, const char *reason, int flags);
>  /*----- incremental advanced APIs -----*/

A blank line above the comment would make this more readable.

>  
>  enum {
> -- 

Except as noted above,
Reviewed-by: Jonathan Nieder <jrnieder@xxxxxxxxx>

Some (though not all) of the possible changes noted above implemented
below, plus an example caller (which made reading the patch a little
easier).  What do you think?

 builtin/read-tree.c |    2 +-
 parse-options.c     |    2 +-
 parse-options.h     |    2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git c/builtin/read-tree.c i/builtin/read-tree.c
index df6c4c88..6013090c 100644
--- c/builtin/read-tree.c
+++ i/builtin/read-tree.c
@@ -53,7 +53,7 @@ static int exclude_per_directory_cb(const struct option *opt, const char *arg,
 	opts = (struct unpack_trees_options *)opt->value;
 
 	if (opts->dir)
-		die("more than one --exclude-per-directory given.");
+		return opterror(opt, "can only be supplied once", 0);
 
 	dir = xcalloc(1, sizeof(*opts->dir));
 	dir->flags |= DIR_SHOW_IGNORED;
diff --git c/parse-options.c i/parse-options.c
index 7b061afc..777611b1 100644
--- c/parse-options.c
+++ i/parse-options.c
@@ -12,7 +12,7 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx,
 #define OPT_SHORT 1
 #define OPT_UNSET 2
 
-int optbug(const struct option *opt, const char *reason)
+static int optbug(const struct option *opt, const char *reason)
 {
 	if (opt->long_name)
 		return error("BUG: option '%s' %s", opt->long_name, reason);
diff --git c/parse-options.h i/parse-options.h
index 59e0b524..6d31ad3a 100644
--- c/parse-options.h
+++ i/parse-options.h
@@ -165,8 +165,8 @@ extern NORETURN void usage_msg_opt(const char *msg,
 				   const char * const *usagestr,
 				   const struct option *options);
 
-extern int optbug(const struct option *opt, const char *reason);
 extern int opterror(const struct option *opt, const char *reason, int flags);
+
 /*----- incremental advanced APIs -----*/
 
 enum {
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]