From 9d3ece1dba6b6d5d1313a6cd68d0b56856690714 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Tue, 11 Jun 2013 18:18:13 -0300 Subject: [PATCH] Parse DEC file header. 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 | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++- decfile.h | 1 + 2 files changed, 147 insertions(+), 1 deletion(-) diff --git a/decfile.c b/decfile.c index ebffc9f..196f591 100644 --- a/decfile.c +++ b/decfile.c @@ -23,12 +23,14 @@ #include #include #include +#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); +} diff --git a/decfile.h b/decfile.h index 0fcf6dd..f35b73d 100644 --- 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 -- 2.20.1