]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
parser: Consolidate compiling regular expressions into one function
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 4 Mar 2021 17:13:57 +0000 (17:13 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 4 Mar 2021 17:14:48 +0000 (17:14 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/parser.c

index 6f01d2d2477f662d3eeff7ffea6e57c0404dad48..b626417f791826b2492f4d0e310f5288850f3531 100644 (file)
@@ -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;