From: Michael Tremer Date: Fri, 31 May 2019 05:25:27 +0000 (+0100) Subject: libpakfire: parser: Move namespaces into parsers X-Git-Tag: 0.9.28~1285^2~1011 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1141075e89b87cd33c42ac28f5fb85ed390c29db;p=pakfire.git libpakfire: parser: Move namespaces into parsers Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index fa650b855..b5b6ae2e4 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -288,7 +288,7 @@ PAKFIRE_EXPORT PakfireArchive pakfire_archive_create(Pakfire pakfire) { archive->nrefs = 1; archive->format = -1; - archive->parser = pakfire_parser_create(pakfire, NULL); + archive->parser = pakfire_parser_create(pakfire, NULL, NULL); archive->signatures = NULL; } diff --git a/src/libpakfire/include/pakfire/parser.h b/src/libpakfire/include/pakfire/parser.h index 98efe3a22..91e3ebb2d 100644 --- a/src/libpakfire/include/pakfire/parser.h +++ b/src/libpakfire/include/pakfire/parser.h @@ -25,7 +25,8 @@ #include -PakfireParser pakfire_parser_create(Pakfire pakfire, PakfireParser parser); +PakfireParser pakfire_parser_create(Pakfire pakfire, PakfireParser parser, + const char* namespace); PakfireParser pakfire_parser_ref(PakfireParser parser); PakfireParser pakfire_parser_unref(PakfireParser parser); int pakfire_parser_set_declaration(PakfireParser parser, diff --git a/src/libpakfire/parser.c b/src/libpakfire/parser.c index ea7ba9a21..b13c14bf1 100644 --- a/src/libpakfire/parser.c +++ b/src/libpakfire/parser.c @@ -36,12 +36,28 @@ struct _PakfireParser { struct _PakfireParser* parent; int nrefs; + char* namespace; + struct pakfire_parser_declaration** declarations; unsigned int next_declaration; unsigned int num_declarations; }; -PAKFIRE_EXPORT PakfireParser pakfire_parser_create(Pakfire pakfire, PakfireParser parent) { +static char* pakfire_parser_make_namespace(PakfireParser parent, const char* namespace) { + if (!namespace) + namespace = ""; + + char* buffer = NULL; + + if (parent && *parent->namespace) + asprintf(&buffer, "%s.%s", parent->namespace, namespace); + else + buffer = pakfire_strdup(namespace); + + return buffer; +} + +PAKFIRE_EXPORT PakfireParser pakfire_parser_create(Pakfire pakfire, PakfireParser parent, const char* namespace) { PakfireParser parser = pakfire_calloc(1, sizeof(*parser)); if (parser) { parser->pakfire = pakfire_ref(pakfire); @@ -50,6 +66,9 @@ PAKFIRE_EXPORT PakfireParser pakfire_parser_create(Pakfire pakfire, PakfireParse if (parent) parser->parent = pakfire_parser_ref(parent); + // Make namespace + parser->namespace = pakfire_parser_make_namespace(parent, namespace); + parser->num_declarations = NUM_DECLARATIONS; // Allocate a decent number of declarations @@ -57,6 +76,9 @@ PAKFIRE_EXPORT PakfireParser pakfire_parser_create(Pakfire pakfire, PakfireParse parser->num_declarations, sizeof(*parser->declarations)); parser->next_declaration = 0; + + DEBUG(pakfire, "Allocated new parser at %p (%s)\n", + parser, parser->namespace); } return parser; @@ -89,6 +111,7 @@ static void pakfire_parser_free(PakfireParser parser) { pakfire_parser_unref(parser->parent); pakfire_unref(parser->pakfire); + pakfire_free(parser->namespace); pakfire_free(parser); } diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 809fb68af..72790b35c 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -312,7 +312,7 @@ int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len DEBUG(pakfire, "Parsing the following data:\n%s\n", data); // Create a new sub-parser - PakfireParser parser = pakfire_parser_create(pakfire, parent); + PakfireParser parser = pakfire_parser_create(pakfire, parent, NULL); num_lines = 1; @@ -353,7 +353,7 @@ void yyerror(PakfireParser parser, const char* s) { static PakfireParser new_parser(PakfireParser parent) { Pakfire pakfire = pakfire_parser_get_pakfire(parent); - PakfireParser parser = pakfire_parser_create(pakfire, parent); + PakfireParser parser = pakfire_parser_create(pakfire, parent, current_block); pakfire_unref(pakfire); return parser; diff --git a/tests/libpakfire/makefile.c b/tests/libpakfire/makefile.c index 6e85c7adb..aed582f95 100644 --- a/tests/libpakfire/makefile.c +++ b/tests/libpakfire/makefile.c @@ -32,7 +32,7 @@ int test_parse(const test_t* t) { FILE* f = fopen(path, "r"); assert_return(f, EXIT_FAILURE); - PakfireParser parser = pakfire_parser_create(t->pakfire, NULL); + PakfireParser parser = pakfire_parser_create(t->pakfire, NULL, NULL); int r = pakfire_parser_read(parser, f); assert_return(r == 0, EXIT_FAILURE);