]> git.ipfire.org Git - pakfire.git/commitdiff
util: Move regex compilation function
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 8 Jan 2023 13:27:53 +0000 (13:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 8 Jan 2023 13:27:53 +0000 (13:27 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/util.h
src/libpakfire/parser.c
src/libpakfire/util.c

index f713f6dc0506dc780b07c7ccf36643371b938b54..162235ca67a8f44f70711b258731405145ab32c4 100644 (file)
@@ -28,6 +28,9 @@
 
 #include <archive.h>
 
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
+
 #include <pakfire/digest.h>
 #include <pakfire/pakfire.h>
 
@@ -99,6 +102,11 @@ int pakfire_json_add_string_array(struct pakfire* pakfire,
 int pakfire_rlimit_set(struct pakfire* pakfire, int limit);
 int pakfire_rlimit_reset_nofile(struct pakfire* pakfire);
 
+// Regex
+
+int pakfire_compile_regex(struct pakfire* pakfire, pcre2_code** regex,
+       const char* pattern);
+
 #endif
 
 #endif /* PAKFIRE_UTIL_H */
index 7a8da8d5abb2de22c64baa1301290d94fe6bbea7..44308427def06762d7f2d00865f94870ff211567 100644 (file)
@@ -53,51 +53,25 @@ struct pakfire_parser {
        // Regular expressions
        pcre2_code* regex_command;
        pcre2_code* regex_variable;
-};
-
-static int pakfire_parser_compile_regex(struct pakfire_parser* parser, pcre2_code** regex,
-               const char* pattern) {
-       int pcre2_errno;
-       size_t pcre2_offset;
-       PCRE2_UCHAR errmsg[256];
-
-       // Compile the regular expression
-       *regex = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0,
-               &pcre2_errno, &pcre2_offset, NULL);
-
-       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(*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;
-       }
-
-       return 0;
-}
+       // XXX THESE ARE NEVER FREED
+};
 
 static int pakfire_parser_compile_regexes(struct pakfire_parser* parser) {
        int r;
 
        // Commands
        if (!parser->regex_command && (parser->flags & PAKFIRE_PARSER_FLAGS_EXPAND_COMMANDS)) {
-               r = pakfire_parser_compile_regex(parser,
-                       &parser->regex_command, "%(\\(((?>[^()]|(?1))*)\\))");
+               r = pakfire_compile_regex(parser->pakfire, &parser->regex_command,
+                       "%(\\(((?>[^()]|(?1))*)\\))");
                if (r)
                        return r;
        }
 
        // Variables
        if (!parser->regex_variable) {
-               r = pakfire_parser_compile_regex(parser,
-                       &parser->regex_variable, "%\\{([A-Za-z0-9_\\-]+)\\}");
+               r = pakfire_compile_regex(parser->pakfire, &parser->regex_variable,
+                       "%\\{([A-Za-z0-9_\\-]+)\\}");
                if (r)
                        return r;
        }
index efb086faf32e0a11287bbb90bef6cd5802d3baab..cc4fbdcc8b9db0eeb400afe808bd62bc3be83e96 100644 (file)
@@ -38,6 +38,9 @@
 #include <json.h>
 #include <uuid/uuid.h>
 
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
+
 #include <pakfire/constants.h>
 #include <pakfire/logging.h>
 #include <pakfire/package.h>
@@ -742,3 +745,32 @@ int pakfire_rlimit_set(struct pakfire* pakfire, int limit) {
 int pakfire_rlimit_reset_nofile(struct pakfire* pakfire) {
        return pakfire_rlimit_set(pakfire, FD_SETSIZE);
 }
+
+// Regex
+
+int pakfire_compile_regex(struct pakfire* pakfire, pcre2_code** regex, const char* pattern) {
+       int pcre2_errno;
+       size_t pcre2_offset;
+       PCRE2_UCHAR errmsg[256];
+
+       // Compile the regular expression
+       *regex = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0,
+               &pcre2_errno, &pcre2_offset, NULL);
+
+       if (!*regex) {
+               pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg));
+               ERROR(pakfire, "PCRE2 compilation failed for '%s' at offset %zu: %s\n",
+                       pattern, pcre2_offset, 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(pakfire, "Enabling JIT on '%s' failed: %s\n", pattern, errmsg);
+               return 1;
+       }
+
+       return 0;
+}