]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: parser: Use parser-internal namespacing
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 1 Jun 2019 02:02:03 +0000 (03:02 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 1 Jun 2019 02:02:03 +0000 (03:02 +0100)
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

index 91e3ebb2df7f7e5f0f50b8807cb46cda5d783065..acb025d0a9222989aca719e572d0670e4184fcef 100644 (file)
@@ -29,13 +29,14 @@ 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,
+PakfireParser pakfire_parser_get_parent(PakfireParser parser);
+
+int pakfire_parser_set(PakfireParser parser,
                const char* name, const char* value);
-int pakfire_parser_append_declaration(PakfireParser parser,
+int pakfire_parser_append(PakfireParser parser,
        const char* name, const char* value);
 
-char* pakfire_parser_expand(PakfireParser parser,
-       const char* namespace, const char* value);
+char* pakfire_parser_expand(PakfireParser parser, const char* value);
 char* pakfire_parser_get(PakfireParser parser, const char* name);
 
 PakfireParser pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2);
index d7e96a641f82837e8d9de76cbd56b77ab9c96dc7..77b318e1b5039e51212c474ae0b1caab4f29b829 100644 (file)
@@ -210,13 +210,16 @@ global:
        pakfire_packagelist_unref;
 
        # parser
+       pakfire_parser_append;
        pakfire_parser_create;
        pakfire_parser_dump;
        pakfire_parser_expand;
        pakfire_parser_get;
+       pakfire_parser_get_parent;
        pakfire_parser_parse_data;
        pakfire_parser_read;
        pakfire_parser_ref;
+       pakfire_parser_set;
        pakfire_parser_unref;
 
        # problem
index b13c14bf11285fb0b50d7ae30c4cec2b83f3432d..60d0f0b31319daec96b8314a55b55804e7a0de09 100644 (file)
@@ -44,15 +44,31 @@ struct _PakfireParser {
 };
 
 static char* pakfire_parser_make_namespace(PakfireParser parent, const char* namespace) {
-       if (!namespace)
-               namespace = "";
+       char* buffer = NULL;
+
+       if (parent && parent->namespace) {
+               if (namespace)
+                       asprintf(&buffer, "%s.%s", parent->namespace, namespace);
+               else
+                       buffer = pakfire_strdup(parent->namespace);
+       } else {
+               if (namespace)
+                       buffer = pakfire_strdup(namespace);
+       }
+
+       return buffer;
+}
 
+static char* pakfire_parser_make_canonical_name(PakfireParser parser, const char* name) {
        char* buffer = NULL;
 
-       if (parent && *parent->namespace)
-               asprintf(&buffer, "%s.%s", parent->namespace, namespace);
-       else
-               buffer = pakfire_strdup(namespace);
+       if (parser->namespace) {
+               int r = asprintf(&buffer, "%s.%s", parser->namespace, name);
+               if (r < 0)
+                       return NULL;
+       } else {
+               buffer = pakfire_strdup(name);
+       }
 
        return buffer;
 }
@@ -111,7 +127,8 @@ static void pakfire_parser_free(PakfireParser parser) {
 
        pakfire_parser_unref(parser->parent);
        pakfire_unref(parser->pakfire);
-       pakfire_free(parser->namespace);
+       if (parser->namespace)
+               pakfire_free(parser->namespace);
        pakfire_free(parser);
 }
 
@@ -126,6 +143,13 @@ PAKFIRE_EXPORT PakfireParser pakfire_parser_unref(PakfireParser parser) {
        return NULL;
 }
 
+PAKFIRE_EXPORT PakfireParser pakfire_parser_get_parent(PakfireParser parser) {
+       if (parser->parent)
+               return pakfire_parser_ref(parser->parent);
+
+       return NULL;
+}
+
 static struct pakfire_parser_declaration* pakfire_parser_get_declaration(
                PakfireParser parser, const char* name) {
        struct pakfire_parser_declaration* d;
@@ -147,7 +171,7 @@ static struct pakfire_parser_declaration* pakfire_parser_get_declaration(
        return NULL;
 }
 
-PAKFIRE_EXPORT int pakfire_parser_set_declaration(PakfireParser parser,
+static int pakfire_parser_set_declaration(PakfireParser parser,
                const char* name, const char* value) {
        // Handle when name already exists
        struct pakfire_parser_declaration* d = pakfire_parser_get_declaration(parser, name);
@@ -187,7 +211,16 @@ PAKFIRE_EXPORT int pakfire_parser_set_declaration(PakfireParser parser,
        return 0;
 }
 
-PAKFIRE_EXPORT int pakfire_parser_append_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);
+       pakfire_free(canonical_name);
+
+       return r;
+}
+
+PAKFIRE_EXPORT int pakfire_parser_append(PakfireParser parser,
                const char* name, const char* value) {
        struct pakfire_parser_declaration* d = pakfire_parser_get_declaration(parser, name);
 
@@ -224,9 +257,9 @@ static void pakfire_parser_strip_namespace(char* s) {
 }
 
 static struct pakfire_parser_declaration* pakfire_parser_find_declaration(
-               PakfireParser parser, const char* namespace, const char* name) {
+               PakfireParser parser, const char* name) {
        // Create a working copy of the namespace
-       char* n = pakfire_strdup(namespace);
+       char* n = pakfire_strdup(parser->namespace);
 
        size_t length = strlen(n) + strlen(name) + 1;
        char* buffer = pakfire_malloc(length + 1);
@@ -276,7 +309,7 @@ static char* pakfire_parser_expand_declaration(PakfireParser parser,
        pakfire_parser_strip_namespace(namespace);
 
        // Expand the value
-       char* buffer = pakfire_parser_expand(parser, namespace, declaration->value);
+       char* buffer = pakfire_parser_expand(parser, declaration->value);
 
        // Cleanup
        pakfire_free(namespace);
@@ -284,8 +317,7 @@ static char* pakfire_parser_expand_declaration(PakfireParser parser,
        return buffer;
 }
 
-PAKFIRE_EXPORT char* pakfire_parser_expand(PakfireParser parser,
-               const char* namespace, const char* value) {
+PAKFIRE_EXPORT char* pakfire_parser_expand(PakfireParser parser, const char* value) {
        // Return NULL when the value is NULL
        if (!value)
                return NULL;
@@ -331,7 +363,7 @@ PAKFIRE_EXPORT char* pakfire_parser_expand(PakfireParser parser,
 
                // Search for a declaration of this variable
                struct pakfire_parser_declaration* v =
-                       pakfire_parser_find_declaration(parser, namespace, variable);
+                       pakfire_parser_find_declaration(parser, variable);
 
                const char* value = NULL;
                if (v && v->value) {
index 72790b35c1c9c70f7e9ef878ec9768f84ad48d9d..f076ed6383ea3b954d593faf92e092994cc2b2f3 100644 (file)
@@ -52,14 +52,11 @@ static void yyerror(PakfireParser parser, const char* s);
 static void cleanup(void);
 #define ABORT do { cleanup(); YYABORT; } while (0);
 
-char* current_block = NULL;
-static char* pakfire_parser_make_canonical_name(const char* name);
-
 enum operator {
        OP_EQUALS = 0,
 };
 
-static PakfireParser new_parser(PakfireParser parent);
+static PakfireParser new_parser(PakfireParser parent, const char* namespace);
 static PakfireParser merge_parsers(PakfireParser p1, PakfireParser p2);
 
 static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
@@ -106,7 +103,7 @@ static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
 
 top                                                    : %empty
                                                        {
-                                                               $$ = new_parser(parser);
+                                                               $$ = new_parser(parser, NULL);
                                                        }
                                                        | top assignment
                                                        {
@@ -189,13 +186,14 @@ if_stmt                                           : T_IF T_WORD T_EQUALS T_WORD T_EOL block_assignments else block_as
 
 block_opening                          : variable T_EOL
                                                        {
-                                                               current_block = pakfire_strdup($1);
+                                                               // Create a new sub-parser which opens a new namespace
+                                                               parser = new_parser(parser, $1);
                                                        };
 
 block_closing                          : end
                                                        {
-                                                               pakfire_free(current_block);
-                                                               current_block = NULL;
+                                                               // Move back to the parent parser
+                                                               parser = pakfire_parser_get_parent(parser);
                                                        };
 
 block                                          : block_opening block_assignments block_closing
@@ -211,7 +209,7 @@ block_assignments                   : block_assignments block_assignment
                                                                if ($1)
                                                                        $$ = $1;
                                                                else
-                                                                       $$ = new_parser(parser);
+                                                                       $$ = new_parser(parser, NULL);
                                                        };
 
 block_assignment                       : assignment
@@ -224,17 +222,10 @@ block_assignment                  : assignment
 
 assignment                                     : variable T_ASSIGN value T_EOL
                                                        {
-                                                               char* name = pakfire_parser_make_canonical_name($1);
-                                                               if (!name)
-                                                                       ABORT;
-
                                                                // Allocate a new parser
-                                                               // XXX should not inherit from parser
-                                                               $$ = new_parser(parser);
-
-                                                               int r = pakfire_parser_set_declaration($$, name, $3);
-                                                               pakfire_free(name);
+                                                               $$ = new_parser(parser, NULL);
 
+                                                               int r = pakfire_parser_set($$, $1, $3);
                                                                if (r < 0) {
                                                                        pakfire_parser_unref($$);
                                                                        ABORT;
@@ -242,17 +233,10 @@ assignment                                        : variable T_ASSIGN value T_EOL
                                                        }
                                                        | variable T_APPEND value T_EOL
                                                        {
-                                                               char* name = pakfire_parser_make_canonical_name($1);
-                                                               if (!name)
-                                                                       ABORT;
-
                                                                // Allocate a new parser
-                                                               // XXX should not inherit from parser
-                                                               $$ = new_parser(parser);
-
-                                                               int r = pakfire_parser_append_declaration($$, name, $3);
-                                                               pakfire_free(name);
+                                                               $$ = new_parser(parser, NULL);
 
+                                                               int r = pakfire_parser_append($$, $1, $3);
                                                                if (r < 0) {
                                                                        pakfire_parser_unref($$);
                                                                        ABORT;
@@ -260,17 +244,10 @@ assignment                                        : variable T_ASSIGN value T_EOL
                                                        }
                                                        | define text end
                                                        {
-                                                               char* name = pakfire_parser_make_canonical_name($1);
-                                                               if (!name)
-                                                                       ABORT;
-
                                                                // Allocate a new parser
-                                                               // XXX should not inherit from parser
-                                                               $$ = new_parser(parser);
-
-                                                               int r = pakfire_parser_set_declaration($$, name, $2);
-                                                               pakfire_free(name);
+                                                               $$ = new_parser(parser, NULL);
 
+                                                               int r = pakfire_parser_set($$, $1, $2);
                                                                if (r < 0) {
                                                                        pakfire_parser_unref($$);
                                                                        ABORT;
@@ -285,25 +262,6 @@ define                                             : T_DEFINE variable T_EOL
 %%
 
 static void cleanup(void) {
-       // Reset current_block
-       if (current_block) {
-               pakfire_free(current_block);
-               current_block = NULL;
-       }
-}
-
-static char* pakfire_parser_make_canonical_name(const char* name) {
-       char* buffer = NULL;
-
-       if (current_block) {
-               int r = asprintf(&buffer, "%s.%s", current_block, name);
-               if (r < 0)
-                       return NULL;
-       } else {
-               buffer = pakfire_strdup(name);
-       }
-
-       return buffer;
 }
 
 int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len) {
@@ -350,10 +308,10 @@ void yyerror(PakfireParser parser, const char* s) {
        pakfire_unref(pakfire);
 }
 
-static PakfireParser new_parser(PakfireParser parent) {
+static PakfireParser new_parser(PakfireParser parent, const char* namespace) {
        Pakfire pakfire = pakfire_parser_get_pakfire(parent);
 
-       PakfireParser parser = pakfire_parser_create(pakfire, parent, current_block);
+       PakfireParser parser = pakfire_parser_create(pakfire, parent, namespace);
        pakfire_unref(pakfire);
 
        return parser;
@@ -378,11 +336,9 @@ static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op,
                        break;
        }
 
-       const char* namespace = (current_block) ? current_block : "";
-
        // Expand values
-       char* v1 = pakfire_parser_expand(parser, namespace, val1);
-       char* v2 = pakfire_parser_expand(parser, namespace, val2);
+       char* v1 = pakfire_parser_expand(parser, val1);
+       char* v2 = pakfire_parser_expand(parser, val2);
 
        PakfireParser result = NULL;