diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/utils/utils.c | 59 | ||||
-rw-r--r-- | src/utils/utils.h | 3 |
2 files changed, 61 insertions, 1 deletions
diff --git a/src/utils/utils.c b/src/utils/utils.c index f3ebbb4..ea0b424 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -7,6 +7,13 @@ #include "../logger.h" #include "utils.h" +static void print_error(int code) { + PCRE2_UCHAR message[256]; + if (pcre2_get_error_message(code, message, + sizeof(message) / sizeof(PCRE2_UCHAR))) + LOG("PCRE2", "Error: %s\n", (const char *)message); +} + int regex_match(const char *subject, str_array_t patterns, str_array_t *results) { pcre2_code *re; @@ -75,7 +82,7 @@ int regex_match(const char *subject, str_array_t patterns, "ovector was not big enough for all the captured substrings\n"); break; default: - LOG("PCRE2", "Matching error %d\n", rc); + print_error(rc); return 1; } } @@ -83,6 +90,56 @@ int regex_match(const char *subject, str_array_t patterns, return 0; } +int substitute_str(const char *subject, const char *pattern, + const char *replacement, char **presult) { + pcre2_code *re; + pcre2_match_context *match_context; + int rc, error; + PCRE2_SIZE erroffset, outlength; + PCRE2_UCHAR *outbuf; + + re = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, + PCRE2_MULTILINE, &error, &erroffset, 0); + if (!re) { + print_error(error); + return 1; + } + + match_context = pcre2_match_context_create(0); + + outlength = 0; + rc = pcre2_substitute(re, (PCRE2_SPTR)subject, PCRE2_ZERO_TERMINATED, 0, + PCRE2_SUBSTITUTE_GLOBAL | + PCRE2_SUBSTITUTE_OVERFLOW_LENGTH | + PCRE2_SUBSTITUTE_EXTENDED, + 0, match_context, (PCRE2_SPTR)replacement, + PCRE2_ZERO_TERMINATED, 0, &outlength); + + if (rc != PCRE2_ERROR_NOMEMORY) { + print_error(rc); + return 1; + } + + outbuf = malloc(outlength * sizeof(PCRE2_UCHAR)); + + rc = pcre2_substitute(re, (PCRE2_SPTR)subject, PCRE2_ZERO_TERMINATED, 0, + PCRE2_SUBSTITUTE_GLOBAL | PCRE2_SUBSTITUTE_EXTENDED, + 0, match_context, (PCRE2_SPTR)replacement, + PCRE2_ZERO_TERMINATED, outbuf, &outlength); + + if (rc < 0) { + print_error(rc); + return 1; + } + + *presult = (char *)outbuf; + + pcre2_match_context_free(match_context); + pcre2_code_free(re); + + return 0; +} + int repchr(char *str, char t, char r) { int c = 0; for (size_t i = 0; str[i] != '\0'; i++) { diff --git a/src/utils/utils.h b/src/utils/utils.h index d7e45dc..f5bf8fc 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -6,6 +6,9 @@ int regex_match(const char *, str_array_t, str_array_t *); +int substitute_str(const char *subject, const char *pattern, + const char *replacement, char **presult); + int repchr(char *str, char t, char r); void free_and_nullify(void *p); |