about summary refs log tree commit diff
path: root/Src/Zle/computil.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-11-08 10:26:20 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-11-08 10:26:20 +0000
commitf9a6f521d6475360bee03808ced1f301983bb700 (patch)
tree6e01b5b9e8b01ca160c211e88a6a451967f39e5d /Src/Zle/computil.c
parent623351671b7437dee08763bbdf9d2e8e6505e347 (diff)
downloadzsh-f9a6f521d6475360bee03808ced1f301983bb700.tar.gz
zsh-f9a6f521d6475360bee03808ced1f301983bb700.tar.xz
zsh-f9a6f521d6475360bee03808ced1f301983bb700.zip
zsh-workers/8588
Diffstat (limited to 'Src/Zle/computil.c')
-rw-r--r--Src/Zle/computil.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index 0f8188762..22a8f7656 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -1887,11 +1887,62 @@ bin_compvalues(char *nam, char **args, char *ops, int func)
 }
 
 
+static int
+bin_compquote(char *nam, char **args, char *ops, int func)
+{
+    char *name;
+    Value v;
+
+    if (!compqstack || !*compqstack)
+	return 0;
+
+    while ((name = *args++)) {
+	name = dupstring(name);
+	if ((v = getvalue(&name, 0))) {
+	    switch (PM_TYPE(v->pm->flags)) {
+	    case PM_SCALAR:
+		{
+		    char *val = getstrvalue(v);
+
+		    val = bslashquote(val, NULL,
+				      (*compqstack == '\'' ? 1 :
+				       (*compqstack == '"' ? 2 : 0)));
+
+		    setstrvalue(v, ztrdup(val));
+		}
+		break;
+	    case PM_ARRAY:
+		{
+		    char **val = v->pm->gets.afn(v->pm);
+		    char **new = (char **) zalloc((arrlen(val) + 1) *
+						  sizeof(char *));
+		    char **p = new;
+
+		    for (; *val; val++, p++)
+			*p = ztrdup(bslashquote(*val, NULL,
+						(*compqstack == '\'' ? 1 :
+						 (*compqstack == '"' ? 2 :
+						  0))));
+		    *p = NULL;
+
+		    setarrvalue(v, new);
+		}
+		break;
+	    default:
+		zwarnnam(nam, "invalid parameter type: %s", args[-1], 0);
+	    }
+	} else
+	    zwarnnam(nam, "unknown parameter: %s", args[-1], 0);
+    }
+    return 0;
+}
+
 static struct builtin bintab[] = {
     BUILTIN("compdisplay", 0, bin_compdisplay, 2, -1, 0, NULL, NULL),
     BUILTIN("compdescribe", 0, bin_compdescribe, 3, -1, 0, NULL, NULL),
     BUILTIN("comparguments", 0, bin_comparguments, 1, -1, 0, NULL, NULL),
     BUILTIN("compvalues", 0, bin_compvalues, 1, -1, 0, NULL, NULL),
+    BUILTIN("compquote", 0, bin_compquote, 1, -1, 0, NULL, NULL),
 };