X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fisento.c;h=114c540db0a74deced8430e14112ee040142c718;hb=71286ffd9a52c6b8d3c008e60799cddff292f1f6;hp=8bab86c74fbb60711d204cb5d3754de3355fe4b5;hpb=fabac8c0e597d6398c877251652b1a351a93b687;p=cascardo%2Fdeclara.git diff --git a/lib/isento.c b/lib/isento.c index 8bab86c..114c540 100644 --- a/lib/isento.c +++ b/lib/isento.c @@ -32,50 +32,42 @@ static int isento_totais_update(struct declaracao *dec, struct isento *isento) int r = 0; switch (isento->codigo) { case 82: + isento->exclusivo = 0; r = totais_add(dec, "DOACOES", isento->valor); - r += totais_add(dec, "ISENTOS", isento->valor); - if (isento->dependente) { - r += totais_add(dec, "ISENTOSDEP", isento->valor); - } else { - r += totais_add(dec, "ISENTOSTIT", isento->valor); - } break; case 93: + isento->exclusivo = 0; r = totais_add(dec, "INDENIZACOES", isento->valor); - r += totais_add(dec, "ISENTOS", isento->valor); - if (isento->dependente) { - r += totais_add(dec, "ISENTOSDEP", isento->valor); - } else { - r += totais_add(dec, "ISENTOSTIT", isento->valor); - } break; case 96: + isento->exclusivo = 1; r = totais_add(dec, "PLR", isento->valor); - r += totais_add(dec, "EXCLUSIVOS", isento->valor); - if (isento->dependente) { - r += totais_add(dec, "EXCLUSIVOSDEP", isento->valor); - } else { - r += totais_add(dec, "EXCLUSIVOSTIT", isento->valor); - } + break; + case 97: break; case 98: + isento->exclusivo = 0; r = totais_add(dec, "POUPANCA", isento->valor); - r += totais_add(dec, "ISENTOS", isento->valor); - if (isento->dependente) { - r += totais_add(dec, "ISENTOSDEP", isento->valor); - } else { - r += totais_add(dec, "ISENTOSTIT", isento->valor); - } break; case 99: + isento->exclusivo = 1; r = totais_add(dec, "APLICACOES", isento->valor); + break; + } + if (isento->exclusivo) { r += totais_add(dec, "EXCLUSIVOS", isento->valor); if (isento->dependente) { r += totais_add(dec, "EXCLUSIVOSDEP", isento->valor); } else { r += totais_add(dec, "EXCLUSIVOSTIT", isento->valor); } - break; + } else { + r += totais_add(dec, "ISENTOS", isento->valor); + if (isento->dependente) { + r += totais_add(dec, "ISENTOSDEP", isento->valor); + } else { + r += totais_add(dec, "ISENTOSTIT", isento->valor); + } } return r; } @@ -87,6 +79,8 @@ void isento_free(void *pointer) free(isento->cnpj); if (isento->nome) free(isento->nome); + if (isento->descricao) + free(isento->descricao); free(isento); } @@ -94,6 +88,8 @@ static int isento_cmp(void *p1, void *p2) { struct isento *r1 = p1; struct isento *r2 = p2; + if (r1->exclusivo != r2->exclusivo) + return r2->exclusivo - r1->exclusivo; /* O rendimento maior vem primeiro. */ if (r1->valor > r2->valor) return -1; @@ -107,22 +103,23 @@ 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_llong(args[4], &isento->valor); - if (!isento->cnpj || !isento->nome) { - isento_free(isento); - return NULL; + + isento->exclusivo = 0; + if (!strcmp(args[0], "exclusivo")) { + isento->exclusivo = 1; } + + 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 (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; } @@ -130,6 +127,15 @@ static struct isento * isento_new(char **args, int argc) isento_free(isento); return NULL; } + if (argc == 7) { + r = set_string(args[6], &isento->descricao); + if (r < 0) { + isento_free(isento); + return NULL; + } + } else { + isento->descricao = NULL; + } return isento; } @@ -137,7 +143,7 @@ static int run_isento(struct declaracao *dec, char **args, int argc) { struct isento *isento; int r; - if (argc != 5 && argc != 6) + if (argc < 5 || argc > 7) return -EINVAL; isento = isento_new(args, argc); if (!isento) @@ -146,13 +152,13 @@ static int run_isento(struct declaracao *dec, char **args, int argc) isento_free(isento); return -EINVAL; } - r = list_insert_ordered(&dec->isentos, isento, isento_cmp); - if (r < 0) { + r = isento_totais_update(dec, isento); + if (r) { isento_free(isento); return r; } - r = isento_totais_update(dec, isento); - if (r) { + r = list_insert_ordered(&dec->isentos, isento, isento_cmp); + if (r < 0) { isento_free(isento); return r; } @@ -163,9 +169,17 @@ void isento_salva(struct declaracao *dec, FILE *f) { int i; struct isento *j; - for (i = 0; j = list_get(dec->isentos, i); i++) - fprintf(f, "isento %d \"%s\" \"%s\" %lld %d\n", + for (i = 0; j = list_get(dec->isentos, i); i++) { + if (j->codigo == 97 && j->exclusivo) + fprintf(f, "exclusivo "); + else + fprintf(f, "isento "); + fprintf(f, "%d \"%s\" \"%s\" %lld %d", j->codigo, j->cnpj, j->nome, j->valor, j->dependente); + if (j->descricao) + fprintf(f, " \"%s\"", j->descricao); + fprintf(f, "\n"); + } } static struct cmd cmd_isento = { @@ -173,9 +187,15 @@ static struct cmd cmd_isento = { .run = run_isento, }; +static struct cmd cmd_exclusivo = { + .name = "exclusivo", + .run = run_isento, +}; + int isento_cmd_init(void) { cmd_add(&cmd_isento); + cmd_add(&cmd_exclusivo); return 0; }