]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: parser: Move namespaces into parsers
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 May 2019 05:25:27 +0000 (06:25 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 May 2019 05:25:27 +0000 (06:25 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/include/pakfire/parser.h
src/libpakfire/parser.c
src/libpakfire/parser/grammar.y
tests/libpakfire/makefile.c

index fa650b855c10ba2969055752e69d4a0016acf4e8..b5b6ae2e43cc5c712c4ddd586e79d482e468e0cf 100644 (file)
@@ -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;
        }
 
index 98efe3a22ab5730e45e047d1ab73fae4455c1ed8..91e3ebb2df7f7e5f0f50b8807cb46cda5d783065 100644 (file)
@@ -25,7 +25,8 @@
 
 #include <pakfire/types.h>
 
-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,
index ea7ba9a215401a252879d8ebffd7e2d622d6a9ac..b13c14bf11285fb0b50d7ae30c4cec2b83f3432d 100644 (file)
@@ -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);
 }
 
index 809fb68af6d9b314512c829cdf9381709ff123da..72790b35c1c9c70f7e9ef878ec9768f84ad48d9d 100644 (file)
@@ -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;
index 6e85c7adb0b1e08f32f4345965374621198a3840..aed582f95759c4d1b32ae76c56c6b04aeaf09eee 100644 (file)
@@ -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);