From 8129933ca51caf788e0cd7c5fdbcb43fdc64601d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sun, 19 Jul 2015 13:55:50 +0200 Subject: text: move regex related functions to separate file Eventually this should probably be rewritten to use an iternal regex engine, currently it has unacceptable memory usage, it copies the whole text. --- text.c | 68 ------------------------------------------------------------------ 1 file changed, 68 deletions(-) (limited to 'text.c') diff --git a/text.c b/text.c index fee7aef..be9a8f5 100644 --- a/text.c +++ b/text.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -41,11 +40,6 @@ * results in havoc. */ #define BUFFER_MMAP_SIZE (1 << 23) -struct Regex { - const char *string; - regex_t regex; -}; - /* Buffer holding the file content, either readonly mmap(2)-ed from the original * file or heap allocated to store the modifications. */ @@ -1465,68 +1459,6 @@ size_t text_history_get(Text *txt, size_t index) { return EPOS; } -Regex *text_regex_new(void) { - Regex *r = calloc(1, sizeof(Regex)); - if (!r) - return NULL; - regcomp(&r->regex, "\0\0", 0); /* this should not match anything */ - return r; -} - -int text_regex_compile(Regex *regex, const char *string, int cflags) { - regex->string = string; - int r = regcomp(®ex->regex, string, cflags); - if (r) - regcomp(®ex->regex, "\0\0", 0); - return r; -} - -void text_regex_free(Regex *r) { - if (!r) - return; - regfree(&r->regex); - free(r); -} - -int text_search_range_forward(Text *txt, size_t pos, size_t len, Regex *r, size_t nmatch, RegexMatch pmatch[], int eflags) { - char *buf = malloc(len + 1); - if (!buf) - return REG_NOMATCH; - len = text_bytes_get(txt, pos, len, buf); - buf[len] = '\0'; - regmatch_t match[nmatch]; - int ret = regexec(&r->regex, buf, nmatch, match, eflags); - if (!ret) { - for (size_t i = 0; i < nmatch; i++) { - pmatch[i].start = match[i].rm_so == -1 ? EPOS : pos + match[i].rm_so; - pmatch[i].end = match[i].rm_eo == -1 ? EPOS : pos + match[i].rm_eo; - } - } - free(buf); - return ret; -} - -int text_search_range_backward(Text *txt, size_t pos, size_t len, Regex *r, size_t nmatch, RegexMatch pmatch[], int eflags) { - char *buf = malloc(len + 1); - if (!buf) - return REG_NOMATCH; - len = text_bytes_get(txt, pos, len, buf); - buf[len] = '\0'; - regmatch_t match[nmatch]; - char *cur = buf; - int ret = REG_NOMATCH; - while (!regexec(&r->regex, cur, nmatch, match, eflags)) { - ret = 0; - for (size_t i = 0; i < nmatch; i++) { - pmatch[i].start = match[i].rm_so == -1 ? EPOS : pos + (size_t)(cur - buf) + match[i].rm_so; - pmatch[i].end = match[i].rm_eo == -1 ? EPOS : pos + (size_t)(cur - buf) + match[i].rm_eo; - } - cur += match[0].rm_eo; - } - free(buf); - return ret; -} - bool text_range_valid(Filerange *r) { return r->start != EPOS && r->end != EPOS && r->start <= r->end; } -- cgit v1.2.3