static gboolean parse_rhs(const char **input, ExArg *arg)
{
int expflags, flags;
- const char *quoteable;
if (!*input || !**input) {
return false;
}
- if (arg->flags & EX_FLAG_EXP) {
- expflags = UTIL_EXP_TILDE|UTIL_EXP_DOLLAR|UTIL_EXP_SPECIAL;
- quoteable = "|~$%\\";
- } else {
- expflags = 0;
- quoteable = "|\\";
- }
+ expflags = (arg->flags & EX_FLAG_EXP)
+ ? UTIL_EXP_TILDE|UTIL_EXP_DOLLAR|UTIL_EXP_SPECIAL
+ : 0;
flags = expflags;
/* get char until the end of command */
while (**input && **input != '\n' && **input != '|') {
/* check for expansion placeholder */
- util_parse_expansion(input, arg->rhs, flags, quoteable);
+ util_parse_expansion(input, arg->rhs, flags, "|\\");
if (VB_IS_SEPARATOR(**input)) {
/* add tilde expansion for next loop needs to be first char or to
int flags = expflags;
while (**input) {
- util_parse_expansion(input, dst, flags, "~$%\\");
+ util_parse_expansion(input, dst, flags, "\\");
if (VB_IS_SEPARATOR(**input)) {
/* after space the tilde expansion is allowed */
flags = expflags;
* @input: String pointer with the content to be parsed.
* @str: GString that will be filled with expanded content.
* @flags Flags that determine which expansion are processed.
- * @quoteable String of chars that are allowed to be escaped by \.
+ * @quoteable String of chars that are additionally escapable by \.
* Returns true if input started with expandable pattern.
*/
gboolean util_parse_expansion(const char **input, GString *str, int flags,
if (!*input) {
/* if input ends here - use only the quote char */
g_string_append_c(str, quote);
- } else if (strchr(quoteable, **input)) {
+ } else if (strchr(quoteable, **input)
+ || (flags & UTIL_EXP_TILDE && **input == '~')
+ || (flags & UTIL_EXP_DOLLAR && **input == '$')
+ || (flags & UTIL_EXP_SPECIAL && **input == '%')
+ ) {
/* escaped char becomes only char */
g_string_append_c(str, **input);
} else {