.
[gnulib.git] / lib / argmatch.h
index 5abce4c..9772dcc 100644 (file)
@@ -1,5 +1,5 @@
-/* argmatch.c -- find a match for a string in an array
-   Copyright (C) 1990, 1998 Free Software Foundation, Inc.
+/* argmatch.h -- definitions and prototypes for argmatch.c
+   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
@@ -18,8 +18,8 @@
 /* Written by David MacKenzie <djm@ai.mit.edu>
    Modified by Akim Demaille <demaille@inf.enst.fr> */
 
-#ifndef _ARGMATCH_H_
-# define _ARGMATCH_H_ 1
+#ifndef ARGMATCH_H_
+# define ARGMATCH_H_ 1
 
 # if HAVE_CONFIG_H
 #  include <config.h>
    false ambiguities (i.e., different matches of ARG but corresponding
    to the same values in VALLIST).  */
 
-int argmatch 
-       PARAMS ((const char *arg, const char *const *arglist, 
-                const char *vallist, size_t valsize));
-int argcasematch 
-       PARAMS ((const char *arg, const char *const *arglist, 
-                const char *vallist, size_t valsize));
+int argmatch
+  PARAMS ((const char *arg, const char *const *arglist,
+          const char *vallist, size_t valsize));
+int argcasematch
+  PARAMS ((const char *arg, const char *const *arglist,
+          const char *vallist, size_t valsize));
 
-# define ARGMATCH(ARG,ARGLIST,VALLIST) \
-  argmatch (ARG, ARGLIST, (const char *) VALLIST, sizeof (*VALLIST))
+# define ARGMATCH(Arg, Arglist, Vallist) \
+  argmatch ((Arg), (Arglist), (const char *) (Vallist), sizeof (*(Vallist)))
 
-# define ARGCASEMATCH(ARG,ARGLIST,VALLIST) \
-  argcasematch (ARG, ARGLIST, (const char *) VALLIST, sizeof (*VALLIST))
+# define ARGCASEMATCH(Arg, Arglist, Vallist) \
+  argcasematch ((Arg), (Arglist), (const char *) (Vallist), sizeof (*(Vallist)))
 
 
 
 /* Report on stderr why argmatch failed.  Report correct values. */
 
-void argmatch_invalid 
-       PARAMS ((const char *kind, const char *value, int problem));
+void argmatch_invalid
+  PARAMS ((const char *kind, const char *value, int problem));
 
 /* Left for compatibility with the old name invalid_arg */
 
-# define invalid_arg(KIND,VALUE,PROBLEM) \
-       argmatch_invalid (KIND, VALUE, PROBLEM)
+# define invalid_arg(Kind, Value, Problem) \
+  argmatch_invalid ((Kind), (Value), (Problem))
 
 
 
 /* Report on stderr the list of possible arguments.  */
 
 void argmatch_valid
-       PARAMS ((const char *const *arglist, 
-                const char *vallist, size_t valsize));
-
-# define ARGMATCH_VALID(ARGLIST,VALLIST) \
-  valid_args (ARGLIST, (const char *) VALLIST, sizeof (*VALLIST))
-
-
-/* Returns matches, or, upon error, report explanatory message and
-   exit.  */
-
-int __xargmatch_internal 
-       PARAMS ((const char *kind, 
-                const char *arg, const char *const *arglist,
-                const char *vallist, size_t valsize,
-                int sensitive));
-
-# define XARGMATCH(KIND,ARG,ARGLIST,VALLIST) \
-  VALLIST [__xargmatch_internal (KIND, ARG, ARGLIST, \
-                        (const char *) VALLIST, sizeof (*VALLIST), 1)]
-
-# define XARGCASEMATCH(KIND,ARG,ARGLIST,VALLIST) \
-  VALLIST [__xargmatch_internal (KIND, ARG, ARGLIST, \
-                        (const char *) VALLIST, sizeof (*VALLIST), 0)]
-
+  PARAMS ((const char *const *arglist,
+          const char *vallist, size_t valsize));
+
+# define ARGMATCH_VALID(Arglist, Vallist) \
+  argmatch_valid (Arglist, (const char *) Vallist, sizeof (*Vallist))
+
+
+/* Set *Result_ptr to the value in Vallist corresponding to the Arg
+   in Arglist.  If Arg doesn't match any string in Arglist, give a
+   diagnostic and (presumably) exit via the Die_stmt, leaving *Result_ptr
+   unmodified.  */
+
+# define XARGMATCH(Result_ptr, Kind, Arg, Arglist, Vallist, Die_stmt)  \
+  do                                                                   \
+    {                                                                  \
+      int _i = ARGMATCH (Arg, Arglist, Vallist);                       \
+      if (_i >= 0)                                                     \
+       *(Result_ptr) = (Vallist) [_i];                                 \
+      else                                                             \
+       {                                                               \
+         argmatch_invalid ((Kind), (Arg), _i);                         \
+         ARGMATCH_VALID (Arglist, Vallist);                            \
+         Die_stmt;                                                     \
+       }                                                               \
+    }                                                                  \
+  while (0)
 
 
 /* Convert a value into a corresponding argument. */
 
-const char * argmatch_to_argument
-       PARAMS ((char * value, const char *const *arglist,
-                const char *vallist, size_t valsize));
+const char *argmatch_to_argument
+  PARAMS ((char const *value, const char *const *arglist,
+          const char *vallist, size_t valsize));
 
-# define ARGMATCH_TO_ARGUMENT(VALUE,ARGLIST,VALLIST)   \
-   argmatch_to_argument ((char *) &VALUE, ARGLIST,     \
-                        (const char *) VALLIST, sizeof (*VALLIST))
+# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist)                 \
+  argmatch_to_argument ((char const *) &(Value), (Arglist),            \
+                       (const char *) (Vallist), sizeof (*(Vallist)))
 
-#endif /* _ARGMATCH_H_ */
+#endif /* ARGMATCH_H_ */