summaryrefslogtreecommitdiff
path: root/lib/argmatch.h
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1999-01-16 15:12:04 +0000
committerJim Meyering <jim@meyering.net>1999-01-16 15:12:04 +0000
commitf28d5ba1256093dd76f809519f9535bf4807ee6c (patch)
tree20750243f3f40926134edc54614aab6f5ad93840 /lib/argmatch.h
parentf22e54a579799ee0fd754984de5c6e8c54cd09d6 (diff)
downloadcoreutils-f28d5ba1256093dd76f809519f9535bf4807ee6c.tar.xz
(XARGMATCH): Define to return a value once again.
(XARGCASEMATCH): Likewise.
Diffstat (limited to 'lib/argmatch.h')
-rw-r--r--lib/argmatch.h59
1 files changed, 33 insertions, 26 deletions
diff --git a/lib/argmatch.h b/lib/argmatch.h
index 9772dcc1d..cb54fd6f3 100644
--- a/lib/argmatch.h
+++ b/lib/argmatch.h
@@ -53,17 +53,21 @@ 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)'.*/
+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 @@ void argmatch_valid
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)
+ argmatch_valid (Arglist, (const char *) Vallist, sizeof (*(Vallist)))
+
+
+
+/* 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(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. */