Break the argument escaping code into a separate function and use it to

escape key bindings in list-keys. Also escape ~ and ; and $ properly.
This commit is contained in:
nicm
2019-05-23 14:03:44 +00:00
parent 3e3eb1dd0f
commit 27bfb56ad5
7 changed files with 65 additions and 35 deletions

View File

@ -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)