about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--Src/Zle/complist.c6
-rw-r--r--Src/Zle/compmatch.c4
-rw-r--r--Src/Zle/compresult.c8
-rw-r--r--Src/Zle/zle.h10
-rw-r--r--Src/Zle/zle_hist.c4
-rw-r--r--Src/Zle/zle_keymap.c6
-rw-r--r--Src/Zle/zle_main.c16
-rw-r--r--Src/Zle/zle_misc.c10
-rw-r--r--Src/Zle/zle_refresh.c32
-rw-r--r--Src/Zle/zle_thingy.c8
-rw-r--r--Src/Zle/zle_tricky.c10
-rw-r--r--Src/Zle/zle_utils.c14
-rw-r--r--Src/Zle/zle_vi.c4
-rw-r--r--Src/prompt.c22
-rw-r--r--Src/string.c4
-rw-r--r--Src/system.h6
-rw-r--r--Src/utils.c60
-rw-r--r--Src/zsh.h6
-rw-r--r--configure.ac6
20 files changed, 131 insertions, 117 deletions
diff --git a/ChangeLog b/ChangeLog
index 9ff1abd20..aaae78fa1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,16 @@
 2005-10-28  Peter Stephenson  <pws@csr.com>
 
-	* 21942: Src/Zle/zle_fresh.c: another bug found when deleting
+	* 21943, 21945: configure.ac, Src/prompt.c, Src/string.c,
+	Src/system.h, Src/utils.c, Src/zsh.h, Src/Zle/complist.c,
+	Src/Zle/compmatch.c, Src/Zle/compresult.c, Src/Zle/zle.h,
+	Src/Zle/zle_hist.c, Src/Zle/zle_keymap.c, Src/Zle/zle_main.c,
+	Src/Zle/zle_misc.c, Src/Zle/zle_refresh.c, Src/Zle/zle_thingy.c,
+	Src/Zle/zle_tricky.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c:
+	Replace ZLE_UNICODE_SUPPORT by MULTIBYTE_SUPPORT throughout.
+	Use multibyte versions of "nicechar" functions wherever
+	possible.
+
+	* 21942: Src/Zle/zle_refresh.c: another bug found when deleting
 	an extra-wide character.
 
 2005-10-26  Peter Stephenson  <pws@csr.com>
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index e0ee806bb..a84a34768 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -559,7 +559,7 @@ clnicezputs(Listcols colors, char *s, int ml)
     int i = 0, col = 0, ask, oml = ml;
     char *t;
     ZLE_CHAR_T cc;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * ums is the untokenized, unmetafied string (length umlen)
      * uptr is a pointer into it
