Simplifica set_int e set_string.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sat, 14 Jan 2017 15:08:37 +0000 (15:08 +0000)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Sat, 14 Jan 2017 15:08:37 +0000 (15:08 +0000)
set_int e set_string eram utilizados com argumentos dados a um comando e
sempre esperavam dois argumentos apenas, o que fazia com que seu uso não
fosse legível a não ser pelas macros SET_INT_ e SET_STRING_.

Movendo a lógica de teste de argumentos para as macros, foi possível
simplificar set_int e set_string e tornar o uso de set_int em alguns
casos mais legível, bem como passar a utilizar set_string para verificar
erros de alocação de memória.

As macros SET_INT_ e SET_STRING_ foram também unificadas em SET_VAL_,
porém mantidas com os argumentos que aceitavam anteriormente, mas
fazendo uso desta última. SET_VAL_ foi melhorada para aceitar um texto
de ajuda e definir um texto de erro mais amigável ao usuário.

lib/bem.c
lib/conjuge.c
lib/dependente.c
lib/isento.c
lib/pagamento.c
lib/util.c
lib/util.h

index 66675f8..c62a7ba 100644 (file)
--- a/lib/bem.c
+++ b/lib/bem.c
@@ -75,15 +75,10 @@ static struct bem * bem_new(char **args)
        int r = 0;
        bem = malloc(sizeof(*bem));
        memset(bem, 0, sizeof(*bem));
-       bem->descricao = strdup(args[2]);
-       /* TODO: consertar set_int para funcionar como set_llong */
-       r += set_int(args, 2, &bem->codigo);
+       r += set_int(args[1], &bem->codigo);
+       r += set_string(args[2], &bem->descricao);
        r += set_llong(args[3], &bem->valor_anterior);
        r += set_llong(args[4], &bem->valor);
