diff options
| author | Tyge Løvset <[email protected]> | 2022-07-22 15:05:25 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-07-22 15:05:25 +0200 |
| commit | 29d9d1d96d8a37f6d7e24dc170aa08a40f0f1559 (patch) | |
| tree | b239018af9c0dfa1b07edaf835663757dd4759ed /src | |
| parent | 28ee78e128c14fe309cb5f7cfc3f2172bf675ea7 (diff) | |
| download | STC-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.c | 14 |
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) |
