X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fargmatch.c;h=964270650c2b72150ba8f1375c8857378dd5be16;hb=559ac9667adc2becf7a2a956f00024b79056469d;hp=517c6e529cedb37ab519ccfb69b4e8365b2a6dac;hpb=2c6d91f6bcfffcaa7320af7ea4e2a9c970c0966e;p=gnulib.git diff --git a/lib/argmatch.c b/lib/argmatch.c index 517c6e529..964270650 100644 --- a/lib/argmatch.c +++ b/lib/argmatch.c @@ -36,18 +36,44 @@ # define _(Text) Text #endif +#include "error.h" #include "quotearg.h" -/* When reporting a failing argument, make sure to show invisible - characters hidden using the quoting style - ARGMATCH_QUOTING_STYLE. literal_quoting_style is not good. */ - +/* When reporting an invalid argument, show nonprinting characters + by using the quoting style ARGMATCH_QUOTING_STYLE. Do not use + literal_quoting_style. */ #ifndef ARGMATCH_QUOTING_STYLE -# define ARGMATCH_QUOTING_STYLE c_quoting_style +# define ARGMATCH_QUOTING_STYLE locale_quoting_style +#endif + +/* The following test is to work around the gross typo in + systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE + is defined to 0, not 1. */ +#if !EXIT_FAILURE +# undef EXIT_FAILURE +# define EXIT_FAILURE 1 #endif -extern char *program_name; +/* Non failing version of argmatch call this function after failing. */ +#ifndef ARGMATCH_DIE +# define ARGMATCH_DIE exit (EXIT_FAILURE) +#endif + +#ifdef ARGMATCH_DIE_DECL +ARGMATCH_DIE_DECL; +#endif +static void +__argmatch_die (void) +{ + ARGMATCH_DIE; +} + +/* Used by XARGMATCH and XARGCASEMATCH. See description in argmatch.h. + Default to __argmatch_die, but allow caller to change this at run-time. */ +argmatch_exit_fn argmatch_die = __argmatch_die; + + /* If ARG is an unambiguous match for an element of the null-terminated array ARGLIST, return the index in ARGLIST of the matched element, else -1 if it does not match any element @@ -122,36 +148,18 @@ argcasematch (const char *arg, const char *const *arglist, } /* Error reporting for argmatch. - KIND is a description of the type of entity that was being matched. + CONTEXT is a description of the type of entity that was being matched. VALUE is the invalid value that was given. PROBLEM is the return value from argmatch. */ void -argmatch_invalid (const char *kind, const char *value, int problem) +argmatch_invalid (const char *context, const char *value, int problem) { - enum quoting_style saved_quoting_style; - char const *format; - char *quoted_arg; - - /* Make sure to have a good quoting style to report errors. - literal is insane here. */ - saved_quoting_style = get_quoting_style (NULL); - set_quoting_style (NULL, ARGMATCH_QUOTING_STYLE); + char const *format = (problem == -1 + ? _("invalid argument %s for `%s'") + : _("ambiguous argument %s for `%s'")); - /* There is an error */ - quoted_arg = quotearg (value); - - /* Skip over the first quote character, and overwrite the last one. */ - ++quoted_arg; - quoted_arg[strlen (quoted_arg) - 1] = '\0'; - - format = (problem == -1 - ? _("%s: invalid argument `%s' for `%s'\n") - : _("%s: ambiguous argument `%s' for `%s'\n")); - - fprintf (stderr, format, program_name, quoted_arg, kind); - - set_quoting_style (NULL, saved_quoting_style); + error (0, 0, format, quotearg_style (ARGMATCH_QUOTING_STYLE, value), context); } /* List the valid arguments for argmatch. @@ -182,6 +190,34 @@ argmatch_valid (const char *const *arglist, putc ('\n', stderr); } +/* Never failing versions of the previous functions. + + CONTEXT is the context for which argmatch is called (e.g., + "--version-control", or "$VERSION_CONTROL" etc.). Upon failure, + calls the (supposed never to return) function EXIT_FN. */ + +int +__xargmatch_internal (const char *context, + const char *arg, const char *const *arglist, + const char *vallist, size_t valsize, + int case_sensitive, + argmatch_exit_fn exit_fn) +{ + int res = __argmatch_internal (arg, arglist, + vallist, valsize, + case_sensitive); + if (res >= 0) + /* Success. */ + return res; + + /* We failed. Explain why. */ + argmatch_invalid (context, arg, res); + argmatch_valid (arglist, vallist, valsize); + (*exit_fn) (); + + return -1; /* To please the compilers. */ +} + /* Look for VALUE in VALLIST, an array of objects of size VALSIZE and return the first corresponding argument in ARGLIST */ const char * @@ -201,7 +237,7 @@ argmatch_to_argument (const char *value, /* * Based on "getversion.c" by David MacKenzie */ -char *rogram_name; +char *program_name; extern const char *getenv (); /* When to make backup files. */