@@ -1940,7 +1940,7 @@ msearchpop(int *backp)
 static Cmatch **
 msearch(Cmatch **ptr, int ins, int back, int rep, int *wrapp)
 {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /* MB_CUR_MAX may not be constant */
     VARARR(char, s, MB_CUR_MAX+1);
 #else
@@ -1953,7 +1953,7 @@ msearch(Cmatch **ptr, int ins, int back, int rep, int *wrapp)
     msearchpush(ptr, back);
 
     if (ins) {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	if (lastchar_wide_valid)
 	{
 	    int len = wctomb(s, lastchar_wide);
diff --git a/Src/Zle/compmatch.c b/Src/Zle/compmatch.c
index e4c5a438f..4449f3554 100644
--- a/Src/Zle/compmatch.c
+++ b/Src/Zle/compmatch.c
@@ -1584,7 +1584,7 @@ sub_match(Cmdata md, char *str, int len, int sfx)
 {
     int ret = 0, l, ind, add;
     char *p, *q;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     int fulllen = len;
     char *fullstr = str;
     mbstate_t ps;
@@ -1619,7 +1619,7 @@ sub_match(Cmdata md, char *str, int len, int sfx)
 		   || (l < md->len && q[-1] == Meta)))
 		l--;
 	}
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	/*
 	 * Make sure we don't end in the middle of a multibyte character.
 	 * Don't need to do this if the match ended at the start
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index ad8c8ea62..4018c5488 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -2146,15 +2146,15 @@ iprintm(Cmgroup g, Cmatch *mp, UNUSED(int mc), UNUSED(int ml), int lastc, int wi
 	    printfmt(m->disp, 0, 1, 0);
 	    return;
 	}
-#ifdef ZLE_UNICODE_SUPPORT
-	len = mb_niceformat(m->disp, shout, NULL);
+#ifdef MULTIBYTE_SUPPORT
+	len = mb_niceformat(m->disp, shout, NULL, 0);
 #else
 	nicezputs(m->disp, shout);
 	len = niceztrlen(m->disp);
 #endif
     } else {
-#ifdef ZLE_UNICODE_SUPPORT
-	len = mb_niceformat(m->str, shout, NULL);
+#ifdef MULTIBYTE_SUPPORT
+	len = mb_niceformat(m->str, shout, NULL, 0);
 #else
 	nicezputs(m->str, shout);
 	len = niceztrlen(m->str);
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index 26a27fe09..9a3828139 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -27,7 +27,7 @@
  *
  */
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 typedef wchar_t ZLE_CHAR_T;
 typedef wchar_t *ZLE_STRING_T;
 typedef wint_t   ZLE_INT_T;
@@ -67,9 +67,7 @@ typedef wint_t   ZLE_INT_T;
  * Functions that operate on a metafied string.
  * These versions handle multibyte characters.
  */
-#define ZMB_nicewidth(s)	mb_niceformat(s, NULL, NULL)
-#define ZMB_niceputs(s, stream)	(void)mb_niceformat(s, stream, NULL)
-#define ZMB_niceztrdup(s)	mb_niceztrdup(s)
+#define ZMB_nicewidth(s)	mb_niceformat(s, NULL, NULL, 0)
 
 /* Functions that operate on ZLE_CHAR_T. */
 #define ZC_iblank iswspace
@@ -84,7 +82,7 @@ typedef wint_t   ZLE_INT_T;
 
 #define LASTFULLCHAR	lastchar_wide
 
-#else  /* Not ZLE_UNICODE_SUPPORT: old single-byte code */
+#else  /* Not MULTIBYTE_SUPPORT: old single-byte code */
 
 typedef int ZLE_CHAR_T;
 typedef unsigned char *ZLE_STRING_T;
@@ -111,8 +109,6 @@ typedef int ZLE_INT_T;
  * These versions don't handle multibyte characters.
  */
 #define ZMB_nicewidth	niceztrlen
-#define ZMB_niceputs	nicezputs
-#define ZMB_niceztrdup(s)	nicedup(s, 0)
 
 #define ZC_nicechar nicechar
 
diff --git a/Src/Zle/zle_hist.c b/Src/Zle/zle_hist.c
index 402887d98..38540a032 100644
--- a/Src/Zle/zle_hist.c
+++ b/Src/Zle/zle_hist.c
@@ -1108,7 +1108,7 @@ doisearch(char **args, int dir)
 	    } else if (cmd == Th(z_magicspace)) {
 		fixmagicspace();
 	    } else if (cmd == Th(z_selfinsert)) {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		if (!lastchar_wide_valid)
 		    getrestchar(lastchar);
 #else
@@ -1305,7 +1305,7 @@ getvisrchstr(void)
 	    if(cmd == Th(z_selfinsertunmeta)) {
 		fixunmeta();
 	    } else {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		if (!lastchar_wide_valid)
 		    getrestchar(lastchar);
 #else
diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index 442efec9b..7d481f3a6 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -725,7 +725,7 @@ scanlistmaps(HashNode hn, int list)
 	    fputs("-- ", stdout);
 	quotedzputs(n->nam, stdout);
     } else
-	ZMB_niceputs(n->nam, stdout);
+	nicezputs(n->nam, stdout);
     putchar('\n');
 }
 
@@ -818,7 +818,7 @@ bin_bindkey_meta(char *name, char *kmname, Keymap km, UNUSED(char **argv), UNUSE
 	zwarnnam(name, "keymap `%s' is protected", kmname, 0);
 	return 1;
     }
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     zwarnnam(name, "warning: `bindkey -m' disables multibyte support",
 	     NULL, 0);
 #endif
@@ -1051,7 +1051,7 @@ bindlistout(struct bindstate *bs)
 	if (bs->flags & BS_LIST)
 	    quotedzputs(bs->bind->nam, stdout);
 	else
-	    ZMB_niceputs(bs->bind->nam, stdout);
+	    nicezputs(bs->bind->nam, stdout);
     } else
 	printbind(bs->str, stdout);
     putchar('\n');
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 591b2d585..22dd5779b 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -100,7 +100,7 @@ int mark;
 /**/
 mod_export int
 lastchar;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /**/
 mod_export ZLE_INT_T lastchar_wide;
 /**/
