summaryrefslogtreecommitdiff
path: root/src/util.c
diff options
context:
space:
mode:
authorDaniel Carl <danielcarl@gmx.de>2014-06-04 23:08:19 +0200
committerDaniel Carl <danielcarl@gmx.de>2014-06-04 23:08:19 +0200
commitb410c09291edfd6dad93fb5275363ee8f30b4bb1 (patch)
tree10c5765aa28bb94d59e619500b22f43263022493 /src/util.c
parent008056cbb4e7a2a0bc1169d5257c3c10f09b2c2e (diff)
Allow to escape ~user expansion with \ char.
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/util.c b/src/util.c
index 69c2b59..404d205 100644
--- a/src/util.c
+++ b/src/util.c
@@ -352,7 +352,7 @@ char *util_expand(const char *src, int expflags)
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;
@@ -376,15 +376,17 @@ char *util_expand(const char *src, int expflags)
* not expanded char. If no expansion pattern was found, the first char is
* appended to given GString.
*
- * @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.
+ * @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 \.
* Returns true if input started with expandable pattern.
*/
-gboolean util_parse_expansion(const char **input, GString *str, int flags)
+gboolean util_parse_expansion(const char **input, GString *str, int flags,
+ const char *quoteable)
{
GString *name;
- const char *env, *prev;
+ const char *env, *prev, quote = '\\';
struct passwd *pwd;
gboolean expanded = false;
@@ -461,8 +463,26 @@ gboolean util_parse_expansion(const char **input, GString *str, int flags)
if (!expanded) {
/* restore the pointer position if no expansion was found */
*input = prev;
- /* take the char like it is */
- g_string_append_c(str, **input);
+
+ /* handle escaping of quoteable chars */
+ if (**input == quote) {
+ /* move pointer to the next char */
+ (*input)++;
+ if (!*input) {
+ /* if input ends here - use only the quote char */
+ g_string_append_c(str, quote);
+ } else if (strchr(quoteable, **input)) {
+ /* escaped char becomes only char */
+ g_string_append_c(str, **input);
+ } else {
+ /* put escape char and next char into the result string */
+ g_string_append_c(str, quote);
+ g_string_append_c(str, **input);
+ }
+ } else {
+ /* take the char like it is */
+ g_string_append_c(str, **input);
+ }
}
return expanded;