]> git.ozlabs.org Git - ccan/blobdiff - ccan/opt/opt.h
opt: add integer helpers that accept k, M, G, T, P, E suffixes
[ccan] / ccan / opt / opt.h
index 9075ceed37e8c0e61e0dedb1a94df6ba4efede3f..7049fffc1c7fa57b8e3b1296da56fc8dc183addd 100644 (file)
@@ -1,3 +1,4 @@
+/* Licensed under GPLv3+ - see LICENSE file for details */
 #ifndef CCAN_OPT_H
 #define CCAN_OPT_H
 #include <ccan/compiler/compiler.h>
@@ -279,6 +280,23 @@ void opt_show_longval(char buf[OPT_SHOW_LEN], const long *l);
 char *opt_set_ulongval(const char *arg, unsigned long *ul);
 void opt_show_ulongval(char buf[OPT_SHOW_LEN], const unsigned long *ul);
 
+/* the following setting functions accept k, M, G, T, P, or E suffixes, which
+   multiplies the numeric value by the corresponding power of 1000 or 1024
+   (for the _si and _bi versions, respectively).
+ */
+char *opt_set_intval_bi(const char *arg, int *i);
+char *opt_set_intval_si(const char *arg, int *i);
+char *opt_set_uintval_bi(const char *arg, unsigned int *u);
+char *opt_set_uintval_si(const char *arg, unsigned int *u);
+char *opt_set_longval_bi(const char *arg, long *l);
+char *opt_set_longval_si(const char *arg, long *l);
+char *opt_set_ulongval_bi(const char *arg, unsigned long *ul);
+char *opt_set_ulongval_si(const char *arg, unsigned long *ul);
+char *opt_set_longlongval_bi(const char *arg, long long *ll);
+char *opt_set_longlongval_si(const char *arg, long long *ll);
+char *opt_set_ulonglongval_bi(const char *arg, unsigned long long *ll);
+char *opt_set_ulonglongval_si(const char *arg, unsigned long long *ll);
+
 /* Increment. */
 char *opt_inc_intval(int *i);
 
@@ -315,22 +333,22 @@ struct opt_table {
 /* Resolves to the four parameters for non-arg callbacks. */
 #define OPT_CB_NOARG(cb, arg)                          \
        OPT_NOARG,                                      \
-       cast_if_any(char *(*)(void *), (cb), 0?(cb):(cb),\
-                   char *(*)(typeof(*(arg))*),         \
-                   char *(*)(const typeof(*(arg))*),   \
-                   char *(*)(const void *)),           \
+       typesafe_cb_cast3(char *(*)(void *),    \
+                         char *(*)(typeof(*(arg))*),   \
+                         char *(*)(const typeof(*(arg))*),     \
+                         char *(*)(const void *), (cb)),       \
        NULL, NULL
 
 /* Resolves to the four parameters for arg callbacks. */
 #define OPT_CB_ARG(cb, show, arg)                                      \
        OPT_HASARG, NULL,                                               \
-       cast_if_any(char *(*)(const char *,void *), (cb), 0?(cb):(cb),  \
-                   char *(*)(const char *, typeof(*(arg))*),           \
-                   char *(*)(const char *, const typeof(*(arg))*),     \
-                   char *(*)(const char *, const void *)),             \
-       cast_if_type(void (*)(char buf[], const void *), (show),        \
-                    0?(show):(show),                                   \
-                    void (*)(char buf[], const typeof(*(arg))*))
+       typesafe_cb_cast3(char *(*)(const char *,void *),       \
+                         char *(*)(const char *, typeof(*(arg))*),     \
+                         char *(*)(const char *, const typeof(*(arg))*), \
+                         char *(*)(const char *, const void *),        \
+                         (cb)),                                        \
+       typesafe_cb_cast(void (*)(char buf[], const void *),            \
+                        void (*)(char buf[], const typeof(*(arg))*), (show))
 
 /* Non-typesafe register function. */
 void _opt_register(const char *names, enum opt_type type,