test-base64: Improve.
[gnulib.git] / lib / argmatch.c
index 972a085..925449b 100644 (file)
@@ -1,12 +1,12 @@
 /* argmatch.c -- find a match for a string in an array
 
-   Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003 Free Software
-   Foundation, Inc.
+   Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
+   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
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* Written by David MacKenzie <djm@ai.mit.edu>
    Modified by Akim Demaille <demaille@inf.enst.fr> */
 
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include <config.h>
 
 /* Specification.  */
 #include "argmatch.h"
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #define _(msgid) gettext (msgid)
 
 #include "error.h"
-#include "exit.h"
 #include "quotearg.h"
 #include "quote.h"
-#include "unlocked-io.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
 
 /* When reporting an invalid argument, show nonprinting characters
    by using the quoting style ARGMATCH_QUOTING_STYLE.  Do not use
@@ -49,7 +49,8 @@
 
 /* Non failing version of argmatch call this function after failing. */
 #ifndef ARGMATCH_DIE
-# define ARGMATCH_DIE exit (EXIT_FAILURE)
+# include "exitfail.h"
+# define ARGMATCH_DIE exit (exit_failure)
 #endif
 
 #ifdef ARGMATCH_DIE_DECL
@@ -68,7 +69,7 @@ argmatch_exit_fn argmatch_die = __argmatch_die;
 
 \f
 /* If ARG is an unambiguous match for an element of the
-   null-terminated array ARGLIST, return the index in ARGLIST
+   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).
 
@@ -78,14 +79,14 @@ argmatch_exit_fn argmatch_die = __argmatch_die;
      "no", "nope" -> 1
    "y" is a valid argument, for `0', and "n" for `1'.  */
 
-int
+ptrdiff_t
 argmatch (const char *arg, const char *const *arglist,
          const char *vallist, size_t valsize)
 {
-  int i;                       /* Temporary index in ARGLIST.  */
+  size_t i;                    /* Temporary index in ARGLIST.  */
   size_t arglen;               /* Length of ARG.  */
-  int matchind = -1;           /* Index of first nonexact match.  */
-  int ambiguous = 0;           /* If nonzero, multiple nonexact match(es).  */
+  ptrdiff_t matchind = -1;     /* Index of first nonexact match.  */
+  bool ambiguous = false;      /* If true, multiple nonexact match(es).  */
 
   arglen = strlen (arg);
 
@@ -109,7 +110,7 @@ argmatch (const char *arg, const char *const *arglist,
                {
                  /* There is a real ambiguity, or we could not
                     disambiguate. */
-                 ambiguous = 1;
+                 ambiguous = true;
                }
            }
        }
@@ -126,7 +127,7 @@ argmatch (const char *arg, const char *const *arglist,
    PROBLEM is the return value from argmatch.  */
 
 void
-argmatch_invalid (const char *context, const char *value, int problem)
+argmatch_invalid (const char *context, const char *value, ptrdiff_t problem)
 {
   char const *format = (problem == -1
                        ? _("invalid argument %s for %s")
@@ -144,7 +145,7 @@ void
 argmatch_valid (const char *const *arglist,
                const char *vallist, size_t valsize)
 {
-  int i;
+  size_t i;
   const char *last_val = NULL;
 
   /* We try to put synonyms on the same line.  The assumption is that
@@ -170,13 +171,13 @@ argmatch_valid (const char *const *arglist,
    "--version-control", or "$VERSION_CONTROL" etc.).  Upon failure,
    calls the (supposed never to return) function EXIT_FN. */
 
-int
+ptrdiff_t
 __xargmatch_internal (const char *context,
                      const char *arg, const char *const *arglist,
                      const char *vallist, size_t valsize,
                      argmatch_exit_fn exit_fn)
 {
-  int res = argmatch (arg, arglist, vallist, valsize);
+  ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
   if (res >= 0)
     /* Success. */
     return res;
@@ -196,7 +197,7 @@ argmatch_to_argument (const char *value,
                      const char *const *arglist,
                      const char *vallist, size_t valsize)
 {
-  int i;
+  size_t i;
 
   for (i = 0; arglist[i]; i++)
     if (!memcmp (value, vallist + valsize * i, valsize))
@@ -214,17 +215,17 @@ char *program_name;
 enum backup_type
 {
   /* Never make backups.  */
-  none,
+  no_backups,
 
   /* Make simple backups of every file.  */
-  simple,
+  simple_backups,
 
   /* Make numbered backups of files that already have numbered backups,
      and simple backups of the others.  */
-  numbered_existing,
+  numbered_existing_backups,
 
   /* Make numbered backups of every file.  */
-  numbered
+  numbered_backups
 };
 
 /* Two tables describing arguments (keys) and their corresponding
@@ -240,17 +241,17 @@ static const char *const backup_args[] =
 
 static const enum backup_type backup_vals[] =
 {
-  none, none, none,
-  simple, simple,
-  numbered_existing, numbered_existing,
-  numbered, numbered
+  no_backups, no_backups, no_backups,
+  simple_backups, simple_backups,
+  numbered_existing_backups, numbered_existing_backups,
+  numbered_backups, numbered_backups
 };
 
 int
 main (int argc, const char *const *argv)
 {
   const char *cp;
-  enum backup_type backup_type = none;
+  enum backup_type backup_type = no_backups;
 
   program_name = (char *) argv[0];