summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/wee-string.c43
-rw-r--r--src/core/wee-string.h4
2 files changed, 40 insertions, 7 deletions
diff --git a/src/core/wee-string.c b/src/core/wee-string.c
index ff3d143e9..e3a8f1184 100644
--- a/src/core/wee-string.c
+++ b/src/core/wee-string.c
@@ -1154,7 +1154,9 @@ string_replace (const char *string, const char *search, const char *replace)
char *
string_replace_regex_get_replace (const char *string, regmatch_t *regex_match,
int last_match, const char *replace,
- const char reference_char)
+ const char reference_char,
+ char *(*callback)(void *data, const char *text),
+ void *callback_data)
{
int length, length_current, length_add, match;
const char *ptr_replace, *ptr_add;
@@ -1208,8 +1210,26 @@ string_replace_regex_get_replace (const char *string, regmatch_t *regex_match,
}
if (regex_match[match].rm_so >= 0)
{
- ptr_add = string + regex_match[match].rm_so;
- length_add = regex_match[match].rm_eo - regex_match[match].rm_so;
+ if (callback)
+ {
+ temp = string_strndup (string + regex_match[match].rm_so,
+ regex_match[match].rm_eo - regex_match[match].rm_so);
+ if (temp)
+ {
+ modified_replace = (*callback) (callback_data, temp);
+ if (modified_replace)
+ {
+ ptr_add = modified_replace;
+ length_add = strlen (modified_replace);
+ }
+ free (temp);
+ }
+ }
+ if (!ptr_add)
+ {
+ ptr_add = string + regex_match[match].rm_so;
+ length_add = regex_match[match].rm_eo - regex_match[match].rm_so;
+ }
}
}
else if ((ptr_replace[1] == '.')
@@ -1308,6 +1328,11 @@ string_replace_regex_get_replace (const char *string, regmatch_t *regex_match,
* (the char '*' can be replaced by any char between space (32)
* and '~' (126))
*
+ * If the callback is not NULL, it is called for every reference to a match
+ * (except for matches replaced by a char).
+ * If not NULL, the string returned by the callback (which must have been newly
+ * allocated) is used and freed after use.
+ *
* Examples:
*
* string | regex | replace | result
@@ -1322,7 +1347,9 @@ string_replace_regex_get_replace (const char *string, regmatch_t *regex_match,
char *
string_replace_regex (const char *string, void *regex, const char *replace,
- const char reference_char)
+ const char reference_char,
+ char *(*callback)(void *data, const char *text),
+ void *callback_data)
{
char *result, *result2, *str_replace;
int length, length_replace, start_offset, i, rc, end, last_match;
@@ -1373,9 +1400,13 @@ string_replace_regex (const char *string, void *regex, const char *replace,
/* check if the regex matched the end of string */
end = !result[regex_match[0].rm_eo];
- str_replace = string_replace_regex_get_replace (result, regex_match,
+ str_replace = string_replace_regex_get_replace (result,
+ regex_match,
last_match,
- replace, reference_char);
+ replace,
+ reference_char,
+ callback,
+ callback_data);
length_replace = (str_replace) ? strlen (str_replace) : 0;
length = regex_match[0].rm_so + length_replace +
diff --git a/src/core/wee-string.h b/src/core/wee-string.h
index 1ae8cb9b2..bf34cb2a3 100644
--- a/src/core/wee-string.h
+++ b/src/core/wee-string.h
@@ -59,7 +59,9 @@ extern int string_has_highlight_regex_compiled (const char *string,
extern int string_has_highlight_regex (const char *string, const char *regex);
extern char *string_replace_regex (const char *string, void *regex,
const char *replace,
- const char reference_char);
+ const char reference_char,
+ char *(*callback)(void *data, const char *text),
+ void *callback_data);
extern char **string_split (const char *string, const char *separators,
int keep_eol, int num_items_max, int *num_items);
extern char **string_split_shared (const char *string, const char *separators,