changeset 21336:e11adc9fc752

(XARGMATCH): Define to return a value once again. (XARGCASEMATCH): Likewise.
author Jim Meyering <jim@meyering.net>
date Sat, 16 Jan 1999 15:12:04 +0000
parents 1459afea01f0
children e5cb4efcffac
files lib/argmatch.h
diffstat 1 files changed, 30 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/lib/argmatch.h	Sat Jan 16 15:06:41 1999 +0000
+++ b/lib/argmatch.h	Sat Jan 16 15:12:04 1999 +0000
@@ -53,17 +53,21 @@
 # define ARGCASEMATCH(Arg, Arglist, Vallist) \
   argcasematch ((Arg), (Arglist), (const char *) (Vallist), sizeof (*(Vallist)))
 
-
+/* Function called when xargmatch failed.  Should not return.  By
+   default, set to a function calling the macro ARGMATCH_EXIT_FAILURE
+   which, by default is `exit (2)'.*/
+typedef void (*argmatch_exit_fn) PARAMS ((void));
+extern argmatch_exit_fn argmatch_exit_failure;
 
 /* Report on stderr why argmatch failed.  Report correct values. */
 
 void argmatch_invalid
-  PARAMS ((const char *kind, const char *value, int problem));
+  PARAMS ((const char *context, 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(Context, Value, Problem) \
+  argmatch_invalid ((Context), (Value), (Problem))
 
 
 
@@ -74,29 +78,32 @@
 	   const char *vallist, size_t valsize));
 
 # define ARGMATCH_VALID(Arglist, Vallist) \
-  argmatch_valid (Arglist, (const char *) Vallist, sizeof (*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.  */
+/* Same as argmatch, but upon failure, reports a explanation on the
+   failure, and exits using the function EXIT_FN. */
+
+int __xargmatch_internal
+  PARAMS ((const char *context,
+	   const char *arg, const char *const *arglist,
+	   const char *vallist, size_t valsize,
+	   int case_sensitive, argmatch_exit_fn exit_fn));
+
+/* Programmer friendly interface to __xargmatch_internal. */
 
-# 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)
+# define XARGMATCH(Context, Arg, Arglist, Vallist)			\
+  (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist),	\
+                                  (const char *) (Vallist),	\
+				  sizeof (*(Vallist)),		\
+				  1, argmatch_exit_failure)])
 
+# define XARGCASEMATCH(Context, Arg, Arglist, Vallist)		\
+  (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist),	\
+                                  (const char *) (Vallist),	\
+				  sizeof (*(Vallist)),		\
+				  0, argmatch_exit_failure)])
 
 /* Convert a value into a corresponding argument. */