summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2022-07-22 15:05:25 +0200
committerTyge Løvset <[email protected]>2022-07-22 15:05:25 +0200
commit29d9d1d96d8a37f6d7e24dc170aa08a40f0f1559 (patch)
treeb239018af9c0dfa1b07edaf835663757dd4759ed /src
parent28ee78e128c14fe309cb5f7cfc3f2172bf675ea7 (diff)
downloadSTC-modified-29d9d1d96d8a37f6d7e24dc170aa08a40f0f1559.tar.gz
STC-modified-29d9d1d96d8a37f6d7e24dc170aa08a40f0f1559.zip
FINAL cregex update for now: optimize/change callback mfun API. Also, cstr_printf() cannot take self as print argument.
Diffstat (limited to 'src')
-rw-r--r--src/cregex.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/src/cregex.c b/src/cregex.c
index 8705b335..02e3c3d8 100644
--- a/src/cregex.c
+++ b/src/cregex.c
@@ -1157,10 +1157,11 @@ regexec(const Reprog *progp, /* program to run */
static void
build_subst_string(const char* replace, unsigned nmatch, const csview match[],
- cstr (*mfun)(int i, csview match), cstr* subst) {
+ bool (*mfun)(int i, csview match, cstr* mstr), cstr* subst) {
cstr_clear(subst);
unsigned len = 0, cap = cstr_capacity(*subst);
char* dst = cstr_data(subst);
+ cstr mstr = cstr_null;
while (*replace != '\0') {
if (*replace == '\\') {
@@ -1171,15 +1172,11 @@ build_subst_string(const char* replace, unsigned nmatch, const csview match[],
case '5': case '6': case '7': case '8': case '9':
i = num - '0';
if (i < nmatch) {
- csview m;
- cstr mstr = cstr_null;
- if (mfun) { mstr = mfun(i, match[i]); m = cstr_sv(&mstr); }
- else m = match[i];
+ csview m = mfun && mfun(i, match[i], &mstr) ? cstr_sv(&mstr) : match[i];
if (len + m.size >= cap)
dst = cstr_reserve(subst, cap = cap*3/2 + m.size);
for (const char* rp = m.str; rp != (m.str + m.size); ++rp)
dst[len++] = *rp;
- cstr_drop(&mstr);
}
++replace;
case '\0':
@@ -1190,6 +1187,7 @@ build_subst_string(const char* replace, unsigned nmatch, const csview match[],
dst = cstr_reserve(subst, cap = cap*3/2 + 4);
dst[len++] = *replace++;
}
+ cstr_drop(&mstr);
_cstr_set_size(subst, len);
}
@@ -1233,7 +1231,7 @@ int cregex_match_p(const char* input, const char* pattern,
cstr
cregex_replace(const char* input, const cregex* re, const char* replace,
- cstr (*mfun)(int i, csview match), unsigned count) {
+ bool (*mfun)(int i, csview match, cstr* mstr), unsigned count) {
cstr out = cstr_null;
cstr subst = cstr_null;
size_t from = 0;
@@ -1255,7 +1253,7 @@ cregex_replace(const char* input, const cregex* re, const char* replace,
cstr
cregex_replace_pe(const char* input, const char* pattern, const char* replace,
- cstr (*mfun)(int i, csview match), unsigned count, int cflags) {
+ bool (*mfun)(int i, csview match, cstr* mstr), unsigned count, int cflags) {
cregex re = cregex_init();
int res = cregex_compile(&re, pattern, cflags);
if (res < 0)