From: Michael Tremer Date: Thu, 4 Mar 2021 17:13:57 +0000 (+0000) Subject: parser: Consolidate compiling regular expressions into one function X-Git-Tag: 0.9.28~1285^2~644 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf7acff3344aebd0f9d09705c0e9f52d734f55c9;p=pakfire.git parser: Consolidate compiling regular expressions into one function Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/parser.c b/src/libpakfire/parser.c index 6f01d2d24..b626417f7 100644 --- a/src/libpakfire/parser.c +++ b/src/libpakfire/parser.c @@ -50,53 +50,51 @@ struct _PakfireParser { pcre2_code* regex_variable; }; -static int pakfire_parser_compile_regex(PakfireParser parser) { +static int pakfire_parser_compile_regex(PakfireParser parser, pcre2_code** regex, + const char* pattern) { int pcre2_errno; size_t pcre2_offset; PCRE2_UCHAR errmsg[256]; - // Commands - if (!parser->regex_command && parser->flags & PAKFIRE_PARSER_FLAGS_EXPAND_COMMANDS) { - parser->regex_command = pcre2_compile((PCRE2_SPTR)"%\\((.*?)\\)", - PCRE2_ZERO_TERMINATED, 0, &pcre2_errno, &pcre2_offset, NULL); - - if (!parser->regex_command) { - pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); - ERROR(parser->pakfire, "PCRE2 compilation failed at offset %zu: %s\n", - pcre2_offset, errmsg); + // Compile the regular expression + *regex = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0, + &pcre2_errno, &pcre2_offset, NULL); - return 1; - } + if (!*regex) { + pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); + ERROR(parser->pakfire, "PCRE2 compilation failed for '%s' at offset %zu: %s\n", + pattern, pcre2_offset, errmsg); + return 1; + } - // Enable JIT - pcre2_errno = pcre2_jit_compile(parser->regex_command, PCRE2_JIT_COMPLETE); - if (pcre2_errno) { - pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); - ERROR(parser->pakfire, "Enabling JIT on commands failed: %s\n", errmsg); - return 1; - } + // Enable JIT + pcre2_errno = pcre2_jit_compile(*regex, PCRE2_JIT_COMPLETE); + if (pcre2_errno) { + pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); + ERROR(parser->pakfire, "Enabling JIT on '%s' failed: %s\n", pattern, errmsg); + return 1; } - // Variables - if (!parser->regex_variable) { - parser->regex_variable = pcre2_compile((PCRE2_SPTR)"%\\{([A-Za-z0-9_\\-]+)\\}", - PCRE2_ZERO_TERMINATED, 0, &pcre2_errno, &pcre2_offset, NULL); + return 0; +} - if (!parser->regex_variable) { - pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); - ERROR(parser->pakfire, "PCRE2 compilation failed at offset %zu: %s\n", - pcre2_offset, errmsg); +static int pakfire_parser_compile_regexes(PakfireParser parser) { + int r; - return 1; - } + // Commands + if (!parser->regex_command && parser->flags & PAKFIRE_PARSER_FLAGS_EXPAND_COMMANDS) { + r = pakfire_parser_compile_regex(parser, + &parser->regex_command, "%\\((.*?)\\)"); + if (r) + return r; + } - // Enable JIT - pcre2_errno = pcre2_jit_compile(parser->regex_variable, PCRE2_JIT_COMPLETE); - if (pcre2_errno) { - pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); - ERROR(parser->pakfire, "Enabling JIT on variables failed: %s\n", errmsg); - return 1; - } + // Variables + if (!parser->regex_variable) { + r = pakfire_parser_compile_regex(parser, + &parser->regex_variable, "%\\{([A-Za-z0-9_\\-]+)\\}"); + if (r) + return r; } return 0; @@ -584,7 +582,7 @@ PAKFIRE_EXPORT char* pakfire_parser_expand(PakfireParser parser, return buffer; // Compile all regular expressions - int r = pakfire_parser_compile_regex(parser); + int r = pakfire_parser_compile_regexes(parser); if (r) { free(buffer); return NULL;