From: Michael Tremer Date: Sat, 1 Jun 2019 02:02:03 +0000 (+0100) Subject: libpakfire: parser: Use parser-internal namespacing X-Git-Tag: 0.9.28~1285^2~1010 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b1b15235db738abf517bded2d34622e2c652aab5;p=pakfire.git libpakfire: parser: Use parser-internal namespacing Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/parser.h b/src/libpakfire/include/pakfire/parser.h index 91e3ebb2d..acb025d0a 100644 --- a/src/libpakfire/include/pakfire/parser.h +++ b/src/libpakfire/include/pakfire/parser.h @@ -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); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index d7e96a641..77b318e1b 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -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 diff --git a/src/libpakfire/parser.c b/src/libpakfire/parser.c index b13c14bf1..60d0f0b31 100644 --- a/src/libpakfire/parser.c +++ b/src/libpakfire/parser.c @@ -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) { diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 72790b35c..f076ed638 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -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;