From: Thadeu Lima de Souza Cascardo Date: Sun, 28 Jun 2020 00:28:38 +0000 (-0300) Subject: Suporte a atributos. X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fdeclara.git;a=commitdiff_plain;h=5e747c39f1b7b09f90f6d6bb5e9f70cbe2201443 Suporte a atributos. Utiliza nossa simples implementação de dicionário para implementar atributos em alguns objetos, a serem lidos dos comandos como atributo=valor. --- diff --git a/lib/Makefile.am b/lib/Makefile.am index a7586db..4d2bf94 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -5,6 +5,7 @@ libreceita_la_SOURCES = declaracao.c declaracao.h \ token.c token.h \ cmd.c cmd.h pmhash.c pmhash.h \ totais.c totais.h \ + attr.c attr.h \ sistema.c sistema.h \ calcula.c calcula.h \ gera.c gera.h \ diff --git a/lib/attr.c b/lib/attr.c new file mode 100644 index 0000000..3f98dbc --- /dev/null +++ b/lib/attr.c @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2015 Thadeu Lima de Souza Cascardo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "attr.h" +#include +#include +#include +#include +#include "pmhash.h" + +int attr_set(struct pmhash **pmhash, char *key, char *val) +{ + int r = -ENOMEM; + key = strdup(key); + if (!key) + return r; + val = strdup(val); + if (!val) { + free(val); + return r; + } + r = pmhash_add(pmhash, key, val); + if (r) { + free(key); + free(val); + } + return r; +} + +int attr_parse(struct pmhash **pmhash, char *arg) +{ + int r = -EINVAL; + char *val; + val = strchr(arg, '='); + if (!val) + return r; + *val++ = '\0'; + return attr_set(pmhash, arg, val); +} + +char * attr_get(struct pmhash *pmhash, char *key) +{ + return (char *) pmhash_get(pmhash, key); +} + +int attr_out(FILE *f, struct pmhash *attr, char *key, int size) +{ + return fprintf(f, "%-*.*s", size, size, attr_get(attr, key) ?: ""); +} diff --git a/lib/attr.h b/lib/attr.h new file mode 100644 index 0000000..c0e3bd1 --- /dev/null +++ b/lib/attr.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2015 Thadeu Lima de Souza Cascardo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _ATTR_H +#define _ATTR_H + +#include +#include "pmhash.h" + +int attr_set(struct pmhash **pmhash, char *key, char *val); +int attr_parse(struct pmhash **pmhash, char *arg); +char * attr_get(struct pmhash *pmhash, char *key); +int attr_out(FILE *f, struct pmhash *attr, char *key, int size); + +#endif