Utiliza crc32 da zlib para cálculo do campo de controle.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Tue, 4 Aug 2015 09:20:46 +0000 (06:20 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Tue, 4 Aug 2015 09:20:46 +0000 (06:20 -0300)
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.

configure.ac
lib/gera.c

index 2803970..52b450f 100644 (file)
@@ -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)
index 7965b23..dc4a92e 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <zlib.h>
 #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) {