struct pakfire* pakfire = pakfire_parser_get_pakfire(parent);
char* dump = NULL;
yyscan_t scanner;
+ int r;
// Initialize the parser's state
struct pakfire_parser_state state = {
struct pakfire_parser* parser = NULL;
YY_BUFFER_STATE buffer = yy_scan_bytes(data, len, scanner);
- int r = yyparse(scanner, ctx, pakfire, &parser, parent, error);
+ r = yyparse(scanner, ctx, pakfire, &parser, parent, error);
yy_delete_buffer(buffer, scanner);
+ // Deal with the return code of the parser
+ switch (r) {
+ // Success!
+ case 0:
+ break;
+
+ // Aborted, usually because of a syntax error
+ case 1:
+ r = -EBADMSG;
+ goto ERROR;
+
+ // OOM
+ case 2:
+ r = -ENOMEM;
+ goto ERROR;
+
+ // Anything else should never happen
+ default:
+ abort();
+ }
+
// If everything was parsed successfully, we merge the sub-parser into
// the parent parser. That way, it will be untouched if something could
// not be successfully parsed.
- if (r == 0) {
- if (parser)
- pakfire_parser_merge(parent, parser);
- }
-
- // Destroy the parser
if (parser)
- pakfire_parser_unref(parser);
+ pakfire_parser_merge(parent, parser);
#ifdef ENABLE_DEBUG
// Save end time
(double)(t_end - t_start) * 1000 / CLOCKS_PER_SEC);
#endif
- // Cleanup
+ERROR:
if (dump)
free(dump);
+ if (parser)
+ pakfire_parser_unref(parser);
if (pakfire)
pakfire_unref(pakfire);
if (ctx)