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,
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];
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,
}
| 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);
}
// 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