]> git.ipfire.org Git - pakfire.git/commitdiff
parser: Have the merge() function return an integer
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 1 Mar 2021 17:08:44 +0000 (17:08 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 1 Mar 2021 17:08:44 +0000 (17:08 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/parser.h
src/libpakfire/parser.c
src/libpakfire/parser/grammar.y

index 7e2ae52a45a7962050cd22de27ce50cedbc6adb0..732b0c57ffa381795fd8dff3e652222defe44b52 100644 (file)
@@ -43,7 +43,7 @@ int pakfire_parser_append(PakfireParser parser,
 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);
+int pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2);
 
 int pakfire_parser_read(PakfireParser parser, FILE* f, struct pakfire_parser_error** error);
 int pakfire_parser_read_file(PakfireParser parser, const char* path,
index 570bc879d0180153e09a79776eefb1f921cf89ab..e9ee34252b84abfcea9e8f007867f63b0c363749 100644 (file)
@@ -414,12 +414,12 @@ PAKFIRE_EXPORT char* pakfire_parser_get(PakfireParser parser, const char* name)
        return pakfire_parser_expand(parser, value);
 }
 
-PAKFIRE_EXPORT PakfireParser pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2) {
+PAKFIRE_EXPORT int pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2) {
        DEBUG(parser1->pakfire, "Merging parsers %p and %p\n", parser1, parser2);
 
        // Do not try to merge a parser with itself
        if (parser1 == parser2)
-               return parser1;
+               return EINVAL;
 
        for (unsigned int i = 0; i < parser2->num_declarations; i++) {
                struct pakfire_parser_declaration* d = parser2->declarations[i];
@@ -428,12 +428,15 @@ PAKFIRE_EXPORT PakfireParser pakfire_parser_merge(PakfireParser parser1, Pakfire
 
                char* canonical_name = pakfire_parser_make_canonical_name(parser2, d->name);
 
-               pakfire_parser_set_declaration(parser1, canonical_name, d->value);
+               int r = pakfire_parser_set_declaration(parser1, canonical_name, d->value);
 
                free(canonical_name);
+
+               if (r)
+                       return r;
        }
 
-       return parser1;
+       return 0;
 }
 
 PAKFIRE_EXPORT int pakfire_parser_read(PakfireParser parser, FILE* f,
index 68c52e61a9d873cf037aaeafbf4c7c02d3aa7724..1274b0751dea987cb09f6d90d11bb37f553a4334 100644 (file)
@@ -173,13 +173,19 @@ grammar                                           : %empty
                                                        }
                                                        | grammar subparser
                                                        {
-                                                               pakfire_parser_merge($1, $2);
+                                                               int r = pakfire_parser_merge($1, $2);
+                                                               if (r)
+                                                                       ABORT;
+
                                                                $$ = pakfire_parser_ref($1);
                                                        }
                                                        | grammar if_stmt
                                                        {
-                                                               if ($2)
-                                                                       pakfire_parser_merge($1, $2);
+                                                               if ($2) {
+                                                                       int r = pakfire_parser_merge($1, $2);
+                                                                       if (r)
+                                                                               ABORT;
+                                                               }
 
                                                                $$ = pakfire_parser_ref($1);
                                                        }
@@ -337,7 +343,7 @@ int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len
        // the parent parser. That way, it will be untouched if something could
        // not be successfully parsed.
        if (r == 0) {
-               parent = pakfire_parser_merge(parent, parser);
+               pakfire_parser_merge(parent, parser);
        }
 
        // Destroy the parser