From 58ea61a19cb9bd0f6c600ebbb643e209fdf9d7cb Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Mon, 21 Mar 2016 19:31:24 +0100 Subject: Matching works --- regex.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 regex.c (limited to 'regex.c') diff --git a/regex.c b/regex.c new file mode 100644 index 0000000..8d46a31 --- /dev/null +++ b/regex.c @@ -0,0 +1,38 @@ +#include "regex.h" +#include +#include + +char* clstocs(CleanString* cs) { + char* s = calloc(CleanStringLength(cs) + 1, 1); + uint8_t i; + for (i = 0; i < CleanStringLength(cs); i++) + s[i] = CleanStringCharacters(cs)[i]; + s[i] = 0; + return s; +} + +pcre2_code* cleanregex_pcre2_compile(CleanString* cs, int64_t flags) { + uint8_t* s = (uint8_t*) clstocs(cs); + int error; PCRE2_SIZE offset; + pcre2_code* code = pcre2_compile(s, PCRE2_ZERO_TERMINATED, flags, + &error, &offset, NULL); + if (code) + return code; + else + return NULL; +} + +int64_t cleanregex_match(pcre2_code* re, CleanString* sub) { + pcre2_match_data *data = pcre2_match_data_create_from_pattern(re, NULL); + uint8_t* csub = (uint8_t*) clstocs(sub); + unsigned long len = CleanStringLength(sub); + int match = pcre2_match(re, csub, len, 0, 0, data, NULL); + if (match < 0) { + pcre2_match_data_free(data); + return match; + } + PCRE2_SIZE* ovector = pcre2_get_ovector_pointer(data); + pcre2_match_data_free(data); + return ovector[0]; +} + -- cgit v1.2.3