X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fargmatch.c;h=6ae76ac1bbf7a273a5e313a9850b1506f46a3528;hb=d614f5fac93c227cf474845b1b12e6406329f8ca;hp=efe22cd477705c6786893c0570a5bfd47cf66b9c;hpb=38cd317979653c8abe3286761bd73f00ed376324;p=gnulib.git diff --git a/lib/argmatch.c b/lib/argmatch.c index efe22cd47..6ae76ac1b 100644 --- a/lib/argmatch.c +++ b/lib/argmatch.c @@ -36,10 +36,6 @@ # define _(Text) Text #endif -#ifndef EXIT_BADARG -# define EXIT_BADARG 1 -#endif - #include "quotearg.h" /* When reporting a failing argument, make sure to show invisible @@ -47,11 +43,32 @@ ARGMATCH_QUOTING_STYLE. literal_quoting_style is not good. */ #ifndef ARGMATCH_QUOTING_STYLE -# define ARGMATCH_QUOTING_STYLE c_quoting_style +# define ARGMATCH_QUOTING_STYLE escape_quoting_style #endif extern char *program_name; +/* 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 + +/* Non failing version of argmatch call this function after failing. */ +#ifndef ARGMATCH_DIE +# define ARGMATCH_DIE exit (EXIT_FAILURE) +#endif + +static void +__argmatch_die (void) +{ + ARGMATCH_DIE; +} + +argmatch_exit_fn argmatch_exit_failure = __argmatch_exit_failure; + /* 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 @@ -126,29 +143,26 @@ 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; /* 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); - /* There is an error */ - fprintf (stderr, "%s: ", program_name); - if (problem == -1) - fprintf (stderr, _("invalid argument %s for `%s'"), - quotearg (value), kind); - else /* Assume -2. */ - fprintf (stderr, _("ambiguous argument %s for `%s'"), - quotearg (value), kind); - putc ('\n', stderr); + format = (problem == -1 + ? _("%s: invalid argument `%s' for `%s'\n") + : _("%s: ambiguous argument `%s' for `%s'\n")); + + fprintf (stderr, format, program_name, quotearg (value), context); set_quoting_style (NULL, saved_quoting_style); } @@ -181,41 +195,38 @@ argmatch_valid (const char *const *arglist, putc ('\n', stderr); } -/* Call __argmatch_internal, but handle the error so that it never - returns. Errors are reported to the users with a list of valid - values. +/* 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. */ - KIND is a description of the type of entity that was being matched. - ARG, ARGLIST, and SENSITIVE are the same as in __argmatch_internal - VALIST, and VALSIZE are the same as in valid_args */ int -__xargmatch_internal (const char *kind, const char *arg, - const char *const *arglist, +__xargmatch_internal (const char *context, + const char *arg, const char *const *arglist, const char *vallist, size_t valsize, - int case_sensitive) + int case_sensitive, + argmatch_exit_fn exit_fn) { - int i; - - i = __argmatch_internal (arg, arglist, vallist, valsize, case_sensitive); - if (i >= 0) - { - /* Success */ - return i; - } - else - { - /* Failure */ - argmatch_invalid (kind, arg, i); - argmatch_valid (arglist, vallist, valsize); - exit (EXIT_BADARG); - } - return -1; /* To please some compilers */ + 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 * -argmatch_to_argument (char *value, +argmatch_to_argument (const char *value, const char *const *arglist, const char *vallist, size_t valsize) { @@ -231,7 +242,7 @@ argmatch_to_argument (char *value, /* * Based on "getversion.c" by David MacKenzie */ -char *rogram_name; +char *program_name; extern const char *getenv (); /* When to make backup files. */