about summary refs log tree commit diff
path: root/Src/Zle/zle_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle/zle_misc.c')
-rw-r--r--Src/Zle/zle_misc.c61
1 files changed, 37 insertions, 24 deletions
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index a017c6709..e9082255f 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -738,7 +738,11 @@ makequote(ZLE_STRING_T str, size_t *len)
     return ol;
 }
 
-static char *cmdbuf;
+/*
+ * cmdstr is the buffer used for execute-named-command converted
+ * to a metafied multibyte string.
+ */
+static char *cmdstr;
 static LinkList cmdll;
 static int cmdambig;
 
@@ -749,7 +753,7 @@ scancompcmd(HashNode hn, UNUSED(int flags))
     int l;
     Thingy t = (Thingy) hn;
 
-    if(strpfx(cmdbuf, t->nam)) {
+    if(strpfx(cmdstr, t->nam)) {
 	addlinknode(cmdll, t->nam);
 	l = pfxlen(peekfirst(cmdll), t->nam);
 	if (l < cmdambig)
@@ -765,20 +769,22 @@ Thingy
 executenamedcommand(char *prmt)
 {
     Thingy cmd;
-    int len, l = strlen(prmt), feep = 0, listed = 0, curlist = 0;
+    int l, len, feep = 0, listed = 0, curlist = 0;
     int ols = (listshown && validlist), olll = lastlistlen;
-    char *ptr;
+    ZLE_STRING_T cmdbuf, ptr, zprmt;
     char *okeymap = ztrdup(curkeymapname);
 
     clearlist = 1;
-    cmdbuf = zhalloc(l + NAMLEN + 2);
-    strcpy(cmdbuf, prmt);
+    zprmt = stringaszleline((unsigned char *)prmt, &l, NULL);
+    cmdbuf = zhalloc((l + NAMLEN + 2) * ZLE_CHAR_SIZE);
+    ZS_memcpy(cmdbuf, zprmt, l);
+    free(zprmt);
     statusline = cmdbuf;
     selectkeymap("main", 1);
     ptr = cmdbuf += l;
     len = 0;
     for (;;) {
-	*ptr = '_';
+	*ptr = ZWC('_');
 	statusll = l + len + 1;
 	zrefresh();
 	if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) {
@@ -814,35 +820,31 @@ executenamedcommand(char *prmt)
 		zmult = zmultsav;
 	    }
 	} else if(cmd == Th(z_viquotedinsert)) {
-	    *ptr = '^';
+	    *ptr = ZWC('^');
 	    zrefresh();
 	    getfullchar(0);
 	    if(LASTFULLCHAR == ZLEEOF || !LASTFULLCHAR || len == NAMLEN)
 		feep = 1;
 	    else {
-		/* TODO: convert back to multibyte string */
-		*ptr++ = lastchar, len++, curlist = 0;
+		*ptr++ = LASTFULLCHAR, len++, curlist = 0;
 	    }
 	} else if(cmd == Th(z_quotedinsert)) {
 	    if(getfullchar(0) == ZLEEOF ||
 	       !LASTFULLCHAR || len == NAMLEN)
 		feep = 1;
 	    else {
-		/* TODO: convert back to multibyte string */
-		*ptr++ = lastchar, len++, curlist = 0;
+		*ptr++ = LASTFULLCHAR, len++, curlist = 0;
 	    }
 	} else if(cmd == Th(z_backwarddeletechar) ||
 	    	cmd == Th(z_vibackwarddeletechar)) {
 	    if (len) {
-		/* TODO: backward full character in multibyte string. Yuk. */
 		len--, ptr--, curlist = 0;
 	    }
 	} else if(cmd == Th(z_killregion) || cmd == Th(z_backwardkillword) ||
 		  cmd == Th(z_vibackwardkillword)) {
 	    if (len)
 		curlist = 0;
-	    /* TODO: backward full character in multibyte string. Yuk. */
-	    while (len && (len--, *--ptr != '-'));
+	    while (len && (len--, *--ptr != ZWC('-')));
 	} else if(cmd == Th(z_killwholeline) || cmd == Th(z_vikillline) ||
 	    	cmd == Th(z_backwardkillline)) {
 	    len = 0;
@@ -855,7 +857,10 @@ executenamedcommand(char *prmt)
 		Thingy r;
 		unambiguous:
 		*ptr = 0;
-		r = rthingy(cmdbuf);
+		cmdstr = zlelineasstring(cmdbuf, len, 0, NULL, NULL, 0);
+		r = rthingy(cmdstr);
+		free(cmdstr);
+		cmdstr = NULL;
 		if (!(r->flags & DISABLED)) {
 		    unrefthingy(r);
 		    statusline = NULL;
@@ -881,9 +886,11 @@ executenamedcommand(char *prmt)
 		cmdambig = 100;
 
 		cmdll = newlinklist();
-		*ptr = 0;
 
+		cmdstr = zlelineasstring(cmdbuf, len, 0, NULL, NULL, 0);
 		scanhashtable(thingytab, 1, 0, DISABLED, scancompcmd, 0);
+		free(cmdstr);
+		cmdstr = NULL;
 
 		if (empty(cmdll)) {
 		    feep = 1;
@@ -893,7 +900,7 @@ executenamedcommand(char *prmt)
 		} else if (cmd == Th(z_listchoices) ||
 		    cmd == Th(z_deletecharorlist)) {
 		    int zmultsav = zmult;
-		    *ptr = '_';
+		    *ptr = ZWC('_');
 		    statusll = l + len + 1;
 		    zmult = 1;
 		    listlist(cmdll);
@@ -901,14 +908,21 @@ executenamedcommand(char *prmt)
 		    showinglist = 0;
 		    zmult = zmultsav;
 		} else if (!nextnode(firstnode(cmdll))) {
-		    strcpy(ptr = cmdbuf, peekfirst(cmdll));
-		    ptr += (len = strlen(ptr));
+		    ZLE_STRING_T ztmp = stringaszleline(peekfirst(cmdll),
+							&len, NULL);
+		    ZS_memcpy(ptr = cmdbuf, ztmp, len);
+		    ptr += len;
+		    free(ztmp);
 		    if(cmd == Th(z_acceptline) || cmd == Th(z_vicmdmode))
 			goto unambiguous;
 		} else {
-		    strcpy(cmdbuf, peekfirst(cmdll));
+		    int ltmp;
+		    ZLE_STRING_T ztmp = stringaszleline(peekfirst(cmdll),
+							&ltmp, NULL);
+		    ZS_mempcy(cmdbuf, ztmp, ltmp);
+		    free(ztmp);
 		    ptr = cmdbuf + cmdambig;
-		    *ptr = '_';
+		    *ptr = ZWC('_');
 		    if (isset(AUTOLIST) &&
 			!(isset(LISTAMBIGUOUS) && cmdambig > len)) {
 			int zmultsav = zmult;
@@ -938,8 +952,7 @@ executenamedcommand(char *prmt)
 			feep = 1;
 		    }
 		    else {
-			/* TODO: convert back to multibyte string */
-			*ptr++ = lastchar, len++, curlist = 0;
+			*ptr++ = LASTFULLCHAR, len++, curlist = 0;
 		    }
 		}
 	    }