summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/special-vars.c15
-rw-r--r--src/core/special-vars.h1
-rw-r--r--src/fe-text/gui-windows.c3
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';