Use double pointers for haystack
This commit is contained in:
parent
4b7f656f6e
commit
e16117ca30
@ -207,28 +207,24 @@ void notification_free(notification *n)
|
||||
* to point to the first char, which occurs after replacement.
|
||||
*
|
||||
*/
|
||||
char *notification_replace_single_field(char *haystack, char **needle,
|
||||
void notification_replace_single_field(char **haystack, char **needle,
|
||||
const char *replacement, enum markup_mode markup_mode) {
|
||||
|
||||
assert(*needle[0] == '%');
|
||||
// needle has to point into haystack (but not on the last char)
|
||||
assert(*needle >= haystack);
|
||||
assert(*needle - haystack < strlen(haystack) - 1);
|
||||
assert(*needle >= *haystack);
|
||||
assert(*needle - *haystack < strlen(*haystack) - 1);
|
||||
|
||||
char *ret;
|
||||
|
||||
int pos = *needle - haystack;
|
||||
int pos = *needle - *haystack;
|
||||
|
||||
char *input = markup_transform(g_strdup(replacement), markup_mode);
|
||||
ret = string_replace_at(haystack, pos, 2, input);
|
||||
*haystack = string_replace_at(*haystack, pos, 2, input);
|
||||
|
||||
// point the needle to the next char
|
||||
// which was originally in haystack
|
||||
*needle = ret + (*needle - haystack) + strlen(input);
|
||||
*needle = *haystack + pos + strlen(input);
|
||||
|
||||
g_free(input);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *notification_extract_markup_urls(char **str_ptr) {
|
||||
@ -333,66 +329,66 @@ int notification_init(notification *n, int id)
|
||||
|
||||
switch(substr[1]){
|
||||
case 'a':
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
n->appname,
|
||||
MARKUP_NO);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
n->appname,
|
||||
MARKUP_NO);
|
||||
break;
|
||||
case 's':
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
n->summary,
|
||||
n->markup);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
n->summary,
|
||||
n->markup);
|
||||
break;
|
||||
case 'b':
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
n->body,
|
||||
n->markup);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
n->body,
|
||||
n->markup);
|
||||
break;
|
||||
case 'I':
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
n->icon ? basename(n->icon) : "",
|
||||
MARKUP_NO);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
n->icon ? basename(n->icon) : "",
|
||||
MARKUP_NO);
|
||||
break;
|
||||
case 'i':
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
n->icon ? n->icon : "",
|
||||
MARKUP_NO);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
n->icon ? n->icon : "",
|
||||
MARKUP_NO);
|
||||
break;
|
||||
case 'p':
|
||||
if (n->progress)
|
||||
sprintf(pg, "[%3d%%]", n->progress - 1);
|
||||
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
n->progress ? pg : "",
|
||||
MARKUP_NO);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
n->progress ? pg : "",
|
||||
MARKUP_NO);
|
||||
break;
|
||||
case 'n':
|
||||
if (n->progress)
|
||||
sprintf(pg, "%d", n->progress - 1);
|
||||
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
n->progress ? pg : "",
|
||||
MARKUP_NO);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
n->progress ? pg : "",
|
||||
MARKUP_NO);
|
||||
break;
|
||||
case '%':
|
||||
n->msg = notification_replace_single_field(
|
||||
n->msg,
|
||||
&substr,
|
||||
"%",
|
||||
MARKUP_NO);
|
||||
notification_replace_single_field(
|
||||
&n->msg,
|
||||
&substr,
|
||||
"%",
|
||||
MARKUP_NO);
|
||||
break;
|
||||
case '\0':
|
||||
fprintf(stderr, "WARNING: format_string has trailing %% character."
|
||||
|
@ -73,7 +73,7 @@ int notification_is_duplicate(const notification *a, const notification *b);
|
||||
void notification_run_script(notification *n);
|
||||
int notification_close(notification *n, int reason);
|
||||
void notification_print(notification *n);
|
||||
char *notification_replace_single_field(char *haystack, char **needle, const char *replacement, enum markup_mode markup_mode);
|
||||
void notification_replace_single_field(char **haystack, char **needle, const char *replacement, enum markup_mode markup_mode);
|
||||
void notification_update_text_to_render(notification *n);
|
||||
int notification_get_ttl(notification *n);
|
||||
int notification_get_age(notification *n);
|
||||
|
@ -77,17 +77,20 @@ TEST test_notification_replace_single_field(void)
|
||||
|
||||
strcpy(str, "Markup %a preserved");
|
||||
substr = strchr(str, '%');
|
||||
ASSERT_STR_EQ("Markup and & <i>is</i> preserved", (str = notification_replace_single_field(str, &substr, "and & <i>is</i>", MARKUP_FULL)));
|
||||
notification_replace_single_field(&str, &substr, "and & <i>is</i>", MARKUP_FULL);
|
||||
ASSERT_STR_EQ("Markup and & <i>is</i> preserved", str);
|
||||
ASSERT_EQ(26, substr - str);
|
||||
|
||||
strcpy(str, "Markup %a escaped");
|
||||
substr = strchr(str, '%');
|
||||
ASSERT_STR_EQ("Markup and & <i>is</i> escaped", (str = notification_replace_single_field(str, &substr, "and & <i>is</i>", MARKUP_NO)));
|
||||
notification_replace_single_field(&str, &substr, "and & <i>is</i>", MARKUP_NO);
|
||||
ASSERT_STR_EQ("Markup and & <i>is</i> escaped", str);
|
||||
ASSERT_EQ(38, substr - str);
|
||||
|
||||
strcpy(str, "Markup %a");
|
||||
substr = strchr(str, '%');
|
||||
ASSERT_STR_EQ("Markup is removed and & escaped", (str = notification_replace_single_field(str, &substr, "<i>is removed</i> and & escaped", MARKUP_STRIP)));
|
||||
notification_replace_single_field(&str, &substr, "<i>is removed</i> and & escaped", MARKUP_STRIP);
|
||||
ASSERT_STR_EQ("Markup is removed and & escaped", str);
|
||||
ASSERT_EQ(35, substr - str);
|
||||
|
||||
g_free(str);
|
||||
|
Loading…
x
Reference in New Issue
Block a user