Simplifica set_int e set_string.
[cascardo/declara.git] / lib / util.h
index 255a329..9880230 100644 (file)
 #ifndef _UTIL_H
 #define _UTIL_H
 
-int set_llong(char *str, long long *val);
-int set_int(char **args, int argc, int *val);
-int set_string(char **args, int argc, char **str);
+#include <errno.h>
 
-#define SET_INT_(suffix, command, attr) \
+int set_llong(char *arg, long long *val);
+int set_int(char *arg, int *val);
+int set_string(char *arg, char **str);
+
+#define SET_VAL_(suffix, command, attr, type, param, func, help_) \
 static int run_##suffix(struct declaracao *dec, char **args, int argc) \
 { \
-       int val; \
-       int r = set_int(args, argc, &val); \
+       type val; \
+       int r; \
+       if (argc != 2) { \
+               dec_set_error(dec, "Comando %s espera um parĂ¢metro "#param".\n", args[0]); \
+               return -EINVAL; \
+       } \
+       r = func(args[1], &val); \
        if (r) \
                return r; \
        dec->attr = val; \
@@ -36,25 +43,12 @@ static int run_##suffix(struct declaracao *dec, char **args, int argc) \
 static struct cmd cmd_##suffix = { \
        .name = #command, \
        .run = run_##suffix, \
+       .help = help_, \
 };
 
+#define SET_INT_(suffix, cmd, attr) SET_VAL_(suffix, cmd, attr, int, inteiro, set_int, NULL)
+#define SET_STRING_(suffix, cmd, attr) SET_VAL_(suffix, cmd, attr, char *, texto, set_string, NULL)
 #define SET_INT(attr) SET_INT_(attr, attr, attr)
-
-#define SET_STRING_(suffix, command, attr) \
-static int run_##suffix(struct declaracao *dec, char **args, int argc) \
-{ \
-       char *val; \
-       int r = set_string(args, argc, &val); \
-       if (r) \
-               return r; \
-       dec->attr = val; \
-       return 0; \
-} \
-static struct cmd cmd_##suffix = { \
-       .name = #command, \
-       .run = run_##suffix, \
-}
-
 #define SET_STRING(attr) SET_STRING_(attr, attr, attr)
 
 static inline long long reais(long long val)