Parse DEC file header.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Tue, 11 Jun 2013 21:18:13 +0000 (18:18 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Tue, 11 Jun 2013 21:18:13 +0000 (18:18 -0300)
Include fields from the header in a pmhash and introduce a function to
retrieve them. Some of those fields are needed to send the first message
to the server.

decfile.c
decfile.h

index ebffc9f..196f591 100644 (file)
--- a/decfile.c
+++ b/decfile.c
 #include <stdlib.h>
 #include <errno.h>
 #include <unistd.h>
+#include "pmhash.h"
 
 struct rnet_decfile {
        char *filename;
        FILE *file;
        char **lines;
        int lines_len;
+       struct pmhash *header;
 };
 
 /*
@@ -63,6 +65,17 @@ static void decfile_release_lines(struct rnet_decfile *decfile)
        decfile->lines = NULL;
 }
 
+static char * get_header(struct rnet_decfile *decfile);
+static int parse_header(struct pmhash *hash, char *buffer);
+
+static int decfile_parse_header(struct rnet_decfile *decfile)
+{
+       char *buffer = get_header(decfile);
+       if (!buffer || strlen(buffer) != 765)
+               return 1;
+       return parse_header(decfile->header, buffer);
+}
+
 static int decfile_parse(struct rnet_decfile *decfile)
 {
        char *buffer = NULL;
@@ -77,7 +90,8 @@ static int decfile_parse(struct rnet_decfile *decfile)
                buffer = NULL;
                len = 0;
        }
-       return 0;
+       if (!decfile_parse_header(decfile))
+               return 0;
 out:
        decfile_release_lines(decfile);
        return -1;
@@ -89,6 +103,9 @@ struct rnet_decfile * rnet_decfile_open(char *filename)
        decfile = malloc(sizeof(*decfile));
        if (!decfile)
                return NULL;
+       decfile->header = pmhash_new();
+       if (!decfile->header)
+               goto out_header;
        decfile->filename = strdup(filename);
        if (!decfile->filename)
                goto out_filename;
@@ -105,6 +122,8 @@ out_parse:
 out_file:
        free(decfile->filename);
 out_filename:
+       pmhash_del(decfile->header);
+out_header:
        free(decfile);
        return NULL;
 }
@@ -116,3 +135,129 @@ void rnet_decfile_close(struct rnet_decfile *decfile)
        free(decfile->filename);
        free(decfile);
 }
+
+static char * get_header(struct rnet_decfile *decfile)
+{
+       int i;
+       for (i = 0; i < decfile->lines_len; i++) {
+               if (!strncmp(decfile->lines[i], "IRPF", 4)) {
+                       return decfile->lines[i];
+               }
+       }
+       return NULL;
+}
+
+static int parse_header(struct pmhash *hash, char *buffer)
+{
+       char *p = buffer;
+       char *key;
+       char *val;
+
+#define parse(field, sz) \
+       val = malloc(sz + 1); \
+       if (!val) \
+               goto out_val; \
+       val[sz] = 0; \
+       memcpy(val, p, sz); \
+       p += sz; \
+       key = strdup(field); \
+       if (!key) \
+               goto out_key; \
+       if (pmhash_add(&hash, key, val)) \
+               goto out_add;
+
+       parse("sistema", 8);
+       parse("exerc", 4);
+       parse("ano", 4);
+       parse("codigo_recnet", 4);
+       parse("in_ret", 1);
+       parse("cpf", 11);
+       parse("filler", 3);
+       parse("tipo_ni", 1);
+       parse("nr_versao", 3);
+       parse("nome", 60);
+       parse("uf", 2);
+       parse("hash", 10);
+       parse("in_cert", 1);
+       parse("dt_nasc", 8);
+       parse("in_comp", 1);
+       parse("in_res", 1);
+       parse("in_gerada", 1);
+       parse("nr_recibo_anterior", 10);
+       parse("in_pgd", 1);
+       parse("so", 14);
+       parse("versao_so", 7);
+       parse("jvm", 9);
+       parse("nr_recibo", 10);
+       parse("municipio", 4);
+       parse("conjuge", 11);
+       parse("obrig", 1);
+       parse("impdevido", 13);
+       parse("nr_recibo", 10);
+       parse("in_seg", 1);
+       parse("imppago", 2);
+       parse("impant", 1);
+       parse("mudend", 1);
+       parse("cep", 8);
+       parse("debito", 1);
+       parse("banco", 3);
+       parse("agencia", 4);
+       parse("filler", 1);
+       parse("data_julgado", 8);
+       parse("imppagar", 13);
+       parse("tribfonte", 1);
+       parse("cpfrra", 11);
+       parse("trib_rra", 1);
+       parse("cpf_rra2", 11);
+       parse("trib_3rra", 1);
+       parse("cpf_rra3", 11);
+       parse("vr_doacao", 13);
+       parse("cnpj1", 14);
+       parse("cnpj2", 14);
+       parse("cnpj3", 14);
+       parse("cnpj4", 14);
+       parse("cpf_dep1", 11);
+       parse("dnas_dep1", 8);
+       parse("cpf_dep2", 11);
+       parse("dnas_dep2", 8);
+       parse("cpf_dep3", 11);
+       parse("dnas_dep3", 8);
+       parse("cpf_dep4", 11);
+       parse("dnas_dep4", 8);
+       parse("cpf_dep5", 11);
+       parse("dnas_dep5", 8);
+       parse("cpf_dep6", 11);
+       parse("dnas_dep6", 8);
+       parse("cnpj_med1", 14);
+       parse("cnpj_med2", 14);
+       parse("cpf_alim", 11);
+       parse("cpf_invent", 11);
+       parse("municipio", 40);
+       parse("contribuinte", 60);
+       parse("cpf_empregada", 11);
+       parse("hashcode", 12);
+       parse("data_nao_residente", 8);
+       parse("cpf_procurador", 11);
+       parse("obrigatoriedade", 3);
+       parse("rendtrib", 13);
+       parse("cnpj_prev", 14);
+       parse("cnpj_prev2", 14);
+       parse("vr_totisentos", 13);
+       parse("vr_totexclusivo", 13);
+       parse("vr_totpagamentos", 13);
+       parse("versaotestpgd", 3);
+       parse("controle", 10);
+
+       return 0;
+out_add:
+       free(key);
+out_key:
+       free(val);
+out_val:
+       return -1;
+}
+
+char *rnet_decfile_get_header_field(struct rnet_decfile *decfile, char *field)
+{
+       return pmhash_get(decfile->header, field);
+}
index 0fcf6dd..f35b73d 100644 (file)
--- a/decfile.h
+++ b/decfile.h
@@ -22,5 +22,6 @@
 struct rnet_decfile;
 struct rnet_decfile * rnet_decfile_open(char *filename);
 void rnet_decfile_close(struct rnet_decfile *decfile);
+char *rnet_decfile_get_header_field(struct rnet_decfile *decfile, char *field);
 
 #endif