diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/special-vars.c | 15 | ||||
-rw-r--r-- | src/core/special-vars.h | 1 | ||||
-rw-r--r-- | src/fe-text/gui-windows.c | 3 |
3 files changed, 17 insertions, 2 deletions
diff --git a/src/core/special-vars.c b/src/core/special-vars.c index 62202a20..40372f93 100644 --- a/src/core/special-vars.c +++ b/src/core/special-vars.c @@ -435,6 +435,16 @@ char *parse_special(char **cmd, SERVER_REC *server, void *item, return value; } +static void gstring_append_escaped(GString *str, const char *text) +{ + while (*text != '\0') { + if (*text == '%') + g_string_append_c(str, '%'); + g_string_append_c(str, *text); + text++; + } +} + /* parse the whole string. $ and \ chars are replaced */ char *parse_special_string(const char *cmd, SERVER_REC *server, void *item, const char *data, int *arg_used, int flags) @@ -472,7 +482,10 @@ char *parse_special_string(const char *cmd, SERVER_REC *server, void *item, arglist, &need_free, arg_used, flags); if (ret != NULL) { - g_string_append(str, ret); + if ((flags & PARSE_FLAG_ESCAPE_VARS) == 0) + g_string_append(str, ret); + else + gstring_append_escaped(str, ret); if (need_free) g_free(ret); } code = 0; diff --git a/src/core/special-vars.h b/src/core/special-vars.h index e55996b1..af02e121 100644 --- a/src/core/special-vars.h +++ b/src/core/special-vars.h @@ -5,6 +5,7 @@ #define PARSE_FLAG_GETNAME 0x01 /* return argument name instead of it's value */ #define PARSE_FLAG_ISSET_ANY 0x02 /* arg_used field specifies that at least one of the $variables was non-empty */ +#define PARSE_FLAG_ESCAPE_VARS 0x04 /* if any arguments/variables contain % chars, escape them with another % */ typedef char* (*SPECIAL_HISTORY_FUNC) (const char *text, void *item, int *free_ret); diff --git a/src/fe-text/gui-windows.c b/src/fe-text/gui-windows.c index d206f62e..1655fbe8 100644 --- a/src/fe-text/gui-windows.c +++ b/src/fe-text/gui-windows.c @@ -693,7 +693,8 @@ void window_update_prompt(void) prompt = parse_special_string(special, active_win->active_server, active_win->active, "", &var_used, - PARSE_FLAG_ISSET_ANY); + PARSE_FLAG_ISSET_ANY | + PARSE_FLAG_ESCAPE_VARS); if (!var_used && strchr(special, '$') != NULL) { /* none of the $vars had non-empty values, use empty prompt */ *prompt = '\0'; |