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;
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;