]> git.ipfire.org Git - pakfire.git/commitdiff
parser: Change handling of namespace
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Feb 2021 11:44:44 +0000 (11:44 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Feb 2021 11:44:44 +0000 (11:44 +0000)
The namespace is being added when parsers are being merged

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/parser.h
src/libpakfire/libpakfire.sym
src/libpakfire/parser.c
src/libpakfire/parser/grammar.y
tests/libpakfire/parser.c

index 299d63bf5848f494405e52fca1fe8290f1a6b74c..7fdd58ab9bbd7080892ef96707b5418d4adaf69a 100644 (file)
@@ -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
 
index 695e25931abde1f3c070e7336096839c5e22ed8c..60df1b74236d7e3d97b49a941609d36b508a35a6 100644 (file)
@@ -259,6 +259,7 @@ global:
        pakfire_parser_read;
        pakfire_parser_ref;
        pakfire_parser_set;
+       pakfire_parser_set_namespace;
        pakfire_parser_unref;
 
        # problem
index 3f530810d62a1853527c2f1d05561b1eb371ffcc..534932150e2f31ff56ca40437a6cc95071a14714 100644 (file)
@@ -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;
+}
index bf0490702a410a80ca695efb222d6477a01f085d..991ec0c4112fcce9236da8fbafd0ef79a7ec8fe1 100644 (file)
@@ -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);
                                                        }
                                                        ;
index feea384a5143e1e500f0d611ae03155c27fbb394..db5f88838ced1e2467028e7c284395b326d90974 100644 (file)
@@ -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);