Passa nĂºmero de argumentos para comandos.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sun, 26 Apr 2015 18:43:16 +0000 (18:43 +0000)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Mon, 11 May 2015 00:39:44 +0000 (00:39 +0000)
base.c
cmd.c
cmd.h

diff --git a/base.c b/base.c
index fdc7980..c6b057d 100644 (file)
--- a/base.c
+++ b/base.c
 #include <string.h>
 #include <errno.h>
 
-static int set_int(char **args, int *val)
+static int set_int(char **args, int argc, int *val)
 {
        char *end = NULL;
-       if (args[0] == NULL || args[1] == NULL)
+       if (argc != 2)
                return -EINVAL;
        errno = 0;
        *val = strtol(args[1], &end, 0);
@@ -36,9 +36,9 @@ static int set_int(char **args, int *val)
        return 0;
 }
 
-static int set_string(char **args, char **str)
+static int set_string(char **args, int argc, char **str)
 {
-       if (args[0] == NULL || args[1] == NULL)
+       if (argc != 2)
                return -EINVAL;
        *str = strdup(args[1]);
        if (!*str)
@@ -47,10 +47,10 @@ static int set_string(char **args, char **str)
 }
 
 #define SET_INT(attr) \
-static int run_##attr(struct declaracao *dec, char **args) \
+static int run_##attr(struct declaracao *dec, char **args, int argc) \
 { \
        int val; \
-       int r = set_int(args, &val); \
+       int r = set_int(args, argc, &val); \
        if (r) \
                return r; \
        dec->attr = val; \
@@ -62,10 +62,10 @@ static struct cmd cmd_##attr = { \
 };
 
 #define SET_STRING(attr) \
-static int run_##attr(struct declaracao *dec, char **args) \
+static int run_##attr(struct declaracao *dec, char **args, int argc) \
 { \
        char *val; \
-       int r = set_string(args, &val); \
+       int r = set_string(args, argc, &val); \
        if (r) \
                return r; \
        dec->attr = val; \
@@ -80,7 +80,7 @@ SET_INT(ano);
 SET_STRING(cpf);
 SET_STRING(nome);
 
-static int run_dump(struct declaracao *dec, char **args)
+static int run_dump(struct declaracao *dec, char **args, int argc)
 {
        printf("ano: %d\n", dec->ano);
        printf("cpf: %s\n", dec->cpf);
diff --git a/cmd.c b/cmd.c
index ec7b6dc..65398de 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -42,14 +42,16 @@ int cmd_run(struct declaracao *dec, char *line)
        char **args = tokens_new(line);
        struct cmd *cmd;
        int r;
+       int argc;
        if (!args)
                return -errno;
+       for (argc = 0; args[argc]; argc++);
        cmd = pmhash_get(cmds, args[0]);
        if (!cmd || !cmd->run) {
                tokens_free(args);
                return -EINVAL;
        }
-       r = cmd->run(dec, args);
+       r = cmd->run(dec, args, argc);
        tokens_free(args);
        return r;
 }
diff --git a/cmd.h b/cmd.h
index e3f1250..24ff5e0 100644 (file)
--- a/cmd.h
+++ b/cmd.h
@@ -23,7 +23,7 @@
 
 struct cmd {
        char *name;
-       int (*run) (struct declaracao *dec, char **args);
+       int (*run) (struct declaracao *dec, char **args, int argc);
 };
 
 int cmd_init(void);