version 1.34, 2020/06/04 07:12:05 |
version 1.35, 2020/06/12 07:10:43 |
|
|
char * |
char * |
args_escape(const char *s) |
args_escape(const char *s) |
{ |
{ |
static const char quoted[] = " #\"';${}"; |
static const char dquoted[] = " #';${}"; |
|
static const char squoted[] = " \""; |
char *escaped, *result; |
char *escaped, *result; |
int flags; |
int flags, quotes = 0; |
|
|
if (*s == '\0') { |
if (*s == '\0') { |
xasprintf(&result, "''"); |
xasprintf(&result, "''"); |
return (result); |
return (result); |
} |
} |
|
if (s[strcspn(s, dquoted)] != '\0') |
|
quotes = '"'; |
|
else if (s[strcspn(s, squoted)] != '\0') |
|
quotes = '\''; |
|
|
if (s[0] != ' ' && |
if (s[0] != ' ' && |
(strchr(quoted, s[0]) != NULL || s[0] == '~') && |
s[1] == '\0' && |
s[1] == '\0') { |
(quotes != 0 || s[0] == '~')) { |
xasprintf(&escaped, "\\%c", s[0]); |
xasprintf(&escaped, "\\%c", s[0]); |
return (escaped); |
return (escaped); |
} |
} |
|
|
if (strchr(s, ' ') != NULL && strchr(s, '\'') == NULL) { |
|
xasprintf(&escaped, "'%s'", s); |
|
return (escaped); |
|
} |
|
|
|
flags = VIS_OCTAL|VIS_CSTYLE|VIS_TAB|VIS_NL; |
flags = VIS_OCTAL|VIS_CSTYLE|VIS_TAB|VIS_NL; |
if (s[strcspn(s, quoted)] != '\0') |
if (quotes == '"') |
flags |= VIS_DQ; |
flags |= VIS_DQ; |
utf8_stravis(&escaped, s, flags); |
utf8_stravis(&escaped, s, flags); |
|
|
if (flags & VIS_DQ) { |
if (quotes == '\'') |
|
xasprintf(&result, "'%s'", escaped); |
|
else if (quotes == '"') { |
if (*escaped == '~') |
if (*escaped == '~') |
xasprintf(&result, "\"\\%s\"", escaped); |
xasprintf(&result, "\"\\%s\"", escaped); |
else |
else |