forked from martanne/vis
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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.
- Loading branch information
Showing
6 changed files
with
88 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#include <stdlib.h> | ||
#include <regex.h> | ||
|
||
#include "text-regex.h" | ||
|
||
struct Regex { | ||
const char *string; | ||
regex_t regex; | ||
}; | ||
|
||
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
#ifndef TEXT_REGEX_H | ||
#define TEXT_REGEX_H | ||
|
||
#include "text.h" | ||
|
||
typedef struct Regex Regex; | ||
typedef Filerange RegexMatch; | ||
|
||
Regex *text_regex_new(void); | ||
int text_regex_compile(Regex *r, const char *regex, int cflags); | ||
void text_regex_free(Regex *r); | ||
int text_search_range_forward(Text*, size_t pos, size_t len, Regex *r, size_t nmatch, RegexMatch pmatch[], int eflags); | ||
int text_search_range_backward(Text*, size_t pos, size_t len, Regex *r, size_t nmatch, RegexMatch pmatch[], int eflags); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters