From: Michael Tremer Date: Thu, 25 Feb 2021 11:44:44 +0000 (+0000) Subject: parser: Change handling of namespace X-Git-Tag: 0.9.28~1285^2~699 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=713da22580b88bee0010681164a48f451c8df927;p=pakfire.git parser: Change handling of namespace The namespace is being added when parsers are being merged Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/parser.h b/src/libpakfire/include/pakfire/parser.h index 299d63bf5..7fdd58ab9 100644 --- a/src/libpakfire/include/pakfire/parser.h +++ b/src/libpakfire/include/pakfire/parser.h @@ -48,6 +48,7 @@ int pakfire_parser_parse(PakfireParser parser, const char* data, size_t size); char* pakfire_parser_dump(PakfireParser parser); const char* pakfire_parser_get_namespace(PakfireParser parser); +int pakfire_parser_set_namespace(PakfireParser parser, const char* namespace); #ifdef PAKFIRE_PRIVATE diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 695e25931..60df1b742 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -259,6 +259,7 @@ global: pakfire_parser_read; pakfire_parser_ref; pakfire_parser_set; + pakfire_parser_set_namespace; pakfire_parser_unref; # problem diff --git a/src/libpakfire/parser.c b/src/libpakfire/parser.c index 3f530810d..534932150 100644 --- a/src/libpakfire/parser.c +++ b/src/libpakfire/parser.c @@ -84,7 +84,7 @@ PAKFIRE_EXPORT PakfireParser pakfire_parser_create(Pakfire pakfire, PakfireParse parser->parent = pakfire_parser_ref(parent); // Make namespace - parser->namespace = pakfire_parser_make_namespace(parent, namespace); + pakfire_parser_set_namespace(parser, namespace); DEBUG(pakfire, "Allocated new parser at %p (%s, %p)\n", parser, parser->namespace, parser->parent); @@ -186,6 +186,8 @@ static int pakfire_parser_set_declaration(PakfireParser parser, if (value) d->value = strdup(value); + else + d->value = NULL; DEBUG(parser->pakfire, "%p: Updated declaration: %s = %s\n", parser, d->name, d->value); @@ -215,12 +217,7 @@ static int pakfire_parser_set_declaration(PakfireParser parser, } PAKFIRE_EXPORT int pakfire_parser_set(PakfireParser parser, const char* name, const char* value) { - char* canonical_name = pakfire_parser_make_canonical_name(parser, name); - - int r = pakfire_parser_set_declaration(parser, canonical_name, value); - free(canonical_name); - - return r; + return pakfire_parser_set_declaration(parser, name, value); } int pakfire_parser_apply_declaration(PakfireParser parser, @@ -445,7 +442,11 @@ PAKFIRE_EXPORT PakfireParser pakfire_parser_merge(PakfireParser parser1, Pakfire if (!d) break; - pakfire_parser_set_declaration(parser1, d->name, d->value); + char* canonical_name = pakfire_parser_make_canonical_name(parser2, d->name); + + pakfire_parser_set_declaration(parser1, canonical_name, d->value); + + free(canonical_name); } return parser1; @@ -491,3 +492,17 @@ PAKFIRE_EXPORT char* pakfire_parser_dump(PakfireParser parser) { PAKFIRE_EXPORT const char* pakfire_parser_get_namespace(PakfireParser parser) { return parser->namespace; } + +PAKFIRE_EXPORT int pakfire_parser_set_namespace(PakfireParser parser, const char* namespace) { + if (parser->namespace) + free(parser->namespace); + + if (namespace) + parser->namespace = strdup(namespace); + else + parser->namespace = NULL; + + DEBUG(parser->pakfire, "%p: Set namespace to: %s\n", parser, parser->namespace); + + return 0; +} diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index bf0490702..991ec0c41 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -233,7 +233,8 @@ line : T_STRING T_EOL subparser : T_SUBPARSER T_EOL subgrammar T_END T_EOL { - // XXX HANDLE NAMESPACE + pakfire_parser_set_namespace($3, $1); + $$ = pakfire_parser_ref($3); } ; diff --git a/tests/libpakfire/parser.c b/tests/libpakfire/parser.c index feea384a5..db5f88838 100644 --- a/tests/libpakfire/parser.c +++ b/tests/libpakfire/parser.c @@ -80,7 +80,7 @@ static int test_parser(const struct test* t) { pakfire_parser_merge(parser, subparser); // Now a should have changed to "a b c" - value = pakfire_parser_get(parser, "a"); + value = pakfire_parser_get(parser, "child.a"); ASSERT_STRING_EQUALS(value, "a b c"); // Set a variable @@ -89,7 +89,7 @@ static int test_parser(const struct test* t) { // Get the value of c value = pakfire_parser_get(parser, "c"); - ASSERT_STRING_EQUALS(value, "1"); + ASSERT_STRING_EQUALS(value, ""); // Dump the parser char* s = pakfire_parser_dump(parser);