From: Thadeu Lima de Souza Cascardo Date: Tue, 4 Aug 2015 09:20:46 +0000 (-0300) Subject: Utiliza crc32 da zlib para cálculo do campo de controle. X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fdeclara.git;a=commitdiff_plain;h=31f77ccf8a5ebab026ede19b1cf39ed5ba331294 Utiliza crc32 da zlib para cálculo do campo de controle. O campo de controle de todos os registros é calculado usando CRC32. A zlib tem uma função de fácil uso chamada crc32. Além do mais, a zlib é uma biblioteca presente em vários sistemas, de alta portabilidade. --- diff --git a/configure.ac b/configure.ac index 2803970..52b450f 100644 --- a/configure.ac +++ b/configure.ac @@ -4,5 +4,10 @@ AM_INIT_AUTOMAKE LT_INIT AC_PROG_CC AC_PROG_INSTALL + +dnl Checking for zlib. +AC_SEARCH_LIBS([crc32], [z], [], + AC_MSG_ERROR([could not find zlib])) + AC_CONFIG_HEADERS([config.h]) AC_OUTPUT(Makefile lib/Makefile src/Makefile test/Makefile) diff --git a/lib/gera.c b/lib/gera.c index 7965b23..dc4a92e 100644 --- a/lib/gera.c +++ b/lib/gera.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "declaracao.h" #include "cmd.h" #include "rendimento.h" @@ -150,8 +151,6 @@ static void gera_header(struct declaracao *dec, FILE *f) /* Fim das mudanças de 2015 */ fprintf(f, " "); /* Teste PGD, FILLER2 */ - fprintf(f, "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_contribuinte(struct declaracao *dec, FILE *f) @@ -198,8 +197,6 @@ static void gera_contribuinte(struct declaracao *dec, FILE *f) fprintf(f, "%-10.10s", dec->recibo ?: ""); /* Recibo última declaração ano anterior */ fprintf(f, "A"); /* Declaração de Ajuste */ fprintf(f, "%-11.11s", ""); /* TODO: CPF procurador */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_simples(struct declaracao *dec, FILE *f) @@ -235,8 +232,6 @@ static void gera_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: imposto pago exterior */ fprintf(f, "%013lld", 0); /* TODO: imposto devido sem rendimento exterior */ fprintf(f, "%013lld", 0); /* TODO: limite imposto pago exterior */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_totais_simples(struct declaracao *dec, FILE *f) @@ -299,8 +294,6 @@ static void gera_totais_simples(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", 0); /* TODO: imposto ganho líquido renda variável */ fprintf(f, "%013lld", 0); /* TODO: imposto devido ganho capital moeda estrangeira */ fprintf(f, "%013lld", 0); /* TODO: imposto pago exterior */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_completa(struct declaracao *dec, FILE *f) @@ -309,8 +302,6 @@ static void gera_completa(struct declaracao *dec, FILE *f) fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%-14.14s", ""); /* TODO: CNPJ maior */ /* FIXME: completar campos */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_totais_completa(struct declaracao *dec, FILE *f) @@ -318,8 +309,6 @@ static void gera_totais_completa(struct declaracao *dec, FILE *f) fprintf(f, "20"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ /* FIXME: completar campos */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_trailler(struct declaracao *dec, FILE *f) @@ -335,8 +324,6 @@ static void gera_trailler(struct declaracao *dec, FILE *f) ; else fprintf(f, "%05d", dec->linhas[i]); - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_reciboheader(struct declaracao *dec, FILE *f) @@ -344,8 +331,6 @@ static void gera_reciboheader(struct declaracao *dec, FILE *f) fprintf(f, "HR"); fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%-3.3s", ""); /* FILLER */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_recibodetalhe(struct declaracao *dec, FILE *f) @@ -384,8 +369,6 @@ static void gera_recibodetalhe(struct declaracao *dec, FILE *f) fprintf(f, "%-13.13s", dec->contacorrente); /* numero conta */ fprintf(f, "%-2.2s", dec->dvconta); /* DV conta */ fprintf(f, "%013lld", 0); /* TODO: imposto alienacao moeda estrangeira em especie */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_recibotrailler(struct declaracao *dec, FILE *f) @@ -394,8 +377,6 @@ static void gera_recibotrailler(struct declaracao *dec, FILE *f) fprintf(f, "%s", dec->cpf); /* CPF: 11 dígitos */ fprintf(f, "%-3.3s", ""); /* FILLER */ fprintf(f, "%-10.10s", "0000000000"); /* FIXME: hash */ - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_rendimento(struct declaracao *dec, FILE *f) @@ -412,8 +393,6 @@ static void gera_rendimento(struct declaracao *dec, FILE *f) fprintf(f, "%013lld", r->imposto); fprintf(f, "%-8.8s", r->saida); fprintf(f, "%013lld", r->imposto_13o); - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_pagamento(struct declaracao *dec, FILE *f) @@ -433,8 +412,6 @@ static void gera_pagamento(struct declaracao *dec, FILE *f) fprintf(f, "2"); /* Titular (T), Dependente (D), Alimentando (A), FIXME */ fprintf(f, "T"); - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } static void gera_bem(struct declaracao *dec, FILE *f) @@ -474,13 +451,8 @@ static void gera_bem(struct declaracao *dec, FILE *f) /* Número de chave */ fprintf(f, "%05d", dec->linhas[27] + 1); - - fprintf(f, "%-10.10s", "0000000000"); /* FIXME: controle */ - fprintf(f, "\r\n"); } - - typedef void (gera_linha)(struct declaracao *dec, FILE *f); static int wrap(gera_linha fn, struct declaracao *dec, FILE *f) @@ -490,12 +462,19 @@ static int wrap(gera_linha fn, struct declaracao *dec, FILE *f) size_t bsize; int linha; int r; + uLong c = crc32(0L, Z_NULL, 0); m = open_memstream(&buf, &bsize); if (!m) { return -errno; } fn(dec, m); dec->linhas[0]++; + fflush(m); + + /* Calcula CRC32 para campo de controle dos registros. */ + c = crc32(c, buf, bsize); + fprintf(m, "%010ld\r\n", c); + fclose(m); r = sscanf(buf, "%2d", &linha); if (r == 1 && linha >= 0 && linha < 100) {