-       if (!bem->descricao) {
-               bem_free(bem);
-               return NULL;
-       }
        if (r < 0 || bem->codigo < 0 ||
            bem->valor_anterior < 0 || bem->valor < 0) {
                bem_free(bem);
index a0631b2..101ef4c 100644 (file)
@@ -36,20 +36,15 @@ static int conjuge_parse(struct declaracao *dec, char **args)
 {
        int r = 0;
 
-       dec->conjuge.cpf = strdup(args[1]);
-
+       r += set_string(args[1], &dec->conjuge.cpf);
        r += set_llong(args[2], &dec->conjuge.base);
        r += set_llong(args[3], &dec->conjuge.imposto);
        r += set_llong(args[4], &dec->conjuge.isento);
        r += set_llong(args[5], &dec->conjuge.exclusivo);
        r += set_llong(args[6], &dec->conjuge.rendpj_exigibilidade_suspensa);
        r += set_llong(args[7], &dec->conjuge.total);
-       r += set_int(args + 7, 2, &dec->conjuge.entregou);
+       r += set_int(args[8], &dec->conjuge.entregou);
 
-       if (!dec->conjuge.cpf) {
-               conjuge_free(dec);
-               return -ENOMEM;
-       }
        if (r < 0 || dec->conjuge.base < 0 || dec->conjuge.imposto < 0 ||
            dec->conjuge.isento < 0 || dec->conjuge.exclusivo < 0 ||
            dec->conjuge.rendpj_exigibilidade_suspensa < 0 ||
index 5a789c1..eb938ce 100644 (file)
@@ -45,15 +45,10 @@ static struct dependente * dependente_new(char **args)
        struct dependente *dependente;
        int r = 0;
        dependente = malloc(sizeof(*dependente));
-       /* TODO: consertar set_int para funcionar como set_llong */
-       r += set_int(args, 2, &dependente->codigo);
-       dependente->nome = strdup(args[2]);
-       dependente->dn = strdup(args[3]);
-       dependente->cpf = strdup(args[4]);
-       if (!dependente->nome || !dependente->dn || !dependente->cpf) {
-               dependente_free(dependente);
-               return NULL;
-       }
+       r += set_int(args[1], &dependente->codigo);
+       r += set_string(args[2], &dependente->nome);
+       r += set_string(args[3], &dependente->dn);
+       r += set_string(args[4], &dependente->cpf);
        if (r < 0 || dependente->codigo < 0) {
                dependente_free(dependente);
                return NULL;
index 8bab86c..9e99154 100644 (file)
@@ -107,22 +107,18 @@ static struct isento * isento_new(char **args, int argc)
        struct isento *isento;
        int r = 0;
        isento = malloc(sizeof(*isento));
-       isento->cnpj = strdup(args[2]);
-       isento->nome = strdup(args[3]);
-       /* TODO: consertar set_int para funcionar como set_llong */
-       r += set_int(args, 2, &isento->codigo);
+
+       r += set_int(args[1], &isento->codigo);
+       r += set_string(args[2], &isento->cnpj);
+       r += set_string(args[3], &isento->nome);
        r += set_llong(args[4], &isento->valor);
-       if (!isento->cnpj || !isento->nome) {
-               isento_free(isento);
-               return NULL;
-       }
        if (r < 0 || isento->codigo < 0 ||
            isento->valor < 0) {
                isento_free(isento);
                return NULL;
        }
        if (argc == 6) {
-               r = set_int(&args[4], 2, &isento->dependente);
+               r = set_int(args[5], &isento->dependente);
        } else {
                isento->dependente = 0;
        }
index 959a02c..988790e 100644 (file)
@@ -74,23 +74,18 @@ static struct pagamento * pagamento_new(char **args, int argc)
        struct pagamento *pagamento;
        int r = 0;
        pagamento = malloc(sizeof(*pagamento));
-       pagamento->cnpj = strdup(args[2]);
-       pagamento->nome = strdup(args[3]);
-       /* TODO: consertar set_int para funcionar como set_llong */
-       r += set_int(args, 2, &pagamento->codigo);
+       r += set_int(args[1], &pagamento->codigo);
+       r += set_string(args[2], &pagamento->cnpj);
+       r += set_string(args[3], &pagamento->nome);
        r += set_llong(args[4], &pagamento->pagamento);
        r += set_llong(args[5], &pagamento->reembolso);
-       if (!pagamento->cnpj || !pagamento->nome) {
-               pagamento_free(pagamento);
-               return NULL;
-       }
        if (r < 0 || pagamento->codigo < 0 ||
            pagamento->pagamento < 0 || pagamento->reembolso < 0) {
                pagamento_free(pagamento);
                return NULL;
        }
        if (argc == 7) {
-               r = set_int(&args[5], 2, &pagamento->dependente);
+               r = set_int(args[6], &pagamento->dependente);
        } else {
                pagamento->dependente = 0;
        }
index eb2ee8e..bf3352f 100644 (file)
 #include <fcntl.h>
 #include <unistd.h>
 
-int set_llong(char *str, long long *val)
+int set_llong(char *arg, long long *val)
 {
        char *end = NULL;
        errno = 0;
-       *val = strtoll(str, &end, 0);
+       *val = strtoll(arg, &end, 0);
        if (end && *end)
                return -EINVAL;
        if (errno == ERANGE)
@@ -36,13 +36,11 @@ int set_llong(char *str, long long *val)
        return 0;
 }
 
-int set_int(char **args, int argc, int *val)
+int set_int(char *arg, int *val)
 {
        char *end = NULL;
-       if (argc != 2)
-               return -EINVAL;
        errno = 0;
-       *val = strtol(args[1], &end, 0);
+       *val = strtol(arg, &end, 0);
        if (end && *end)
                return -EINVAL;
        if (errno == ERANGE)
@@ -50,11 +48,9 @@ int set_int(char **args, int argc, int *val)
        return 0;
 }
 
-int set_string(char **args, int argc, char **str)
+int set_string(char *arg, char **str)
 {
-       if (argc != 2)
-               return -EINVAL;
-       *str = strdup(args[1]);
+       *str = strdup(arg);
        if (!*str)
                return -errno;
        return 0;
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)