X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fargmatch.c;h=4e879691f4ce7799af51c512862223f584f9f8b0;hb=ac5e11c593de9d8a862193b328a2def30e6d3447;hp=625ad26b7dce717dbf3d93d3bde244c08a2ba8da;hpb=bcd35974a9b1a46c9f0dd26d695f626379b7545e;p=gnulib.git diff --git a/lib/argmatch.c b/lib/argmatch.c index 625ad26b7..4e879691f 100644 --- a/lib/argmatch.c +++ b/lib/argmatch.c @@ -1,5 +1,5 @@ /* argmatch.c -- find a match for a string in an array - Copyright (C) 1990, 1998 Free Software Foundation, Inc. + Copyright (C) 1990, 1998, 1999 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 @@ -28,61 +28,24 @@ #if HAVE_LOCALE_H # include #endif -#if !HAVE_SETLOCALE -# define setlocale(Category, Locale) /* empty */ -#endif #if ENABLE_NLS # include # define _(Text) gettext (Text) #else -# define bindtextdomain(Domain, Directory) /* empty */ -# define textdomain(Domain) /* empty */ # 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 characters hidden using the quoting style - ARGMATCH_QUOTING_STYLE. literal_quoting_style is not good.*/ + ARGMATCH_QUOTING_STYLE. literal_quoting_style is not good. */ #ifndef ARGMATCH_QUOTING_STYLE # define ARGMATCH_QUOTING_STYLE c_quoting_style #endif -#if !HAVE_STRNCASECMP -# include -/* Compare no more than N characters of S1 and S2, - ignoring case, returning less than, equal to or - greater than zero if S1 is lexicographically less - than, equal to or greater than S2. */ -int -strncasecmp (const char *s1, const char *s2, size_t n) -{ - register const unsigned char *p1 = (const unsigned char *) s1; - register const unsigned char *p2 = (const unsigned char *) s2; - unsigned char c1, c2; - - if (p1 == p2 || n == 0) - return 0; - - do - { - c1 = tolower (*p1++); - c2 = tolower (*p2++); - if (c1 == '\0' || c1 != c2) - return c1 - c2; - } while (--n > 0); - - return c1 - c2; -} -#endif - extern char *program_name; /* If ARG is an unambiguous match for an element of the @@ -99,8 +62,8 @@ extern char *program_name; static int __argmatch_internal (const char *arg, const char *const *arglist, - const char *vallist, size_t valsize, - int sensitive) + const char *vallist, size_t valsize, + int case_sensitive) { int i; /* Temporary index in ARGLIST. */ size_t arglen; /* Length of ARG. */ @@ -112,8 +75,9 @@ __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 (sensitive ? !strncmp (arglist[i], arg, arglen) - : !strncasecmp (arglist[i], arg, arglen)) + if (case_sensitive + ? !strncmp (arglist[i], arg, arglen) + : !strncasecmp (arglist[i], arg, arglen)) { if (strlen (arglist[i]) == arglen) /* Exact match found. */ @@ -122,13 +86,17 @@ __argmatch_internal (const char *arg, const char *const *arglist, /* First nonexact match found. */ matchind = i; else - /* Second nonexact match found. */ - if (vallist == NULL - || memcmp (vallist + valsize * matchind, - vallist + valsize * i, valsize)) - /* There is a real ambiguity, or we could not - desambiguise. */ - ambiguous = 1; + { + /* Second nonexact match found. */ + if (vallist == NULL + || memcmp (vallist + valsize * matchind, + vallist + valsize * i, valsize)) + { + /* There is a real ambiguity, or we could not + disambiguate. */ + ambiguous = 1; + } + } } } if (ambiguous) @@ -171,7 +139,7 @@ argmatch_invalid (const char *kind, const char *value, int problem) /* There is an error */ fprintf (stderr, "%s: ", program_name); if (problem == -1) - fprintf (stderr, _("invalid argument %s for `%s'"), + fprintf (stderr, _("invalid argument %s for `%s'"), quotearg (value), kind); else /* Assume -2. */ fprintf (stderr, _("ambiguous argument %s for `%s'"), @@ -190,12 +158,12 @@ argmatch_valid (const char *const *arglist, const char *vallist, size_t valsize) { int i; - const char * last_val = NULL; + const char *last_val = NULL; /* We try to put synonyms on the same line. The assumption is that synonyms follow each other */ fprintf (stderr, _("Valid arguments are:")); - for (i = 0 ; arglist[i] ; i++) + for (i = 0; arglist[i]; i++) if ((i == 0) || memcmp (last_val, vallist + valsize * i, valsize)) { @@ -209,49 +177,18 @@ 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. - - 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, - const char *vallist, size_t valsize, - int sensitive) -{ - int i; - - i = __argmatch_internal (arg, arglist, vallist, valsize, 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 */ -} - /* 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) { int i; - - for (i = 0 ; arglist [i] ; i++) + + for (i = 0; arglist[i]; i++) if (!memcmp (value, vallist + valsize * i, valsize)) - return arglist [i]; + return arglist[i]; return NULL; } @@ -259,8 +196,8 @@ argmatch_to_argument (char * value, /* * Based on "getversion.c" by David MacKenzie */ -char * program_name; -extern const char * getenv (); +char *rogram_name; +extern const char *getenv (); /* When to make backup files. */ enum backup_type @@ -283,28 +220,28 @@ enum backup_type values */ static const char *const backup_args[] = { - "no", "none", "off", - "simple", "never", - "existing", "nil", - "numbered", "t", + "no", "none", "off", + "simple", "never", + "existing", "nil", + "numbered", "t", 0 }; static const enum backup_type backup_vals[] = { - none, none, none, - simple, simple, - numbered_existing, numbered_existing, + none, none, none, + simple, simple, + numbered_existing, numbered_existing, numbered, numbered }; int -main (int argc, const char *const * argv) +main (int argc, const char *const *argv) { - const char * cp; + const char *cp; enum backup_type backup_type = none; - program_name = (char *) argv [0]; + program_name = (char *) argv[0]; if (argc > 2) { @@ -313,14 +250,14 @@ main (int argc, const char *const * argv) } if ((cp = getenv ("VERSION_CONTROL"))) - backup_type = XARGCASEMATCH ("$VERSION_CONTROL", cp, + backup_type = XARGCASEMATCH ("$VERSION_CONTROL", cp, backup_args, backup_vals); if (argc == 2) - backup_type = XARGCASEMATCH (program_name, argv [1], + backup_type = XARGCASEMATCH (program_name, argv[1], backup_args, backup_vals); - printf ("The version control is `%s'\n", + printf ("The version control is `%s'\n", ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals)); return 0;