Permite definir um erro ao processar a declaração.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Mon, 12 Dec 2016 01:42:17 +0000 (23:42 -0200)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Mon, 12 Dec 2016 01:42:17 +0000 (23:42 -0200)
Uma mensagem de erro pode ser definida no contexto da declaração. Assim,
o usuário pode ter mais detalhes sobre o erro ao processar algum
comando.

lib/declaracao.c
lib/declaracao.h

index 7eef34c..fd3c998 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#define _GNU_SOURCE
 #include "declaracao.h"
 #include "declaracao.h"
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdarg.h>
 #include "list.h"
 #include "conjuge.h"
 #include "sistema.h"
 #include "list.h"
 #include "conjuge.h"
 #include "sistema.h"
@@ -59,6 +62,7 @@ struct declaracao * declaracao_new(int ano)
        dec->devido = 0;
        dec->restituicao = 0;
        dec->tipo = SIMPLES;
        dec->devido = 0;
        dec->restituicao = 0;
        dec->tipo = SIMPLES;
+       dec->error = NULL;
        return dec;
 out_totais:
        list_free(dec->dependentes, dependente_free);
        return dec;
 out_totais:
        list_free(dec->dependentes, dependente_free);
@@ -101,5 +105,18 @@ void declaracao_free(struct declaracao *dec)
        pmhash_del(dec->totais);
        conjuge_free(dec);
        sistema_free(dec);
        pmhash_del(dec->totais);
        conjuge_free(dec);
        sistema_free(dec);
+       if (dec->error)
+               free(dec->error);
        free(dec);
 }
        free(dec);
 }
+
+void dec_set_error(struct declaracao *dec, char *fmt, ...)
+{
+       va_list ap;
+       if (dec->error)
+               free(dec->error);
+       dec->error = NULL;
+       va_start(ap, fmt);
+       vasprintf(&dec->error, fmt, ap);
+       va_end(ap);
+}
index 5948878..e1f0f3d 100644 (file)
@@ -61,9 +61,12 @@ struct declaracao {
        unsigned long hash;
        unsigned long rhash;
        int verbose;
        unsigned long hash;
        unsigned long rhash;
        int verbose;
+       char *error;
 };
 
 struct declaracao * declaracao_new(int ano);
 void declaracao_free(struct declaracao *dec);
 
 };
 
 struct declaracao * declaracao_new(int ano);
 void declaracao_free(struct declaracao *dec);
 
+void dec_set_error(struct declaracao *dec, char *fmt, ...);
+
 #endif
 #endif