return parse_one_of(msg, realval, values_on_off, ARRAY_SIZE(values_on_off), p_err);
}
-int parse_mapping(int *argcp, char ***argvp, bool allow_all,
- int (*mapping_cb)(__u32 key, char *value, void *data),
- void *mapping_cb_data)
+int parse_mapping_gen(int *argcp, char ***argvp,
+ int (*key_cb)(__u32 *keyp, const char *key),
+ int (*mapping_cb)(__u32 key, char *value, void *data),
+ void *mapping_cb_data)
{
int argc = *argcp;
char **argv = *argvp;
break;
*colon = '\0';
- if (allow_all && matches(*argv, "all") == 0) {
- key = (__u32) -1;
- } else if (get_u32(&key, *argv, 0)) {
+ if (key_cb(&key, *argv)) {
ret = 1;
break;
}
*argvp = argv;
return ret;
}
+
+static int parse_mapping_num(__u32 *keyp, const char *key)
+{
+ return get_u32(keyp, key, 0);
+}
+
+int parse_mapping_num_all(__u32 *keyp, const char *key)
+{
+ if (matches(key, "all") == 0) {
+ *keyp = (__u32) -1;
+ return 0;
+ }
+ return parse_mapping_num(keyp, key);
+}
+
+int parse_mapping(int *argcp, char ***argvp, bool allow_all,
+ int (*mapping_cb)(__u32 key, char *value, void *data),
+ void *mapping_cb_data)
+{
+ if (allow_all)
+ return parse_mapping_gen(argcp, argvp, parse_mapping_num_all,
+ mapping_cb, mapping_cb_data);
+ else
+ return parse_mapping_gen(argcp, argvp, parse_mapping_num,
+ mapping_cb, mapping_cb_data);
+}