From: Paul Eggert Date: Mon, 10 Mar 2003 07:31:50 +0000 (+0000) Subject: import from gnulib X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=fcb62b60d94ad17c766dcdd94e4300163c670282;p=chaz%2Ftar import from gnulib --- diff --git a/lib/argmatch.c b/lib/argmatch.c index f08fba3..3983632 100644 --- a/lib/argmatch.c +++ b/lib/argmatch.c @@ -1,5 +1,7 @@ /* argmatch.c -- find a match for a string in an array - Copyright (C) 1990, 1998, 1999 Free Software Foundation, Inc. + + Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,39 +20,33 @@ /* Written by David MacKenzie Modified by Akim Demaille */ +#if HAVE_CONFIG_H +# include +#endif + +/* Specification. */ #include "argmatch.h" #include -#ifdef STDC_HEADERS -# include -#endif - -#if HAVE_LOCALE_H -# include -#endif +#include +#include -#if ENABLE_NLS -# include -# define _(Text) gettext (Text) -#else -# define _(Text) Text -#endif +#include "gettext.h" +#define _(msgid) gettext (msgid) #include "error.h" #include "quotearg.h" +#include "quote.h" +#include "unlocked-io.h" /* 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 escape_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 +#ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #endif @@ -78,7 +74,6 @@ argmatch_exit_fn argmatch_die = __argmatch_die; null-terminated array ARGLIST, return the index in ARGLIST of the matched element, else -1 if it does not match any element or -2 if it is ambiguous (is a prefix of more than one element). - If SENSITIVE, comparison is case sensitive. If VALLIST is none null, use it to resolve ambiguities limited to synonyms, i.e., for @@ -86,10 +81,9 @@ argmatch_exit_fn argmatch_die = __argmatch_die; "no", "nope" -> 1 "y" is a valid argument, for `0', and "n" for `1'. */ -static int -__argmatch_internal (const char *arg, const char *const *arglist, - const char *vallist, size_t valsize, - int case_sensitive) +int +argmatch (const char *arg, const char *const *arglist, + const char *vallist, size_t valsize) { int i; /* Temporary index in ARGLIST. */ size_t arglen; /* Length of ARG. */ @@ -101,9 +95,7 @@ __argmatch_internal (const char *arg, const char *const *arglist, /* Test all elements for either exact match or abbreviated matches. */ for (i = 0; arglist[i]; i++) { - if (case_sensitive - ? !strncmp (arglist[i], arg, arglen) - : !strncasecmp (arglist[i], arg, arglen)) + if (!strncmp (arglist[i], arg, arglen)) { if (strlen (arglist[i]) == arglen) /* Exact match found. */ @@ -131,22 +123,6 @@ __argmatch_internal (const char *arg, const char *const *arglist, return matchind; } -/* argmatch - case sensitive version */ -int -argmatch (const char *arg, const char *const *arglist, - const char *vallist, size_t valsize) -{ - return __argmatch_internal (arg, arglist, vallist, valsize, 1); -} - -/* argcasematch - case insensitive version */ -int -argcasematch (const char *arg, const char *const *arglist, - const char *vallist, size_t valsize) -{ - return __argmatch_internal (arg, arglist, vallist, valsize, 0); -} - /* Error reporting for argmatch. CONTEXT is a description of the type of entity that was being matched. VALUE is the invalid value that was given. @@ -155,21 +131,12 @@ argcasematch (const char *arg, const char *const *arglist, void 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); - - format = (problem == -1 - ? _("invalid argument `%s' for `%s'") - : _("ambiguous argument `%s' for `%s'")); - - error (0, 0, format, quotearg (value), context); + char const *format = (problem == -1 + ? _("invalid argument %s for %s") + : _("ambiguous argument %s for %s")); - set_quoting_style (NULL, saved_quoting_style); + error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value), + quote_n (1, context)); } /* List the valid arguments for argmatch. @@ -210,12 +177,9 @@ 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); + int res = argmatch (arg, arglist, vallist, valsize); if (res >= 0) /* Success. */ return res; @@ -301,12 +265,12 @@ main (int argc, const char *const *argv) } if ((cp = getenv ("VERSION_CONTROL"))) - backup_type = XARGCASEMATCH ("$VERSION_CONTROL", cp, - backup_args, backup_vals); + backup_type = XARGMATCH ("$VERSION_CONTROL", cp, + backup_args, backup_vals); if (argc == 2) - backup_type = XARGCASEMATCH (program_name, argv[1], - backup_args, backup_vals); + backup_type = XARGMATCH (program_name, argv[1], + backup_args, backup_vals); printf ("The version control is `%s'\n", ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));