From 690585305df6fd3260de892b9ffc6ab3982323d8 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Sat, 25 Jul 2015 13:40:44 -0300 Subject: [PATCH] Usa um wrapper para gerar linhas. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Escreve a linha em uma área de memória, executa algumas ações, como incrementar o número de linhas, e grava no arquivo. Este mecanismo permite outros patches futuros, como cálculo do valor de código de controle. --- gera.c | 69 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/gera.c b/gera.c index 2e74e5e..a46d94b 100644 --- a/gera.c +++ b/gera.c @@ -23,10 +23,10 @@ #include #include #include +#include static void gera_header(struct declaracao *dec, FILE *f) { - dec->linhas[0]++; fprintf(f, "IRPF "); fprintf(f, "%04d", dec->ano); /* Exercício */ fprintf(f, "%04d", dec->ano - 1); /* Ano base */ @@ -141,8 +141,6 @@ static void gera_header(struct declaracao *dec, FILE *f) static void gera_contribuinte(struct declaracao *dec, FILE *f) { - dec->linhas[0]++; - dec->linhas[16]++; fprintf(f, "16"); fprintf(f, "%s", dec->cpf); fprintf(f, "%-60.60s", dec->nome); @@ -190,8 +188,6 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) static void gera_simples(struct declaracao *dec, FILE *f) { - dec->linhas[0]++; - dec->linhas[17]++; fprintf(f, "17"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%013lld", 0); /* TODO: carnê leão */ @@ -226,8 +222,6 @@ static void gera_simples(struct declaracao *dec, FILE *f) static void gera_totais_simples(struct declaracao *dec, FILE *f) { - dec->linhas[0]++; - dec->linhas[18]++; fprintf(f, "18"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%013lld", dec->totalrendimento); /* TODO: rendimentos tributáveis */ @@ -290,8 +284,6 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) static void gera_completa(struct declaracao *dec, FILE *f) { - dec->linhas[0]++; - dec->linhas[19]++; fprintf(f, "19"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%-14.14s", ""); /* TODO: CNPJ maior */ @@ -302,8 +294,6 @@ static void gera_completa(struct declaracao *dec, FILE *f) static void gera_totais_completa(struct declaracao *dec, FILE *f) { - dec->linhas[0]++; - dec->linhas[20]++; fprintf(f, "20"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ /* FIXME: completar campos */ @@ -387,28 +377,65 @@ static void gera_recibotrailler(struct declaracao *dec, FILE *f) fprintf(f, "\r\n"); } +typedef void (gera_linha)(struct declaracao *dec, FILE *f); + +static int wrap(gera_linha fn, struct declaracao *dec, FILE *f) +{ + FILE *m; + char *buf = NULL; + size_t bsize; + int linha; + int r; + m = open_memstream(&buf, &bsize); + if (!m) { + return -errno; + } + fn(dec, m); + dec->linhas[0]++; + fclose(m); + r = sscanf(buf, "%2d", &linha); + if (r == 1 && linha >= 0 && linha < 100) { + dec->linhas[linha]++; + } + fwrite(buf, bsize, 1, f); + free(buf); + return 0; +} + static int gera(struct declaracao *dec, char *filename) { FILE *f; + int r; + +#define W(fn, dec, f) \ + do { \ + r = wrap(fn, dec, f); \ + if (r < 0) \ + goto out; \ + } while (0); + f = fopen(filename, "w"); if (!f) return -errno; memset(dec->linhas, 0, sizeof(dec->linhas)); - gera_header(dec, f); - gera_contribuinte(dec, f); + W(gera_header, dec, f); + W(gera_contribuinte, dec, f); if (dec->tipo == COMPLETA) { - gera_completa(dec, f); - gera_totais_completa(dec, f); + W(gera_completa, dec, f); + W(gera_totais_completa, dec, f); } else { - gera_simples(dec, f); - gera_totais_simples(dec, f); + W(gera_simples, dec, f); + W(gera_totais_simples, dec, f); } - gera_trailler(dec, f); - gera_reciboheader(dec, f); - gera_recibodetalhe(dec, f); - gera_recibotrailler(dec, f); + W(gera_trailler, dec, f); + W(gera_reciboheader, dec, f); + W(gera_recibodetalhe, dec, f); + W(gera_recibotrailler, dec, f); fclose(f); return 0; +out: + fclose(f); + return r; } static int run_gera(struct declaracao *dec, char **args, int argc) -- 2.20.1