@@ -633,7 +633,7 @@ getbyte(int keytmout, int *timeout)
     if (timeout)
 	*timeout = 0;
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * Reading a single byte always invalidates the status
      * of lastchar_wide.  We may fix this up in getrestchar
@@ -737,7 +737,7 @@ getfullchar(int keytmout)
 {
     int inchar = getbyte(keytmout, NULL);
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     return getrestchar(inchar);
 #else
     return inchar;
@@ -746,7 +746,7 @@ getfullchar(int keytmout)
 
 
 /**/
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /*
  * Get the remainder of a character if we support multibyte
  * input strings.  It may not require any more input, but
@@ -1048,7 +1048,7 @@ execzlefunc(Thingy func, char **args)
 
     if(func->flags & DISABLED) {
 	/* this thingy is not the name of a widget */
-	char *nm = ZMB_niceztrdup(func->nam);
+	char *nm = nicedup(func->nam, 0);
 	char *msg = tricat("No such widget `", nm, "'");
 
 	zsfree(nm);
@@ -1104,7 +1104,7 @@ execzlefunc(Thingy func, char **args)
 
 	if(prog == &dummy_eprog) {
 	    /* the shell function doesn't exist */
-	    char *nm = ZMB_niceztrdup(w->u.fnnam);
+	    char *nm = nicedup(w->u.fnnam, 0);
 	    char *msg = tricat("No such shell function `", nm, "'");
 
 	    zsfree(nm);
@@ -1422,7 +1422,7 @@ describekeybriefly(UNUSED(char **args))
     if (!func)
 	is = bindztrdup(str);
     else
-	is = ZMB_niceztrdup(func->nam);
+	is = nicedup(func->nam, 0);
     msg = appstr(msg, is);
     zsfree(is);
     showmsg(msg);
@@ -1466,7 +1466,7 @@ whereis(UNUSED(char **args))
     if (!(ff.func = executenamedcommand("Where is: ")))
 	return 1;
     ff.found = 0;
-    ff.msg = ZMB_niceztrdup(ff.func->nam);
+    ff.msg = nicedup(ff.func->nam, 0);
     scankeymap(curkeymap, 1, scanfindfunc, &ff);
     if (!ff.found)
 	ff.msg = appstr(ff.msg, " is not bound to any key");
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index 5a97b0a75..75b907f32 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -60,7 +60,7 @@ doinsert(ZLE_STRING_T zstr, int len)
 mod_export int
 selfinsert(UNUSED(char **args))
 {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /* wint_t and wchar_t not neccessarily the same size */
     wchar_t tmp;
 
@@ -82,7 +82,7 @@ fixunmeta(void)
     lastchar &= 0x7f;
     if (lastchar == '\r')
 	lastchar = '\n';
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * TODO: can we do this better?
      * We need a wide character to insert.
@@ -529,7 +529,7 @@ digitargument(UNUSED(char **args))
 {
     int sign = (zmult < 0) ? -1 : 1;
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * It's too dangerous to allow metafied input.  See
      * universalargument for comments on (possibly suboptimal) handling
@@ -953,7 +953,7 @@ executenamedcommand(char *prmt)
 		if (len == NAMLEN || cmd != Th(z_selfinsert))
 		    feep = 1;
 		else {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		    if (!lastchar_wide_valid)
 			getrestchar(lastchar);
 		    if (iswcntrl(lastchar_wide))
@@ -1137,7 +1137,7 @@ iremovesuffix(ZLE_CHAR_T c, int keep)
 	zsfree(suffixfunc);
 	suffixfunc = NULL;
     } else {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	/* TODO: best I can think of for now... */
 	int sl = (unsigned int)c <= 256 ? suffixlen[c] : 0;
 #else
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 18e120c89..b3ca43fdb 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -29,7 +29,7 @@
 
 #include "zle.mdh"
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /*
  * We use a wint_t here, since we need an invalid character as a
  * placeholder and wint_t guarantees that we can use WEOF to do this.
@@ -178,7 +178,7 @@ int cost;
 void
 zwcputc(ZLE_INT_T c)
 {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     char mbtmp[MB_CUR_MAX + 1];
     mbstate_t mbstate;
     int i;
@@ -197,7 +197,7 @@ zwcputc(ZLE_INT_T c)
 static int
 zwcwrite(REFRESH_STRING s, size_t i)
 {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     size_t j;
 
     for (j = 0; j < i; j++)
@@ -625,7 +625,7 @@ zrefresh(void)
 		    *rpms.s++ = ZWC(' ');
 		while ((++t0) & 7);
 	}
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	else if (iswprint(*t)) {
 	    int width = wcwidth(*t);
 	    if (width > rpms.sen - rpms.s) {
@@ -663,7 +663,7 @@ zrefresh(void)
 		if (nextline(&rpms, 1))
 		    break;
 	    }
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	    *rpms.s++ = ((*t == 127) || (*t > 255)) ? ZWC('?') :
 		(*t | ZWC('@'));
 #else
@@ -698,7 +698,7 @@ zrefresh(void)
 	snextline(&rpms);
 	u = statusline;
 	for (; u < statusline + statusll; u++) {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	    if (iswprint(*u)) {
 		int width = wcwidth(*u);
 		/* Handle wide characters as above */
@@ -1071,12 +1071,12 @@ refreshline(int ln)
     for (;;) {
 	if (*nl && *ol && nl[1] == ol[1]) {
 	    /* skip only if second chars match */
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	    int ccs_was = ccs;
 #endif
 	/* skip past all matching characters */
 	    for (; *nl && (*nl == *ol); nl++, ol++, ccs++) ;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	    /* Make sure ol and nl are pointing to real characters */
 	    while ((*nl == WEOF || *ol == WEOF) && ccs > ccs_was) {
 		nl--;
@@ -1152,7 +1152,7 @@ refreshline(int ln)
 			tc_delchars(i);
 			ol += i;
 			char_ins -= i;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 			while (*ol == WEOF) {
 			    ol++;
 			    char_ins--;
@@ -1191,13 +1191,13 @@ refreshline(int ln)
 	}
     /* we can't do any fancy tricks, so just dump the single character
        and keep on trying */
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	do {
 #endif
 	    zputc(*nl);
 	    nl++, ol++;
 	    ccs++, vcs++;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	    /*
 	     * Make sure we always overwrite the complete width of
 	     * a character that was there before.
@@ -1336,7 +1336,7 @@ tc_rightcurs(int ct)
    think.
    */
     if (vln == 0 && i < lpromptw && !(termflags & TERM_SHORT)) {
-#ifndef ZLE_UNICODE_SUPPORT
+#ifndef MULTIBYTE_SUPPORT
 	if ((int)strlen(lpromptbuf) == lpromptw)
 	    fputs(lpromptbuf + i, shout);
 	else 
@@ -1432,7 +1432,7 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
     int t0,			/* tmp			       */
 	vsiz,			/* size of new video buffer    */
 	nvcs = 0;		/* new video cursor column     */
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * converted lprompt and pointer: no WEOF hack here since
      * we always output the full prompt and count its width.
@@ -1448,7 +1448,7 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
     for (vsiz = 1 + lpromptw, t0 = 0; t0 != tmpll; t0++, vsiz++)
 	if (tmpline[t0] == ZWC('\t'))
 	    vsiz = (vsiz | 7) + 1;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	else if (iswprint(tmpline[t0]))
 	    vsiz += wcwidth(tmpline[t0]);
 #endif
@@ -1465,7 +1465,7 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
     }
 
     /* only use last part of prompt */
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * Convert the entire lprompt so that we know how to count
      * characters.
@@ -1514,7 +1514,7 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
 	} else if (tmpline[t0] == ZWC('\n')) {
 	    *vp++ = ZWC('\\');
 	    *vp++ = ZWC('n');
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	} else if (iswprint(tmpline[t0])) {
 	    int width;
 	    *vp++ = tmpline[t0];
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index da273132e..5e0c30633 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -519,15 +519,15 @@ scanlistwidgets(HashNode hn, int list)
 	    quotedzputs(w->u.fnnam, stdout);
 	}
     } else {
-	ZMB_niceputs(t->nam, stdout);
+	nicezputs(t->nam, stdout);
 	if (w->flags & WIDGET_NCOMP) {
 	    fputs(" -C ", stdout);
-	    ZMB_niceputs(w->u.comp.wid, stdout);
+	    nicezputs(w->u.comp.wid, stdout);
 	    fputc(' ', stdout);
-	    ZMB_niceputs(w->u.comp.func, stdout);
+	    nicezputs(w->u.comp.func, stdout);
 	} else if(strcmp(t->nam, w->u.fnnam)) {
 	    fputs(" (", stdout);
-	    ZMB_niceputs(w->u.fnnam, stdout);
+	    nicezputs(w->u.fnnam, stdout);
 	    fputc(')', stdout);
 	}
     }
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 0b70c935a..7771ff353 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -2244,7 +2244,7 @@ listlist(LinkList l)
 	if (isset(LISTROWSFIRST)) {
 	    for (col = 1, p = data, lenp = lens; *p;
 		 p++, lenp++, col++) {
-		ZMB_niceputs(*p, shout);
+		nicezputs(*p, shout);
 		if (col == ncols) {
 		    col = 0;
 		    if (p[1])
@@ -2262,7 +2262,7 @@ listlist(LinkList l)
 	    for (f = data, fl = lens, line = 0; line < nlines;
 		 f++, fl++, line++) {
 		for (col = 1, p = f, lenp = fl; *p; col++) {
-		    ZMB_niceputs(*p, shout);
+		    nicezputs(*p, shout);
 		    if (col == ncols)
 			break;
 		    if ((i = (pack ? widths[col - 1] : longest) - *lenp + 2) > 0)
@@ -2276,7 +2276,7 @@ listlist(LinkList l)
 	}
     } else {
 	for (p = data; *p; p++) {
-	    ZMB_niceputs(*p, shout);
+	    nicezputs(*p, shout);
 	    putc('\n', shout);
 	}
     }
@@ -2367,7 +2367,7 @@ void
 fixmagicspace(void)
 {
     lastchar = ' ';
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * This is redundant if the multibyte encoding extends ASCII,
      * since lastchar is a full character, but it's safer anyway...
@@ -2386,7 +2386,7 @@ magicspace(char **args)
     int ret;
     fixmagicspace();
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     /*
      * TODO: bangchar should really be a multibyte string representing
      * a single character, since there's no fundamental reason why
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index a65aa05d0..063427659 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -132,7 +132,7 @@ zlelineasstring(ZLE_STRING_T instr, int inll, int incs, int *outllp,
 {
     int outcs, outll;
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     char *s;
     int i, j;
     size_t mb_len = 0;
@@ -167,7 +167,7 @@ zlelineasstring(ZLE_STRING_T instr, int inll, int incs, int *outllp,
      * metafiable characters.
      */
     if (outcsp != NULL || outllp != NULL) {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	unsigned char *strp = (unsigned char *)s;
 #else
 	unsigned char *strp = instr;
@@ -189,7 +189,7 @@ zlelineasstring(ZLE_STRING_T instr, int inll, int incs, int *outllp,
 	    *outllp = outll;
     }
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     if (useheap)
     {
 	unsigned char *ret =
@@ -242,7 +242,7 @@ stringaszleline(unsigned char *instr, int incs,
 {
     ZLE_STRING_T outstr;
     int ll, sz;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     mbstate_t ps;
 #endif
 
@@ -274,7 +274,7 @@ stringaszleline(unsigned char *instr, int incs,
 	*outsz = ll;
     outstr = (ZLE_STRING_T)zalloc(sz);
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     if (ll) {
 	char *inptr = (char *)instr;
 	wchar_t *outptr = outstr;
@@ -785,7 +785,7 @@ showmsg(char const *msg)
     char const *p;
     int up = 0, cc = 0;
     ZLE_CHAR_T c;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     char *umsg;
     int ulen, ret;
     size_t width;
@@ -795,7 +795,7 @@ showmsg(char const *msg)
     trashzle();
     clearflag = isset(USEZLE) && !termflags && isset(ALWAYSLASTPROMPT);
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     umsg = ztrdup(msg);
     p = unmetafy(umsg, &ulen);
     memset(&ps, 0, sizeof(ps));
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index cb072cdb6..5be0eeef3 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -135,7 +135,7 @@ vigetkey(void)
     } else if (cmd == Th(z_vicmdmode)) {
 	return ZLEEOF;
     }
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     if (!lastchar_wide_valid)
     {
 	getrestchar(lastchar);
@@ -830,7 +830,7 @@ vicapslockpanic(UNUSED(char **args))
     statusline = ZWS("press a lowercase key to continue");
     statusll = ZS_strlen(statusline);
     zrefresh();
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     while (!iswlower(getfullchar(0)));
 #else
     while (!islower(getfullchar(0)));
diff --git a/Src/prompt.c b/Src/prompt.c
index 008d3a39d..d21029a37 100644
--- a/Src/prompt.c
+++ b/Src/prompt.c
@@ -736,7 +736,7 @@ addbufspc(int need)
 void
 stradd(char *d)
 {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     char *ums, *ups;
     int upslen;
     mbstate_t ps;
@@ -861,7 +861,7 @@ countprompt(char *str, int *wp, int *hp, int overf)
 {
     int w = 0, h = 1;
     int s = 1;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     int mbret, wcw, multi = 0;
     char inchar;
     mbstate_t mbs;
@@ -887,13 +887,13 @@ countprompt(char *str, int *wp, int *hp, int overf)
 	    w++;
 	else if (s) {
 	    if (*str == Meta) {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		inchar = *++str ^ 32;
 #else
 		str++;
 #endif
 	    } else {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		/*
 		 * Don't look for tab or newline in the middle
 		 * of a multibyte character.  Otherwise, we are
@@ -910,14 +910,14 @@ countprompt(char *str, int *wp, int *hp, int overf)
 			h++;
 			continue;
 		    }
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		}
 
 		inchar = *str;
 #endif
 	    }
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	    mbret = mbrtowc(&wc, &inchar, 1, &mbs);
 	    if (mbret >= -1) {
 		if (mbret > 0) {
@@ -1044,7 +1044,7 @@ prompttrunc(int arg, int truncchar, int doprint, int endchar)
 	    int twidth, maxwidth;
 	    int ntrunc = strlen(t);
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	    /* Use screen width of string */
 	    twidth = mb_width(t);
 #else
@@ -1076,7 +1076,7 @@ prompttrunc(int arg, int truncchar, int doprint, int endchar)
 		     */
 		    char *fulltextptr, *fulltext;
 		    int remw;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		    mbstate_t mbs;
 		    memset(&mbs, 0, sizeof(mbstate_t));
 #endif
@@ -1111,7 +1111,7 @@ prompttrunc(int arg, int truncchar, int doprint, int endchar)
 				fulltextptr++;
 			    }
 			} else {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 			    /*
 			     * Normal text: build up a multibyte character.
 			     */
@@ -1170,7 +1170,7 @@ prompttrunc(int arg, int truncchar, int doprint, int endchar)
 		     * maximum width.
 		     */
 		    char *skiptext = ptr;
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 		    mbstate_t mbs;
 		    memset(&mbs, 0, sizeof(mbstate_t));
 #endif
@@ -1180,7 +1180,7 @@ prompttrunc(int arg, int truncchar, int doprint, int endchar)
 			    for (; *skiptext != Outpar && *skiptext;
 				 skiptext++);
 			} else {
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 			    char inchar;
 			    wchar_t cc;
 			    int ret;
diff --git a/Src/string.c b/Src/string.c
index b22c1bf66..6a381ca30 100644
--- a/Src/string.c
+++ b/Src/string.c
@@ -55,7 +55,7 @@ ztrdup(const char *s)
 }
 
 /**/
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /**/
 mod_export wchar_t *
 wcs_ztrdup(const wchar_t *s)
@@ -69,7 +69,7 @@ wcs_ztrdup(const wchar_t *s)
     return t;
 }
 /**/
-#endif /* ZLE_UNICODE_SUPPORT */
+#endif /* MULTIBYTE_SUPPORT */
 
 
 /* concatenate s1, s2, and s3 in dynamically allocated buffer */
diff --git a/Src/system.h b/Src/system.h
index 45f6cb6d1..3b698161a 100644
--- a/Src/system.h
+++ b/Src/system.h
@@ -692,13 +692,13 @@ extern short ospeed;
 #endif
 
 /*
- * The ZLE_UNICODE_SUPPORT configure-define specifies that we want to enable
+ * The MULTIBYTE_SUPPORT configure-define specifies that we want to enable
  * complete Unicode conversion between wide characters and multibyte strings.
  */
-#if defined ZLE_UNICODE_SUPPORT \
+#if defined MULTIBYTE_SUPPORT \
  || (defined HAVE_WCHAR_H && defined HAVE_WCTOMB && defined __STDC_ISO_10646__)
 /*
- * If ZLE_UNICODE_SUPPORT is not defined, these includes provide a subset of
+ * If MULTIBYTE_SUPPORT is not defined, these includes provide a subset of
  * Unicode support that makes the \u and \U printf escape sequences work.
  */
 # include <wchar.h>
diff --git a/Src/utils.c b/Src/utils.c
index aef26165d..cf84d5f85 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -35,7 +35,7 @@
 /**/
 char *scriptname;
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /*
  * The wordchars variable turned into a wide character array.
  * This is much more convenient for testing.
@@ -156,7 +156,11 @@ zerrmsg(const char *fmt, const char *str, int num)
 		putc('%', stderr);
 		break;
 	    case 'c':
+#ifdef MULTIBYTE_SUPPORT
+		zputs(wcs_nicechar(num, NULL, NULL), stderr);
+#else
 		zputs(nicechar(num), stderr);
+#endif
 		break;
 	    case 'e':
 		/* print the corresponding message for this errno */
@@ -219,6 +223,10 @@ putshout(int c)
  * Note that the returned string is metafied, so that it must be
  * treated like any other zsh internal string (and not, for example,
  * output directly).
+ *
+ * This function is used even if MULTIBYTE_SUPPORT is defined: we
+ * use it as a fallback in case we couldn't identify a wide character
+ * in a multibyte string.
  */
 
 /**/
@@ -270,7 +278,7 @@ nicechar(int c)
 }
 
 /**/
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /*
  * The number of bytes we need to allocate for a "nice" representation
  * of a multibyte character.
@@ -380,7 +388,7 @@ wcs_nicechar(wchar_t c, size_t *widthp, char **swidep)
     return buf;
 }
 /**/
-#endif /* ZLE_UNICODE_SUPPORT */
+#endif /* MULTIBYTE_SUPPORT */
 
 
 /* Output a string's visible representation. */
@@ -394,19 +402,6 @@ nicefputs(char *s, FILE *f)
 }
 #endif
 
-/* Return the length of the visible representation of a string. */
-
-/**/
-size_t
-nicestrlen(char *s)
-{
-    size_t l = 0;
-
-    for (; *s; s++)
-	l += strlen(nicechar(STOUC(*s)));
-    return l;
-}
-
 /* get a symlink-free pathname for s relative to PWD */
 
 /**/
@@ -2542,7 +2537,7 @@ inittyptab(void)
 	typtab[t0] = IDIGIT | IALNUM | IWORD | IIDENT | IUSER;
     for (t0 = 'a'; t0 <= 'z'; t0++)
 	typtab[t0] = typtab[t0 - 'a' + 'A'] = IALPHA | IALNUM | IIDENT | IUSER | IWORD;
-#ifndef ZLE_UNICODE_SUPPORT
+#ifndef MULTIBYTE_SUPPORT
     /*
      * This really doesn't seem to me the right thing to do when
      * we have multibyte character support...  it was a hack to assume
@@ -2575,7 +2570,7 @@ inittyptab(void)
 	}
 	typtab[STOUC(*s == Meta ? *++s ^ 32 : *s)] |= ISEP;
     }
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     if (wordchars) {
 	char *wordchars_unmeta;
 	const char *wordchars_ptr;
@@ -2602,7 +2597,7 @@ inittyptab(void)
 #endif
     for (s = wordchars ? wordchars : DEFAULT_WORDCHARS; *s; s++) {
 	int c = STOUC(*s == Meta ? *++s ^ 32 : *s);
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 	if (!isascii(c)) {
 	    /*
 	     * If we have support for multibyte characters, we don't
@@ -2623,7 +2618,7 @@ inittyptab(void)
 }
 
 
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /*
  * iword() macro extended to support wide characters.
  */
@@ -2715,7 +2710,7 @@ zarrdup(char **s)
 }
 
 /**/
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /**/
 mod_export wchar_t **
 wcs_zarrdup(wchar_t **s)
@@ -2729,7 +2724,7 @@ wcs_zarrdup(wchar_t **s)
     return y;
 }
 /**/
-#endif /* ZLE_UNICODE_SUPPORT */
+#endif /* MULTIBYTE_SUPPORT */
 
 /**/
 static char *
@@ -3329,6 +3324,7 @@ zputs(char const *s, FILE *stream)
     return 0;
 }
 
+#ifndef MULTIBYTE_SUPPORT
 /* Create a visibly-represented duplicate of a string. */
 
 /**/
@@ -3356,6 +3352,7 @@ nicedup(char const *s, int heap)
     *p = '\0';
     return heap ? dupstring(buf) : ztrdup(buf);
 }
+#endif
 
 /**/
 mod_export char *
@@ -3364,6 +3361,8 @@ nicedupstring(char const *s)
     return nicedup(s, 1);
 }
 
+
+#ifndef MULTIBYTE_SUPPORT
 /* Unmetafy and output a string, displaying special characters readably. */
 
 /**/
@@ -3387,6 +3386,7 @@ nicezputs(char const *s, FILE *stream)
     return 0;
 }
 
+
 /* Return the length of the visible representation of a metafied string. */
 
 /**/
@@ -3409,9 +3409,11 @@ niceztrlen(char const *s)
     }
     return l;
 }
+#endif
+
 
 /**/
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
 /*
  * Version of both nicezputs() and niceztrlen() for use with multibyte
  * characters.  Input is a metafied string; output is the screen width of
@@ -3421,11 +3423,13 @@ niceztrlen(char const *s)
  *
  * If outstrp is not NULL, set *outstrp to a zalloc'd version of
  * the output (still metafied).
+ *
+ * If "heap" is non-zero, use the heap for *outstrp, else zalloc.
  */
 
 /**/
 mod_export size_t
-mb_niceformat(const char *s, FILE *stream, char **outstrp)
+mb_niceformat(const char *s, FILE *stream, char **outstrp, int heap)
 {
     size_t l = 0, newl, ret;
     int umlen, outalloc, outleft;
@@ -3500,7 +3504,7 @@ mb_niceformat(const char *s, FILE *stream, char **outstrp)
     if (outstrp) {
 	*outptr = '\0';
 	/* Use more efficient storage for returned string */
-	*outstrp = ztrdup(outstr);
+	*outstrp = heap ? dupstring(outstr) : ztrdup(outstr);
 	free(outstr);
     }
 
@@ -3511,11 +3515,11 @@ mb_niceformat(const char *s, FILE *stream, char **outstrp)
 
 /**/
 mod_export char *
-mb_niceztrdup(const char *s)
+nicedup(const char *s, int heap)
 {
     char *retstr;
 
-    (void)mb_niceformat(s, NULL, &retstr);
+    (void)mb_niceformat(s, NULL, &retstr, heap);
 
     return retstr;
 }
@@ -3564,7 +3568,7 @@ mb_width(const char *s)
 }
 
 /**/
-#endif /* ZLE_UNICODE_SUPPORT */
+#endif /* MULTIBYTE_SUPPORT */
 
 /* check for special characters in the string */
 
diff --git a/Src/zsh.h b/Src/zsh.h
index 8fea197f7..f530cb8d9 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1432,7 +1432,7 @@ struct histent {
 
     Histent up;			/* previous line (moving upward)    */
     Histent down;		/* next line (moving downward)      */
-#ifdef ZLE_UNICODE_SUPPORT
+#ifdef MULTIBYTE_SUPPORT
     wchar_t *zle_text;		/* the edited history line          */
 #else
     unsigned char *zle_text;	/* the edited history line          */
@@ -1928,3 +1928,7 @@ typedef unsigned char *(*ZleGetLineFn) _((int *, int *));
 #define EXITHOOK       (zshhooks + 0)
 #define BEFORETRAPHOOK (zshhooks + 1)
 #define AFTERTRAPHOOK  (zshhooks + 2)
+
+#ifdef MULTIBYTE_SUPPORT
+#define nicezputs(str, outs)	(void)mb_niceformat((str), (outs), NULL, 0)
+#endif
diff --git a/configure.ac b/configure.ac
index 8d7a99318..84a9d5b99 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2087,10 +2087,10 @@ AC_HELP_STRING([--enable-multibyte], [support multibyte chars in the zsh line ed
     zsh_cv_c_zle_unicode_support=yes,
     zsh_cv_c_zle_unicode_support=no)])
 ])
-AH_TEMPLATE([ZLE_UNICODE_SUPPORT],
-[Define to 1 if you want unicode support in the line editor.])
+AH_TEMPLATE([MULTIBYTE_SUPPORT],
+[Define to 1 if you want support for multibyte character sets.])
 if test $zsh_cv_c_zle_unicode_support = yes; then
-  AC_DEFINE(ZLE_UNICODE_SUPPORT)
+  AC_DEFINE(MULTIBYTE_SUPPORT)
 fi
 
 dnl ---------------