1/* argmatch.h -- definitions and prototypes for argmatch.c 2 Copyright (C) 1990, 1998, 1999 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software Foundation, 16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 17 18/* Written by David MacKenzie <djm@ai.mit.edu> 19 Modified by Akim Demaille <demaille@inf.enst.fr> */ 20 21#ifndef ARGMATCH_H_ 22# define ARGMATCH_H_ 1 23 24# if HAVE_CONFIG_H 25# include <config.h> 26# endif 27 28# include <sys/types.h> 29 30# ifndef PARAMS 31# if PROTOTYPES || (defined (__STDC__) && __STDC__) 32# define PARAMS(args) args 33# else 34# define PARAMS(args) () 35# endif /* GCC. */ 36# endif /* Not PARAMS. */ 37 38/* Assert there are as many real arguments as there are values 39 (argument list ends with a NULL guard). There is no execution 40 cost, since it will be statically evalauted to `assert (0)' or 41 `assert (1)'. Unfortunately there is no -Wassert-0. */ 42 43# undef ARRAY_CARDINALITY 44# define ARRAY_CARDINALITY(Array) (sizeof ((Array)) / sizeof (*(Array))) 45 46# define ARGMATCH_ASSERT(Arglist, Vallist) \ 47 assert (ARRAY_CARDINALITY ((Arglist)) == ARRAY_CARDINALITY ((Vallist)) + 1) 48 49/* Return the index of the element of ARGLIST (NULL terminated) that 50 matches with ARG. If VALLIST is not NULL, then use it to resolve 51 false ambiguities (i.e., different matches of ARG but corresponding 52 to the same values in VALLIST). */ 53 54int argmatch 55 PARAMS ((const char *arg, const char *const *arglist, 56 const char *vallist, size_t valsize)); 57int argcasematch 58 PARAMS ((const char *arg, const char *const *arglist, 59 const char *vallist, size_t valsize)); 60 61# define ARGMATCH(Arg, Arglist, Vallist) \ 62 argmatch ((Arg), (Arglist), (const char *) (Vallist), sizeof (*(Vallist))) 63 64# define ARGCASEMATCH(Arg, Arglist, Vallist) \ 65 argcasematch ((Arg), (Arglist), (const char *) (Vallist), sizeof (*(Vallist))) 66 67/* xargmatch calls this function when it fails. This function should not 68 return. By default, this is a function that calls ARGMATCH_DIE which 69 in turn defaults to `exit (EXIT_FAILURE)'. */ 70typedef void (*argmatch_exit_fn) PARAMS ((void)); 71extern argmatch_exit_fn argmatch_die; 72 73/* Report on stderr why argmatch failed. Report correct values. */ 74 75void argmatch_invalid 76 PARAMS ((const char *context, const char *value, int problem)); 77 78/* Left for compatibility with the old name invalid_arg */ 79 80# define invalid_arg(Context, Value, Problem) \ 81 argmatch_invalid ((Context), (Value), (Problem)) 82 83 84 85/* Report on stderr the list of possible arguments. */ 86 87void argmatch_valid 88 PARAMS ((const char *const *arglist, 89 const char *vallist, size_t valsize)); 90 91# define ARGMATCH_VALID(Arglist, Vallist) \ 92 argmatch_valid (Arglist, (const char *) Vallist, sizeof (*(Vallist))) 93 94 95 96/* Same as argmatch, but upon failure, reports a explanation on the 97 failure, and exits using the function EXIT_FN. */ 98 99int __xargmatch_internal 100 PARAMS ((const char *context, 101 const char *arg, const char *const *arglist, 102 const char *vallist, size_t valsize, 103 int case_sensitive, argmatch_exit_fn exit_fn)); 104 105/* Programmer friendly interface to __xargmatch_internal. */ 106 107# define XARGMATCH(Context, Arg, Arglist, Vallist) \ 108 (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist), \ 109 (const char *) (Vallist), \ 110 sizeof (*(Vallist)), \ 111 1, argmatch_die)]) 112 113# define XARGCASEMATCH(Context, Arg, Arglist, Vallist) \ 114 (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist), \ 115 (const char *) (Vallist), \ 116 sizeof (*(Vallist)), \ 117 0, argmatch_die)]) 118 119/* Convert a value into a corresponding argument. */ 120 121const char *argmatch_to_argument 122 PARAMS ((char const *value, const char *const *arglist, 123 const char *vallist, size_t valsize)); 124 125# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist) \ 126 argmatch_to_argument ((char const *) &(Value), (Arglist), \ 127 (const char *) (Vallist), sizeof (*(Vallist))) 128 129#endif /* ARGMATCH_H_ */ 130