(__attribute__): Protect against redefinition.
[gnulib.git] / lib / argmatch.h
index cb54fd6..d3f25cc 100644 (file)
 #  endif  /* GCC.  */
 # endif  /* Not PARAMS.  */
 
+/* Assert there are as many real arguments as there are values
+   (argument list ends with a NULL guard).  There is no execution
+   cost, since it will be statically evalauted to `assert (0)' or
+   `assert (1)'.  Unfortunately there is no -Wassert-0. */
+
+# undef ARRAY_CARDINALITY
+# define ARRAY_CARDINALITY(Array) (sizeof ((Array)) / sizeof (*(Array)))
+
+# define ARGMATCH_ASSERT(Arglist, Vallist)      \
+  assert (ARRAY_CARDINALITY ((Arglist)) == ARRAY_CARDINALITY ((Vallist)) + 1)
+
 /* Return the index of the element of ARGLIST (NULL terminated) that
    matches with ARG.  If VALLIST is not NULL, then use it to resolve
    false ambiguities (i.e., different matches of ARG but corresponding
@@ -53,11 +64,11 @@ int argcasematch
 # 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)'.*/
+/* xargmatch calls this function when it fails.  This function should not
+   return.  By default, this is a function that calls ARGMATCH_DIE which
+   in turn defaults to `exit (EXIT_FAILURE)'.  */
 typedef void (*argmatch_exit_fn) PARAMS ((void));
-extern argmatch_exit_fn argmatch_exit_failure;
+extern argmatch_exit_fn argmatch_die;
 
 /* Report on stderr why argmatch failed.  Report correct values. */
 
@@ -97,13 +108,13 @@ int __xargmatch_internal
   (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist), \
                                   (const char *) (Vallist),    \
                                  sizeof (*(Vallist)),          \
-                                 1, argmatch_exit_failure)])
+                                 1, argmatch_die)])
 
 # define XARGCASEMATCH(Context, Arg, Arglist, Vallist)         \
   (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist), \
                                   (const char *) (Vallist),    \
                                  sizeof (*(Vallist)),          \
-                                 0, argmatch_exit_failure)])
+                                 0, argmatch_die)])
 
 /* Convert a value into a corresponding argument. */