diff options
author | nicm <nicm> | 2019-05-23 14:03:44 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-05-23 14:03:44 +0000 |
commit | 27bfb56ad5e19afa686ed6a99bf8b205fac98aef (patch) | |
tree | 9d7eafe33dfe96c3194bbce93d43013e3565af39 /arguments.c | |
parent | 3e3eb1dd0faa707fa6bdfd12d455ad711d775241 (diff) | |
download | rtmux-27bfb56ad5e19afa686ed6a99bf8b205fac98aef.tar.gz rtmux-27bfb56ad5e19afa686ed6a99bf8b205fac98aef.tar.bz2 rtmux-27bfb56ad5e19afa686ed6a99bf8b205fac98aef.zip |
Break the argument escaping code into a separate function and use it to
escape key bindings in list-keys. Also escape ~ and ; and $ properly.
Diffstat (limited to 'arguments.c')
-rw-r--r-- | arguments.c | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/arguments.c b/arguments.c index f7288e81..eebb79ff 100644 --- a/arguments.c +++ b/arguments.c @@ -141,23 +141,15 @@ static void args_print_add_value(char **buf, size_t *len, struct args_entry *entry, struct args_value *value) { - static const char quoted[] = " #\"';$"; - char *escaped; - int flags; + char *escaped; if (**buf != '\0') args_print_add(buf, len, " -%c ", entry->flag); else args_print_add(buf, len, "-%c ", entry->flag); - flags = VIS_OCTAL|VIS_TAB|VIS_NL; - if (value->value[strcspn(value->value, quoted)] != '\0') - flags |= VIS_DQ; - utf8_stravis(&escaped, value->value, flags); - if (flags & VIS_DQ) - args_print_add(buf, len, "\"%s\"", escaped); - else - args_print_add(buf, len, "%s", escaped); + escaped = args_escape(value->value); + args_print_add(buf, len, "%s", escaped); free(escaped); } @@ -165,21 +157,13 @@ args_print_add_value(char **buf, size_t *len, struct args_entry *entry, static void args_print_add_argument(char **buf, size_t *len, const char *argument) { - static const char quoted[] = " #\"';$"; - char *escaped; - int flags; + char *escaped; if (**buf != '\0') args_print_add(buf, len, " "); - flags = VIS_OCTAL|VIS_TAB|VIS_NL; - if (argument[strcspn(argument, quoted)] != '\0') - flags |= VIS_DQ; - utf8_stravis(&escaped, argument, flags); - if (flags & VIS_DQ) - args_print_add(buf, len, "\"%s\"", escaped); - else - args_print_add(buf, len, "%s", escaped); + escaped = args_escape(argument); + args_print_add(buf, len, "%s", escaped); free(escaped); } @@ -219,6 +203,39 @@ args_print(struct args *args) return (buf); } +/* Escape an argument. */ +char * +args_escape(const char *s) +{ + static const char quoted[] = " #\"';$"; + char *escaped, *result; + int flags; + + if ((strchr(quoted, s[0]) != NULL || s[0] == '~') && s[1] == '\0') { + xasprintf(&escaped, "\\%c", s[0]); + return (escaped); + } + + flags = VIS_OCTAL|VIS_TAB|VIS_NL; + if (s[strcspn(s, quoted)] != '\0') + flags |= VIS_DQ; + utf8_stravis(&escaped, s, flags); + + if (flags & VIS_DQ) { + if (*escaped == '~') + xasprintf(&result, "\"\\%s\"", escaped); + else + xasprintf(&result, "\"%s\"", escaped); + } else { + if (*escaped == '~') + xasprintf(&result, "\\%s", escaped); + else + result = xstrdup(escaped); + } + free(escaped); + return (result); +} + /* Return if an argument is present. */ int args_has(struct args *args, u_char ch) |