List:Commits« Previous MessageNext Message »
From:Nirbhay Choubey Date:April 17 2011 1:40pm
Subject:bzr commit into mysql-trunk branch (nirbhay.choubey:3327) Bug#49967
View as plain text  
#At file:///home/nirbhay/Project/mysql/repo/libedit/mysql-trunk.new/ based on revid:bjorn.munch@stripped6161309-0b9jwvy94a5x53fd

 3327 Nirbhay Choubey	2011-04-17
      Upgraded libedit to the latest version alongwith
      fix for bug#49967.

    added:
      cmd-line-utils/libedit/chartype.c
      cmd-line-utils/libedit/chartype.h
      cmd-line-utils/libedit/eln.c
    modified:
      cmake/os/WindowsCache.cmake
      cmd-line-utils/libedit/README
      cmd-line-utils/libedit/chared.c
      cmd-line-utils/libedit/chared.h
      cmd-line-utils/libedit/common.c
      cmd-line-utils/libedit/el.c
      cmd-line-utils/libedit/el.h
      cmd-line-utils/libedit/el_term.h
      cmd-line-utils/libedit/emacs.c
      cmd-line-utils/libedit/filecomplete.c
      cmd-line-utils/libedit/filecomplete.h
      cmd-line-utils/libedit/hist.c
      cmd-line-utils/libedit/hist.h
      cmd-line-utils/libedit/histedit.h
      cmd-line-utils/libedit/history.c
      cmd-line-utils/libedit/key.c
      cmd-line-utils/libedit/key.h
      cmd-line-utils/libedit/makelist.sh
      cmd-line-utils/libedit/map.c
      cmd-line-utils/libedit/map.h
      cmd-line-utils/libedit/np/strlcat.c
      cmd-line-utils/libedit/np/strlcpy.c
      cmd-line-utils/libedit/np/unvis.c
      cmd-line-utils/libedit/np/vis.c
      cmd-line-utils/libedit/np/vis.h
      cmd-line-utils/libedit/parse.c
      cmd-line-utils/libedit/parse.h
      cmd-line-utils/libedit/prompt.c
      cmd-line-utils/libedit/prompt.h
      cmd-line-utils/libedit/read.c
      cmd-line-utils/libedit/read.h
      cmd-line-utils/libedit/readline.c
      cmd-line-utils/libedit/readline/readline.h
      cmd-line-utils/libedit/refresh.c
      cmd-line-utils/libedit/refresh.h
      cmd-line-utils/libedit/search.c
      cmd-line-utils/libedit/search.h
      cmd-line-utils/libedit/sig.c
      cmd-line-utils/libedit/sig.h
      cmd-line-utils/libedit/sys.h
      cmd-line-utils/libedit/term.c
      cmd-line-utils/libedit/tokenizer.c
      cmd-line-utils/libedit/tty.c
      cmd-line-utils/libedit/tty.h
      cmd-line-utils/libedit/vi.c
      config.h.cmake
      configure.cmake
=== modified file 'cmake/os/WindowsCache.cmake'
--- a/cmake/os/WindowsCache.cmake	2011-04-13 19:16:45 +0000
+++ b/cmake/os/WindowsCache.cmake	2011-04-17 13:40:20 +0000
@@ -104,6 +104,10 @@ ENDIF()
 SET(HAVE_ISINF CACHE  INTERNAL "")
 SET(HAVE_ISNAN CACHE  INTERNAL "")
 SET(HAVE_ISSETUGID CACHE  INTERNAL "")
+SET(HAVE_GETUID CACHE  INTERNAL "")
+SET(HAVE_GETEUID CACHE  INTERNAL "")
+SET(HAVE_GETGID CACHE  INTERNAL "")
+SET(HAVE_GETEGID CACHE  INTERNAL "")
 SET(HAVE_LANGINFO_H CACHE  INTERNAL "")
 SET(HAVE_LDIV 1 CACHE  INTERNAL "")
 SET(HAVE_LIMITS_H 1 CACHE  INTERNAL "")

=== modified file 'cmd-line-utils/libedit/README'
--- a/cmd-line-utils/libedit/README	2009-04-30 11:53:30 +0000
+++ b/cmd-line-utils/libedit/README	2011-04-17 13:40:20 +0000
@@ -2,7 +2,7 @@ An approximate method to merge from upst
 
 	# Fetch latest from upstream (we also include some compat stuff)
 	$ CVS_RSH=ssh; export CVS_RSH
-	$ CVSROOT="anoncvs@stripped:/cvsroot"
+	$ CVSROOT="anoncvs@stripped:/cvsroot"
 	$ cvs co -d libedit -P src/lib/libedit
 	$ mkdir libedit/np
 	$ for f in src/common/lib/libc/string/strlcat.c \
@@ -46,5 +46,5 @@ a 'clean' diff against upstream you can 
 
 to fetch the baseline of most recent merge.
 
-Please feed any fixes to Jonathan Perkin <jperkin@stripped> who will endeavour
-to merge them upstream and keep diffs minimal.
+Please feed any fixes to Jonathan Perkin <jonathan.perkin@stripped> who will
+endeavour to merge them upstream and keep diffs minimal.

=== modified file 'cmd-line-utils/libedit/chared.c'
--- a/cmd-line-utils/libedit/chared.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/chared.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: chared.c,v 1.26 2009/02/06 12:45:25 sketch Exp $	*/
+/*	$NetBSD: chared.c,v 1.29 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -59,13 +59,13 @@ cv_undo(EditLine *el)
 {
 	c_undo_t *vu = &el->el_chared.c_undo;
 	c_redo_t *r = &el->el_chared.c_redo;
-	unsigned int size;
+	size_t size;
 
 	/* Save entire line for undo */
 	size = el->el_line.lastchar - el->el_line.buffer;
 	vu->len = size;
-	vu->cursor = el->el_line.cursor - el->el_line.buffer;
-	memcpy(vu->buf, el->el_line.buffer, size);
+	vu->cursor = (int)(el->el_line.cursor - el->el_line.buffer);
+	(void)memcpy(vu->buf, el->el_line.buffer, size * sizeof(*vu->buf));
 
 	/* save command info for redo */
 	r->count = el->el_state.doingarg ? el->el_state.argument : 0;
@@ -79,11 +79,11 @@ cv_undo(EditLine *el)
  *	Save yank/delete data for paste
  */
 protected void
-cv_yank(EditLine *el, const char *ptr, int size)
+cv_yank(EditLine *el, const Char *ptr, int size)
 {
 	c_kill_t *k = &el->el_chared.c_kill;
 
-	memcpy(k->buf, ptr, size +0u);
+	(void)memcpy(k->buf, ptr, size * sizeof(*k->buf));
 	k->last = k->buf + size;
 }
 
@@ -94,10 +94,10 @@ cv_yank(EditLine *el, const char *ptr, i
 protected void
 c_insert(EditLine *el, int num)
 {
-	char *cp;
+	Char *cp;
 
 	if (el->el_line.lastchar + num >= el->el_line.limit) {
-		if (!ch_enlargebufs(el, num +0u))
+		if (!ch_enlargebufs(el, (size_t)num))
 			return;		/* can't go past end of buffer */
 	}
 
@@ -118,7 +118,7 @@ c_delafter(EditLine *el, int num)
 {
 
 	if (el->el_line.cursor + num > el->el_line.lastchar)
-		num = el->el_line.lastchar - el->el_line.cursor;
+		num = (int)(el->el_line.lastchar - el->el_line.cursor);
 
 	if (el->el_map.current != el->el_map.emacs) {
 		cv_undo(el);
@@ -126,7 +126,7 @@ c_delafter(EditLine *el, int num)
 	}
 
 	if (num > 0) {
-		char *cp;
+		Char *cp;
 
 		for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
 			*cp = cp[num];
@@ -142,7 +142,7 @@ c_delafter(EditLine *el, int num)
 protected void
 c_delafter1(EditLine *el)
 {
-	char *cp;
+	Char *cp;
 
 	for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
 		*cp = cp[1];
@@ -159,7 +159,7 @@ c_delbefore(EditLine *el, int num)
 {
 
 	if (el->el_line.cursor - num < el->el_line.buffer)
-		num = el->el_line.cursor - el->el_line.buffer;
+		num = (int)(el->el_line.cursor - el->el_line.buffer);
 
 	if (el->el_map.current != el->el_map.emacs) {
 		cv_undo(el);
@@ -167,7 +167,7 @@ c_delbefore(EditLine *el, int num)
 	}
 
 	if (num > 0) {
-		char *cp;
+		Char *cp;
 
 		for (cp = el->el_line.cursor - num;
 		    cp <= el->el_line.lastchar;
@@ -185,7 +185,7 @@ c_delbefore(EditLine *el, int num)
 protected void
 c_delbefore1(EditLine *el)
 {
-	char *cp;
+	Char *cp;
 
 	for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++)
 		*cp = cp[1];
@@ -198,9 +198,9 @@ c_delbefore1(EditLine *el)
  *	Return if p is part of a word according to emacs
  */
 protected int
-ce__isword(int p)
+ce__isword(Int p)
 {
-	return (isalnum(p) || strchr("*?_-.[]~=", p) != NULL);
+	return (Isalnum(p) || Strchr(STR("*?_-.[]~="), p) != NULL);
 }
 
 
@@ -208,11 +208,11 @@ ce__isword(int p)
  *	Return if p is part of a word according to vi
  */
 protected int
-cv__isword(int p)
+cv__isword(Int p)
 {
-	if (isalnum(p) || p == '_')
+	if (Isalnum(p) || p == '_')
 		return 1;
-	if (isgraph(p))
+	if (Isgraph(p))
 		return 2;
 	return 0;
 }
@@ -222,24 +222,24 @@ cv__isword(int p)
  *	Return if p is part of a big word according to vi
  */
 protected int
-cv__isWord(int p)
+cv__isWord(Int p)
 {
-	return (!isspace(p));
+	return (!Isspace(p));
 }
 
 
 /* c__prev_word():
  *	Find the previous word
  */
-protected char *
-c__prev_word(char *p, char *low, int n, int (*wtest)(int))
+protected Char *
+c__prev_word(Char *p, Char *low, int n, int (*wtest)(Int))
 {
 	p--;
 
 	while (n--) {
-		while ((p >= low) && !(*wtest)((unsigned char) *p))
+		while ((p >= low) && !(*wtest)(*p))
 			p--;
-		while ((p >= low) && (*wtest)((unsigned char) *p))
+		while ((p >= low) && (*wtest)(*p))
 			p--;
 	}
 
@@ -255,13 +255,13 @@ c__prev_word(char *p, char *low, int n, 
 /* c__next_word():
  *	Find the next word
  */
-protected char *
-c__next_word(char *p, char *high, int n, int (*wtest)(int))
+protected Char *
+c__next_word(Char *p, Char *high, int n, int (*wtest)(Int))
 {
 	while (n--) {
-		while ((p < high) && !(*wtest)((unsigned char) *p))
+		while ((p < high) && !(*wtest)(*p))
 			p++;
-		while ((p < high) && (*wtest)((unsigned char) *p))
+		while ((p < high) && (*wtest)(*p))
 			p++;
 	}
 	if (p > high)
@@ -273,21 +273,21 @@ c__next_word(char *p, char *high, int n,
 /* cv_next_word():
  *	Find the next word vi style
  */
-protected char *
-cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int))
+protected Char *
+cv_next_word(EditLine *el, Char *p, Char *high, int n, int (*wtest)(Int))
 {
 	int test;
 
 	while (n--) {
-		test = (*wtest)((unsigned char) *p);
-		while ((p < high) && (*wtest)((unsigned char) *p) == test)
+		test = (*wtest)(*p);
+		while ((p < high) && (*wtest)(*p) == test)
 			p++;
 		/*
 		 * vi historically deletes with cw only the word preserving the
 		 * trailing whitespace! This is not what 'w' does..
 		 */
 		if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT))
-			while ((p < high) && isspace((unsigned char) *p))
+			while ((p < high) && Isspace(*p))
 				p++;
 	}
 
@@ -302,17 +302,17 @@ cv_next_word(EditLine *el, char *p, char
 /* cv_prev_word():
  *	Find the previous word vi style
  */
-protected char *
-cv_prev_word(char *p, char *low, int n, int (*wtest)(int))
+protected Char *
+cv_prev_word(Char *p, Char *low, int n, int (*wtest)(Int))
 {
 	int test;
 
 	p--;
 	while (n--) {
-		while ((p > low) && isspace((unsigned char) *p))
+		while ((p > low) && Isspace(*p))
 			p--;
-		test = (*wtest)((unsigned char) *p);
-		while ((p >= low) && (*wtest)((unsigned char) *p) == test)
+		test = (*wtest)(*p);
+		while ((p >= low) && (*wtest)(*p) == test)
 			p--;
 	}
 	p++;
@@ -331,9 +331,9 @@ cv_prev_word(char *p, char *low, int n, 
  * 	A '$' by itself means a big number; "$-" is for negative; '^' means 1.
  * 	Return p pointing to last char used.
  */
-protected char *
+protected Char *
 c__number(
-    char *p,	/* character position */
+    Char *p,	/* character position */
     int *num,	/* Return value	*/
     int dval)	/* dval is the number to subtract from like $-3 */
 {
@@ -352,7 +352,8 @@ c__number(
 		sign = -1;			/* Handle $- */
 		++p;
 	}
-	for (i = 0; isdigit((unsigned char) *p); i = 10 * i + *p++ - '0')
+    /* XXX: this assumes ASCII compatible digits */
+	for (i = 0; Isdigit(*p); i = 10 * i + *p++ - '0')
 		continue;
 	*num = (sign < 0 ? dval - i : i);
 	return (--p);
@@ -375,7 +376,7 @@ cv_delfini(EditLine *el)
 		/* sanity */
 		return;
 
-	size = el->el_line.cursor - el->el_chared.c_vcmd.pos;
+	size = (int)(el->el_line.cursor - el->el_chared.c_vcmd.pos);
 	if (size == 0)
 		size = 1;
 	el->el_line.cursor = el->el_chared.c_vcmd.pos;
@@ -401,15 +402,15 @@ cv_delfini(EditLine *el)
 /* ce__endword():
  *	Go to the end of this word according to emacs
  */
-protected char *
-ce__endword(char *p, char *high, int n)
+protected Char *
+ce__endword(Char *p, Char *high, int n)
 {
 	p++;
 
 	while (n--) {
-		while ((p < high) && isspace((unsigned char) *p))
+		while ((p < high) && Isspace(*p))
 			p++;
-		while ((p < high) && !isspace((unsigned char) *p))
+		while ((p < high) && !Isspace(*p))
 			p++;
 	}
 
@@ -422,19 +423,19 @@ ce__endword(char *p, char *high, int n)
 /* cv__endword():
  *	Go to the end of this word according to vi
  */
-protected char *
-cv__endword(char *p, char *high, int n, int (*wtest)(int))
+protected Char *
+cv__endword(Char *p, Char *high, int n, int (*wtest)(Int))
 {
 	int test;
 
 	p++;
 
 	while (n--) {
-		while ((p < high) && isspace((unsigned char) *p))
+		while ((p < high) && Isspace(*p))
 			p++;
 
-		test = (*wtest)((unsigned char) *p);
-		while ((p < high) && (*wtest)((unsigned char) *p) == test)
+		test = (*wtest)(*p);
+		while ((p < high) && (*wtest)(*p) == test)
 			p++;
 	}
 	p--;
@@ -449,22 +450,27 @@ ch_init(EditLine *el)
 {
 	c_macro_t *ma = &el->el_chared.c_macro;
 
-	el->el_line.buffer		= (char *) el_malloc(EL_BUFSIZ);
+	el->el_line.buffer		= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_line.buffer));
 	if (el->el_line.buffer == NULL)
 		return (-1);
 
-	(void) memset(el->el_line.buffer, 0, EL_BUFSIZ);
+	(void) memset(el->el_line.buffer, 0, EL_BUFSIZ *
+	    sizeof(*el->el_line.buffer));
 	el->el_line.cursor		= el->el_line.buffer;
 	el->el_line.lastchar		= el->el_line.buffer;
 	el->el_line.limit		= &el->el_line.buffer[EL_BUFSIZ - EL_LEAVE];
 
-	el->el_chared.c_undo.buf	= (char *) el_malloc(EL_BUFSIZ);
+	el->el_chared.c_undo.buf	= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_undo.buf));
 	if (el->el_chared.c_undo.buf == NULL)
 		return (-1);
-	(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ);
+	(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_undo.buf));
 	el->el_chared.c_undo.len	= -1;
 	el->el_chared.c_undo.cursor	= 0;
-	el->el_chared.c_redo.buf	= (char *) el_malloc(EL_BUFSIZ);
+	el->el_chared.c_redo.buf	= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_redo.buf));
 	if (el->el_chared.c_redo.buf == NULL)
 		return (-1);
 	el->el_chared.c_redo.pos	= el->el_chared.c_redo.buf;
@@ -474,12 +480,16 @@ ch_init(EditLine *el)
 	el->el_chared.c_vcmd.action	= NOP;
 	el->el_chared.c_vcmd.pos	= el->el_line.buffer;
 
-	el->el_chared.c_kill.buf	= (char *) el_malloc(EL_BUFSIZ);
+	el->el_chared.c_kill.buf	= el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_kill.buf));
 	if (el->el_chared.c_kill.buf == NULL)
 		return (-1);
-	(void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ);
+	(void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ *
+	    sizeof(*el->el_chared.c_kill.buf));
 	el->el_chared.c_kill.mark	= el->el_line.buffer;
 	el->el_chared.c_kill.last	= el->el_chared.c_kill.buf;
+	el->el_chared.c_resizefun	= NULL;
+	el->el_chared.c_resizearg	= NULL;
 
 	el->el_map.current		= el->el_map.key;
 
@@ -491,7 +501,7 @@ ch_init(EditLine *el)
 
 	ma->level	= -1;
 	ma->offset	= 0;
-	ma->macro	= (char **) el_malloc(EL_MAXMACRO * sizeof(char *));
+	ma->macro	= el_malloc(EL_MAXMACRO * sizeof(*ma->macro));
 	if (ma->macro == NULL)
 		return (-1);
 	return (0);
@@ -529,8 +539,7 @@ ch_reset(EditLine *el, int mclear)
 }
 
 private void
-ch__clearmacro(el)
-	EditLine *el;
+ch__clearmacro(EditLine *el)
 {
 	c_macro_t *ma = &el->el_chared.c_macro;
 	while (ma->level >= 0)
@@ -542,12 +551,10 @@ ch__clearmacro(el)
  *	Returns 1 if successful, 0 if not.
  */
 protected int
-ch_enlargebufs(el, addlen)
-	EditLine *el;
-	size_t addlen;
+ch_enlargebufs(EditLine *el, size_t addlen)
 {
 	size_t sz, newsz;
-	char *newbuffer, *oldbuf, *oldkbuf;
+	Char *newbuffer, *oldbuf, *oldkbuf;
 
 	sz = el->el_line.limit - el->el_line.buffer + EL_LEAVE;
 	newsz = sz * 2;
@@ -563,12 +570,12 @@ ch_enlargebufs(el, addlen)
 	/*
 	 * Reallocate line buffer.
 	 */
-	newbuffer = el_realloc(el->el_line.buffer, newsz);
+	newbuffer = el_realloc(el->el_line.buffer, newsz * sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 
 	/* zero the newly added memory, leave old data in */
-	(void) memset(&newbuffer[sz], 0, newsz - sz);
+	(void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
 	    
 	oldbuf = el->el_line.buffer;
 
@@ -581,12 +588,12 @@ ch_enlargebufs(el, addlen)
 	/*
 	 * Reallocate kill buffer.
 	 */
-	newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz);
+	newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz * sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 
 	/* zero the newly added memory, leave old data in */
-	(void) memset(&newbuffer[sz], 0, newsz - sz);
+	(void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
 
 	oldkbuf = el->el_chared.c_kill.buf;
 
@@ -599,15 +606,17 @@ ch_enlargebufs(el, addlen)
 	/*
 	 * Reallocate undo buffer.
 	 */
-	newbuffer = el_realloc(el->el_chared.c_undo.buf, newsz);
+	newbuffer = el_realloc(el->el_chared.c_undo.buf,
+	    newsz * sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 
 	/* zero the newly added memory, leave old data in */
-	(void) memset(&newbuffer[sz], 0, newsz - sz);
+	(void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
 	el->el_chared.c_undo.buf = newbuffer;
 
-	newbuffer = el_realloc(el->el_chared.c_redo.buf, newsz);
+	newbuffer = el_realloc(el->el_chared.c_redo.buf,
+	    newsz * sizeof(*newbuffer));
 	if (!newbuffer)
 		return 0;
 	el->el_chared.c_redo.pos = newbuffer +
@@ -621,6 +630,8 @@ ch_enlargebufs(el, addlen)
 
 	/* Safe to set enlarged buffer size */
 	el->el_line.limit  = &el->el_line.buffer[newsz - EL_LEAVE];
+	if (el->el_chared.c_resizefun)
+		(*el->el_chared.c_resizefun)(el, el->el_chared.c_resizearg);
 	return 1;
 }
 
@@ -652,11 +663,11 @@ ch_end(EditLine *el)
  *	Insert string at cursorI
  */
 public int
-el_insertstr(EditLine *el, const char *s)
+FUN(el,insertstr)(EditLine *el, const Char *s)
 {
 	size_t len;
 
-	if ((len = strlen(s)) == 0)
+	if ((len = Strlen(s)) == 0)
 		return (-1);
 	if (el->el_line.lastchar + len >= el->el_line.limit) {
 		if (!ch_enlargebufs(el, len))
@@ -692,15 +703,15 @@ el_deletestr(EditLine *el, int n)
  *	Get a string
  */
 protected int
-c_gets(EditLine *el, char *buf, const char *prompt)
+c_gets(EditLine *el, Char *buf, const Char *prompt)
 {
-	char ch;
-	int len;
-	char *cp = el->el_line.buffer;
+	Char ch;
+	ssize_t len;
+	Char *cp = el->el_line.buffer;
 
 	if (prompt) {
-		len = strlen(prompt);
-		memcpy(cp, prompt, len + 0u);
+		len = Strlen(prompt);
+		(void)memcpy(cp, prompt, len * sizeof(*cp));
 		cp += len;
 	}
 	len = 0;
@@ -711,7 +722,7 @@ c_gets(EditLine *el, char *buf, const ch
 		el->el_line.lastchar = cp + 1;
 		re_refresh(el);
 
-		if (el_getc(el, &ch) != 1) {
+		if (FUN(el,getc)(el, &ch) != 1) {
 			ed_end_of_file(el, 0);
 			len = -1;
 			break;
@@ -721,7 +732,7 @@ c_gets(EditLine *el, char *buf, const ch
 
 		case 0010:	/* Delete and backspace */
 		case 0177:
-			if (len <= 0) {
+			if (len == 0) {
 				len = -1;
 				break;
 			}
@@ -749,7 +760,7 @@ c_gets(EditLine *el, char *buf, const ch
 	el->el_line.buffer[0] = '\0';
 	el->el_line.lastchar = el->el_line.buffer;
 	el->el_line.cursor = el->el_line.buffer;
-	return len;
+	return (int)len;
 }
 
 
@@ -759,7 +770,7 @@ c_gets(EditLine *el, char *buf, const ch
 protected int
 c_hpos(EditLine *el)
 {
-	char *ptr;
+	Char *ptr;
 
 	/*
 	 * Find how many characters till the beginning of this line.
@@ -771,6 +782,14 @@ c_hpos(EditLine *el)
 		     ptr >= el->el_line.buffer && *ptr != '\n';
 		     ptr--)
 			continue;
-		return (el->el_line.cursor - ptr - 1);
+		return (int)(el->el_line.cursor - ptr - 1);
 	}
 }
+
+protected int
+ch_resizefun(EditLine *el, el_zfunc_t f, void *a)
+{
+	el->el_chared.c_resizefun = f;
+	el->el_chared.c_resizearg = a;
+	return 0;
+}

=== modified file 'cmd-line-utils/libedit/chared.h'
--- a/cmd-line-utils/libedit/chared.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/chared.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: chared.h,v 1.17 2006/03/06 21:11:56 christos Exp $	*/
+/*	$NetBSD: chared.h,v 1.21 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -63,25 +63,25 @@
 typedef struct c_macro_t {
 	int	  level;
 	int	  offset;
-	char	**macro;
+	Char	**macro;
 } c_macro_t;
 
 /*
  * Undo information for vi - no undo in emacs (yet)
  */
 typedef struct c_undo_t {
-	int	 len;			/* length of saved line */
+	ssize_t	 len;			/* length of saved line */
 	int	 cursor;		/* position of saved cursor */
-	char	*buf;			/* full saved text */
+	Char	*buf;			/* full saved text */
 } c_undo_t;
 
 /* redo for vi */
 typedef struct c_redo_t {
-	char	*buf;			/* redo insert key sequence */
-	char	*pos;
-	char	*lim;
+	Char	*buf;			/* redo insert key sequence */
+	Char	*pos;
+	Char	*lim;
 	el_action_t	cmd;		/* command to redo */
-	char	ch;			/* char that invoked it */
+	Char	ch;			/* char that invoked it */
 	int	count;
 	int	action;			/* from cv_action() */
 } c_redo_t;
@@ -91,18 +91,20 @@ typedef struct c_redo_t {
  */
 typedef struct c_vcmd_t {
 	int	 action;
-	char	*pos;
+	Char	*pos;
 } c_vcmd_t;
 
 /*
  * Kill buffer for emacs
  */
 typedef struct c_kill_t {
-	char	*buf;
-	char	*last;
-	char	*mark;
+	Char	*buf;
+	Char	*last;
+	Char	*mark;
 } c_kill_t;
 
+typedef void (*el_zfunc_t)(EditLine *, void *);
+
 /*
  * Note that we use both data structures because the user can bind
  * commands from both editors!
@@ -113,13 +115,14 @@ typedef struct el_chared_t {
 	c_redo_t	c_redo;
 	c_vcmd_t	c_vcmd;
 	c_macro_t	c_macro;
+	el_zfunc_t	c_resizefun;
+	void *		c_resizearg;
 } el_chared_t;
 
 
 #define	STRQQ		"\"\""
 
 #define	isglob(a)	(strchr("*[]?", (a)) != NULL)
-#define	isword(a)	(el_isprint(a))
 
 #define	NOP		0x00
 #define	DELETE		0x01
@@ -140,27 +143,28 @@ typedef struct el_chared_t {
 #include "fcns.h"
 
 
-protected int	 cv__isword(int);
-protected int	 cv__isWord(int);
+protected int	 cv__isword(Int);
+protected int	 cv__isWord(Int);
 protected void	 cv_delfini(EditLine *);
-protected char	*cv__endword(char *, char *, int, int (*)(int));
-protected int	 ce__isword(int);
+protected Char	*cv__endword(Char *, Char *, int, int (*)(Int));
+protected int	 ce__isword(Int);
 protected void	 cv_undo(EditLine *);
-protected void	 cv_yank(EditLine *, const char *, int);
-protected char	*cv_next_word(EditLine*, char *, char *, int, int (*)(int));
-protected char	*cv_prev_word(char *, char *, int, int (*)(int));
-protected char	*c__next_word(char *, char *, int, int (*)(int));
-protected char	*c__prev_word(char *, char *, int, int (*)(int));
+protected void	 cv_yank(EditLine *, const Char *, int);
+protected Char	*cv_next_word(EditLine*, Char *, Char *, int, int (*)(Int));
+protected Char	*cv_prev_word(Char *, Char *, int, int (*)(Int));
+protected Char	*c__next_word(Char *, Char *, int, int (*)(Int));
+protected Char	*c__prev_word(Char *, Char *, int, int (*)(Int));
 protected void	 c_insert(EditLine *, int);
 protected void	 c_delbefore(EditLine *, int);
 protected void	 c_delbefore1(EditLine *);
 protected void	 c_delafter(EditLine *, int);
 protected void	 c_delafter1(EditLine *);
-protected int	 c_gets(EditLine *, char *, const char *);
+protected int	 c_gets(EditLine *, Char *, const Char *);
 protected int	 c_hpos(EditLine *);
 
 protected int	 ch_init(EditLine *);
 protected void	 ch_reset(EditLine *, int);
+protected int	 ch_resizefun(EditLine *, el_zfunc_t, void *);
 protected int	 ch_enlargebufs(EditLine *, size_t);
 protected void	 ch_end(EditLine *);
 

=== added file 'cmd-line-utils/libedit/chartype.c'
--- a/cmd-line-utils/libedit/chartype.c	1970-01-01 00:00:00 +0000
+++ b/cmd-line-utils/libedit/chartype.c	2011-04-17 13:40:20 +0000
@@ -0,0 +1,359 @@
+/*	$NetBSD: chartype.c,v 1.4 2010/04/15 00:55:57 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * chartype.c: character classification and meta information
+ */
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#endif /* not lint && not SCCSID */
+#include "el.h"
+#include <stdlib.h>
+
+#define CT_BUFSIZ 1024
+
+#ifdef WIDECHAR
+protected void
+ct_conv_buff_resize(ct_buffer_t *conv, size_t mincsize, size_t minwsize)
+{
+	void *p;
+	if (mincsize > conv->csize) {
+		conv->csize = mincsize;
+		p = el_realloc(conv->cbuff, conv->csize);
+		if (p == NULL) {
+			conv->csize = 0;
+			el_free(conv->cbuff);
+			conv->cbuff = NULL;
+		} else 
+			conv->cbuff = p;
+	}
+
+	if (minwsize > conv->wsize) {
+		conv->wsize = minwsize;
+		p = el_realloc(conv->wbuff, conv->wsize);
+		if (p == NULL) {
+			conv->wsize = 0;
+			el_free(conv->wbuff);
+			conv->wbuff = NULL;
+		} else
+			conv->wbuff = p;
+	}
+}
+
+
+public char *
+ct_encode_string(const Char *s, ct_buffer_t *conv)
+{
+	char *dst;
+	ssize_t used = 0;
+
+	if (!s)
+		return NULL;
+	if (!conv->cbuff)
+		ct_conv_buff_resize(conv, CT_BUFSIZ, 0);
+	if (!conv->cbuff)
+		return NULL;
+
+	dst = conv->cbuff;
+	while (*s) {
+		used = ct_encode_char(dst, (int)(conv->csize -
+		    (dst - conv->cbuff)), *s);
+		if (used == -1) { /* failed to encode, need more buffer space */
+			used = dst - conv->cbuff;
+			ct_conv_buff_resize(conv, conv->csize + CT_BUFSIZ, 0);
+			if (!conv->cbuff)
+				return NULL;
+			dst = conv->cbuff + used;
+			/* don't increment s here - we want to retry it! */
+		}
+		else
+			++s;
+		dst += used;
+	}
+	if (dst >= (conv->cbuff + conv->csize)) {
+		used = dst - conv->cbuff;
+		ct_conv_buff_resize(conv, conv->csize + 1, 0);
+		if (!conv->cbuff)
+			return NULL;
+		dst = conv->cbuff + used;
+	}
+	*dst = '\0';
+	return conv->cbuff;
+}
+
+public Char *
+ct_decode_string(const char *s, ct_buffer_t *conv)
+{
+	size_t len = 0;
+
+	if (!s)
+		return NULL;
+	if (!conv->wbuff)
+		ct_conv_buff_resize(conv, 0, CT_BUFSIZ);
+	if (!conv->wbuff)
+		return NULL;
+
+	len = ct_mbstowcs(0, s, 0);
+	if (len > conv->wsize)
+		ct_conv_buff_resize(conv, 0, len + 1);
+	if (!conv->wbuff)
+		return NULL;
+	ct_mbstowcs(conv->wbuff, s, conv->wsize);
+	return conv->wbuff;
+}
+
+
+protected Char **
+ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv)
+{
+	size_t bufspace;
+	int i;
+	Char *p;
+	Char **wargv;
+	ssize_t bytes;
+
+	/* Make sure we have enough space in the conversion buffer to store all
+	 * the argv strings. */
+	for (i = 0, bufspace = 0; i < argc; ++i)
+		bufspace += argv[i] ? strlen(argv[i]) + 1 : 0;
+	ct_conv_buff_resize(conv, 0, bufspace);
+	if (!conv->wsize)
+		return NULL;
+
+	wargv = el_malloc(argc * sizeof(*wargv));
+
+	for (i = 0, p = conv->wbuff; i < argc; ++i) {
+		if (!argv[i]) {   /* don't pass null pointers to mbstowcs */
+			wargv[i] = NULL;
+			continue;
+		} else {
+			wargv[i] = p;
+			bytes = mbstowcs(p, argv[i], bufspace);
+		}
+		if (bytes == -1) {
+			el_free(wargv);
+			return NULL;
+		} else
+			bytes++;  /* include '\0' in the count */
+		bufspace -= bytes;
+		p += bytes;
+	}
+
+	return wargv;
+}
+
+
+protected size_t
+ct_enc_width(Char c)
+{
+	/* UTF-8 encoding specific values */
+	if (c < 0x80)
+		return 1;
+	else if (c < 0x0800)
+		return 2;
+	else if (c < 0x10000)
+		return 3;
+	else if (c < 0x110000)
+		return 4;
+	else
+		return 0; /* not a valid codepoint */
+}
+
+protected ssize_t
+ct_encode_char(char *dst, size_t len, Char c)
+{
+	ssize_t l = 0;
+	if (len < ct_enc_width(c))
+		return -1;
+	l = ct_wctomb(dst, c);
+
+	if (l < 0) {
+		ct_wctomb_reset;
+		l = 0;
+	}
+	return l;
+}
+#endif
+
+protected const Char *
+ct_visual_string(const Char *s)
+{
+	static Char *buff = NULL;
+	static size_t buffsize = 0;
+	void *p;
+	Char *dst;
+	ssize_t used = 0;
+
+	if (!s)
+		return NULL;
+	if (!buff) {
+	    buffsize = CT_BUFSIZ;
+	    buff = el_malloc(buffsize * sizeof(*buff));
+	}
+	dst = buff;
+	while (*s) {
+		used = ct_visual_char(dst, buffsize - (dst - buff), *s);
+		if (used == -1) { /* failed to encode, need more buffer space */
+			used = dst - buff;
+			buffsize += CT_BUFSIZ;
+			p = el_realloc(buff, buffsize * sizeof(*buff));
+			if (p == NULL)
+				goto out;
+			buff = p;
+			dst = buff + used;
+			/* don't increment s here - we want to retry it! */
+		}
+		else
+		    ++s;
+		dst += used;
+	}
+	if (dst >= (buff + buffsize)) { /* sigh */
+		buffsize += 1;
+		p = el_realloc(buff, buffsize * sizeof(*buff));
+		if (p == NULL)
+			goto out;
+		buff = p;
+		dst = buff + buffsize - 1;
+	}
+	*dst = 0;
+	return buff;
+out:
+	el_free(buff);
+	buffsize = 0;
+	return NULL;
+}
+
+
+
+protected int
+ct_visual_width(Char c)
+{
+	int t = ct_chr_class(c);
+	switch (t) {
+	case CHTYPE_ASCIICTL:
+		return 2; /* ^@ ^? etc. */
+	case CHTYPE_TAB:
+		return 1; /* Hmm, this really need to be handled outside! */
+	case CHTYPE_NL:
+		return 0; /* Should this be 1 instead? */
+#ifdef WIDECHAR
+	case CHTYPE_PRINT:
+		return wcwidth(c);
+	case CHTYPE_NONPRINT:
+		if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */
+			return 8; /* \U+12345 */
+		else
+			return 7; /* \U+1234 */
+#else
+	case CHTYPE_PRINT:
+		return 1;
+	case CHTYPE_NONPRINT:
+		return 4; /* \123 */
+#endif
+	default:
+		return 0; /* should not happen */
+	}
+}
+
+
+protected ssize_t
+ct_visual_char(Char *dst, size_t len, Char c)
+{
+	int t = ct_chr_class(c);
+	switch (t) {
+	case CHTYPE_TAB:
+	case CHTYPE_NL:
+	case CHTYPE_ASCIICTL:
+		if (len < 2)
+			return -1;   /* insufficient space */
+		*dst++ = '^';
+		if (c == '\177')
+			*dst = '?'; /* DEL -> ^? */
+		else
+			*dst = c | 0100;    /* uncontrolify it */
+		return 2;
+	case CHTYPE_PRINT:
+		if (len < 1)
+			return -1;  /* insufficient space */
+		*dst = c;
+		return 1;
+	case CHTYPE_NONPRINT:
+		/* we only use single-width glyphs for display,
+		 * so this is right */
+		if ((ssize_t)len < ct_visual_width(c))
+			return -1;   /* insufficient space */
+#ifdef WIDECHAR
+		*dst++ = '\\';
+		*dst++ = 'U';
+		*dst++ = '+';
+#define tohexdigit(v) "0123456789ABCDEF"[v]
+		if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */
+			*dst++ = tohexdigit(((unsigned int) c >> 16) & 0xf);
+		*dst++ = tohexdigit(((unsigned int) c >> 12) & 0xf);
+		*dst++ = tohexdigit(((unsigned int) c >>  8) & 0xf);
+		*dst++ = tohexdigit(((unsigned int) c >>  4) & 0xf);
+		*dst   = tohexdigit(((unsigned int) c      ) & 0xf);
+		return (c > 0xffff) ? 8 : 7;
+#else
+		*dst++ = '\\';
+#define tooctaldigit(v) ((v) + '0')
+		*dst++ = tooctaldigit(((unsigned int) c >> 6) & 0x7);
+		*dst++ = tooctaldigit(((unsigned int) c >> 3) & 0x7);
+		*dst++ = tooctaldigit(((unsigned int) c     ) & 0x7);
+#endif
+		/*FALLTHROUGH*/
+	/* these two should be handled outside this function */
+	default:            /* we should never hit the default */
+		return 0;
+	}
+}
+
+
+
+
+protected int
+ct_chr_class(Char c)
+{
+	if (c == '\t')
+		return CHTYPE_TAB;
+	else if (c == '\n')
+		return CHTYPE_NL;
+	else if (IsASCII(c) && Iscntrl(c))
+		return CHTYPE_ASCIICTL;
+	else if (Isprint(c))
+		return CHTYPE_PRINT;
+	else
+		return CHTYPE_NONPRINT;
+}

=== added file 'cmd-line-utils/libedit/chartype.h'
--- a/cmd-line-utils/libedit/chartype.h	1970-01-01 00:00:00 +0000
+++ b/cmd-line-utils/libedit/chartype.h	2011-04-17 13:40:20 +0000
@@ -0,0 +1,245 @@
+/*	$NetBSD: chartype.h,v 1.7 2010/12/16 17:42:28 wiz Exp $	*/
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _h_chartype_f
+#define _h_chartype_f
+
+
+
+#ifdef WIDECHAR
+
+/* Ideally we should also test the value of the define to see if it
+ * supports non-BMP code points without requiring UTF-16, but nothing
+ * seems to actually advertise this properly, despite Unicode 3.1 having
+ * been around since 2001... */
+#if !defined(__NetBSD__) && !defined(__sun) && !(defined(__APPLE__) && defined(__MACH__))
+#ifndef __STDC_ISO_10646__
+/* In many places it is assumed that the first 127 code points are ASCII
+ * compatible, so ensure wchar_t indeed does ISO 10646 and not some other
+ * funky encoding that could break us in weird and wonderful ways. */
+	#error wchar_t must store ISO 10646 characters
+#endif
+#endif
+
+/* Oh for a <uchar.h> with char32_t and __STDC_UTF_32__ in it...
+ * ref: ISO/IEC DTR 19769
+ */
+#if WCHAR_MAX < INT32_MAX
+#warning Build environment does not support non-BMP characters
+#endif
+
+#define ct_mbtowc            mbtowc
+#define ct_mbtowc_reset      mbtowc(0,0,0)
+#define ct_wctomb            wctomb
+#define ct_wctomb_reset      wctomb(0,0)
+#define ct_wcstombs          wcstombs
+#define ct_mbstowcs          mbstowcs
+
+#define Char			wchar_t
+#define Int			wint_t
+#define FUN(prefix,rest)	prefix ## _w ## rest
+#define FUNW(type)		type ## _w
+#define TYPE(type)		type ## W
+#define FSTR			"%ls"
+#define STR(x) 			L ## x
+#define UC(c)			c
+#define Isalpha(x)  iswalpha(x)
+#define Isalnum(x)  iswalnum(x)
+#define Isgraph(x)  iswgraph(x)
+#define Isspace(x)  iswspace(x)
+#define Isdigit(x)  iswdigit(x)
+#define Iscntrl(x)  iswcntrl(x)
+#define Isprint(x)  iswprint(x)
+
+#define Isupper(x)  iswupper(x)
+#define Islower(x)  iswlower(x)
+#define Toupper(x)  towupper(x)
+#define Tolower(x)  towlower(x)
+
+#define IsASCII(x)  (x < 0x100)
+
+#define Strlen(x)       wcslen(x)
+#define Strchr(s,c)     wcschr(s,c)
+#define Strrchr(s,c)    wcsrchr(s,c)
+#define Strstr(s,v)     wcsstr(s,v)
+#define Strdup(x)       wcsdup(x)
+#define Strcpy(d,s)     wcscpy(d,s)
+#define Strncpy(d,s,n)  wcsncpy(d,s,n)
+#define Strncat(d,s,n)  wcsncat(d,s,n)
+
+#define Strcmp(s,v)     wcscmp(s,v)
+#define Strncmp(s,v,n)  wcsncmp(s,v,n)
+#define Strcspn(s,r)    wcscspn(s,r)
+
+#define Strtol(p,e,b)   wcstol(p,e,b)
+
+#define Width(c)	wcwidth(c)
+
+#else /* NARROW */
+
+#define ct_mbtowc            error
+#define ct_mbtowc_reset      
+#define ct_wctomb            error
+#define ct_wctomb_reset      
+#define ct_wcstombs(a, b, c)    (strncpy(a, b, c), strlen(a))
+#define ct_mbstowcs(a, b, c)    (strncpy(a, b, c), strlen(a))
+
+#define Char			char
+#define Int			int
+#define FUN(prefix,rest)	prefix ## _ ## rest
+#define FUNW(type)		type
+#define TYPE(type)		type
+#define FSTR			"%s"
+#define STR(x) 			x
+#define UC(c)			(unsigned char)(c)
+
+#define Isalpha(x)  isalpha((unsigned char)x)
+#define Isalnum(x)  isalnum((unsigned char)x)
+#define Isgraph(x)  isgraph((unsigned char)x)
+#define Isspace(x)  isspace((unsigned char)x)
+#define Isdigit(x)  isdigit((unsigned char)x)
+#define Iscntrl(x)  iscntrl((unsigned char)x)
+#define Isprint(x)  el_isprint((unsigned char)x)
+
+#define Isupper(x)  isupper((unsigned char)x)
+#define Islower(x)  islower((unsigned char)x)
+#define Toupper(x)  toupper((unsigned char)x)
+#define Tolower(x)  tolower((unsigned char)x)
+
+#define IsASCII(x)  isascii((unsigned char)x)
+
+#define Strlen(x)       strlen(x)
+#define Strchr(s,c)     strchr(s,c)
+#define Strrchr(s,c)    strrchr(s,c)
+#define Strstr(s,v)     strstr(s,v)
+#define Strdup(x)       strdup(x)
+#define Strcpy(d,s)     strcpy(d,s)
+#define Strncpy(d,s,n)  strncpy(d,s,n)
+#define Strncat(d,s,n)  strncat(d,s,n)
+
+#define Strcmp(s,v)     strcmp(s,v)
+#define Strncmp(s,v,n)  strncmp(s,v,n)
+#define Strcspn(s,r)    strcspn(s,r)
+
+#define Strtol(p,e,b)   strtol(p,e,b)
+
+#define Width(c)	1
+
+#endif
+
+
+#ifdef WIDECHAR
+/*
+ * Conversion buffer
+ */
+typedef struct ct_buffer_t {
+        char    *cbuff;
+        size_t  csize;
+        Char *wbuff;
+        size_t  wsize;
+} ct_buffer_t;
+
+#define ct_encode_string __ct_encode_string
+/* Encode a wide-character string and return the UTF-8 encoded result. */
+public char *ct_encode_string(const Char *, ct_buffer_t *);
+
+#define ct_decode_string __ct_decode_string
+/* Decode a (multi)?byte string and return the wide-character string result. */
+public Char *ct_decode_string(const char *, ct_buffer_t *);
+
+/* Decode a (multi)?byte argv string array.
+ * The pointer returned must be free()d when done. */
+protected Char **ct_decode_argv(int, const char *[],  ct_buffer_t *);
+
+/* Resizes the conversion buffer(s) if needed. */
+protected void ct_conv_buff_resize(ct_buffer_t *, size_t, size_t);
+protected ssize_t ct_encode_char(char *, size_t, Char);
+protected size_t ct_enc_width(Char);
+
+#define ct_free_argv(s)	el_free(s)
+
+#else
+#define	ct_encode_string(s, b)	(s)
+#define ct_decode_string(s, b)	(s)
+#define ct_decode_argv(l, s, b)	(s)
+#define ct_conv_buff_resize(b, os, ns)
+#define ct_encode_char(d, l, s)	(*d = s, 1)
+#define ct_free_argv(s)
+#endif
+
+#ifndef NARROWCHAR
+/* Encode a characted into the destination buffer, provided there is sufficent
+ * buffer space available. Returns the number of bytes used up (zero if the
+ * character cannot be encoded, -1 if there was not enough space available). */
+
+/* The maximum buffer size to hold the most unwieldly visual representation,
+ * in this case \U+nnnnn. */
+#define VISUAL_WIDTH_MAX 8
+
+/* The terminal is thought of in terms of X columns by Y lines. In the cases
+ * where a wide character takes up more than one column, the adjacent 
+ * occupied column entries will contain this faux character. */
+#define MB_FILL_CHAR ((Char)-1)
+
+/* Visual width of character c, taking into account ^? , \0177 and \U+nnnnn
+ * style visual expansions. */
+protected int ct_visual_width(Char);
+
+/* Turn the given character into the appropriate visual format, matching
+ * the width given by ct_visual_width(). Returns the number of characters used
+ * up, or -1 if insufficient space. Buffer length is in count of Char's. */
+protected ssize_t ct_visual_char(Char *, size_t, Char);
+
+/* Convert the given string into visual format, using the ct_visual_char()
+ * function. Uses a static buffer, so not threadsafe. */
+protected const Char *ct_visual_string(const Char *);
+
+
+/* printable character, use ct_visual_width() to find out display width */
+#define CHTYPE_PRINT        ( 0)
+/* control character found inside the ASCII portion of the charset */
+#define CHTYPE_ASCIICTL     (-1)
+/* a \t */
+#define CHTYPE_TAB          (-2)
+/* a \n */
+#define CHTYPE_NL           (-3)
+/* non-printable character */
+#define CHTYPE_NONPRINT     (-4)
+/* classification of character c, as one of the above defines */
+protected int ct_chr_class(Char c);
+#endif
+
+
+#endif /* _chartype_f */

=== modified file 'cmd-line-utils/libedit/common.c'
--- a/cmd-line-utils/libedit/common.c	2010-10-19 22:36:59 +0000
+++ b/cmd-line-utils/libedit/common.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: common.c,v 1.21 2008/09/30 08:37:42 aymeric Exp $	*/
+/*	$NetBSD: common.c,v 1.24 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -51,7 +51,7 @@ static char sccsid[] = "@(#)common.c	8.1
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_end_of_file(EditLine *el, int c __attribute__((__unused__)))
+ed_end_of_file(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	re_goto_bottom(el);
@@ -65,7 +65,7 @@ ed_end_of_file(EditLine *el, int c __att
  *	Insert a character [bound to all insert keys]
  */
 protected el_action_t
-ed_insert(EditLine *el, int c)
+ed_insert(EditLine *el, Int c)
 {
 	int count = el->el_state.argument;
 
@@ -108,9 +108,9 @@ ed_insert(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_delete_prev_word(EditLine *el, int c __attribute__((__unused__)))
+ed_delete_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *p, *kp;
+	Char *cp, *p, *kp;
 
 	if (el->el_line.cursor == el->el_line.buffer)
 		return (CC_ERROR);
@@ -122,7 +122,7 @@ ed_delete_prev_word(EditLine *el, int c 
 		*kp++ = *p;
 	el->el_chared.c_kill.last = kp;
 
-	c_delbefore(el, el->el_line.cursor - cp);	/* delete before dot */
+	c_delbefore(el, (int)(el->el_line.cursor - cp));/* delete before dot */
 	el->el_line.cursor = cp;
 	if (el->el_line.cursor < el->el_line.buffer)
 		el->el_line.cursor = el->el_line.buffer; /* bounds check */
@@ -136,7 +136,7 @@ ed_delete_prev_word(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_delete_next_char(EditLine *el, int c __attribute__((__unused__)))
+ed_delete_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 #ifdef notdef			/* XXX */
 #define	EL	el->el_line
@@ -154,7 +154,7 @@ ed_delete_next_char(EditLine *el, int c 
 				return (CC_ERROR);
 #else
 				/* then do an EOF */
-				term_writechar(el, c);
+				term_writec(el, c);
 				return (CC_EOF);
 #endif
 			} else {
@@ -186,9 +186,9 @@ ed_delete_next_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_kill_line(EditLine *el, int c __attribute__((__unused__)))
+ed_kill_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	cp = el->el_line.cursor;
 	kp = el->el_chared.c_kill.buf;
@@ -207,7 +207,7 @@ ed_kill_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_move_to_end(EditLine *el, int c __attribute__((__unused__)))
+ed_move_to_end(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.lastchar;
@@ -230,14 +230,14 @@ ed_move_to_end(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_move_to_beg(EditLine *el, int c __attribute__((__unused__)))
+ed_move_to_beg(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
 
 	if (el->el_map.type == MAP_VI) {
 			/* We want FIRST non space character */
-		while (isspace((unsigned char) *el->el_line.cursor))
+		while (Isspace(*el->el_line.cursor))
 			el->el_line.cursor++;
 		if (el->el_chared.c_vcmd.action != NOP) {
 			cv_delfini(el);
@@ -253,7 +253,7 @@ ed_move_to_beg(EditLine *el, int c __att
  *	[^T] [^T]
  */
 protected el_action_t
-ed_transpose_chars(EditLine *el, int c)
+ed_transpose_chars(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor < el->el_line.lastchar) {
@@ -279,9 +279,9 @@ ed_transpose_chars(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_next_char(EditLine *el, int c __attribute__((__unused__)))
+ed_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *lim = el->el_line.lastchar;
+	Char *lim = el->el_line.lastchar;
 
 	if (el->el_line.cursor >= lim ||
 	    (el->el_line.cursor == lim - 1 &&
@@ -308,7 +308,7 @@ ed_next_char(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_word(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.buffer)
@@ -334,7 +334,7 @@ ed_prev_word(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_char(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor > el->el_line.buffer) {
@@ -358,14 +358,14 @@ ed_prev_char(EditLine *el, int c __attri
  *	[^V] [^V]
  */
 protected el_action_t
-ed_quoted_insert(EditLine *el, int c)
+ed_quoted_insert(EditLine *el, Int c)
 {
 	int num;
-	char tc;
+	Char tc;
 
 	tty_quotemode(el);
-	num = el_getc(el, &tc);
-	c = (unsigned char) tc;
+	num = FUN(el,getc)(el, &tc);
+	c = tc;
 	tty_noquotemode(el);
 	if (num == 1)
 		return (ed_insert(el, c));
@@ -378,10 +378,10 @@ ed_quoted_insert(EditLine *el, int c)
  *	Adds to argument or enters a digit
  */
 protected el_action_t
-ed_digit(EditLine *el, int c)
+ed_digit(EditLine *el, Int c)
 {
 
-	if (!isdigit(c))
+	if (!Isdigit(c))
 		return (CC_ERROR);
 
 	if (el->el_state.doingarg) {
@@ -406,10 +406,10 @@ ed_digit(EditLine *el, int c)
  *	For ESC-n
  */
 protected el_action_t
-ed_argument_digit(EditLine *el, int c)
+ed_argument_digit(EditLine *el, Int c)
 {
 
-	if (!isdigit(c))
+	if (!Isdigit(c))
 		return (CC_ERROR);
 
 	if (el->el_state.doingarg) {
@@ -432,7 +432,7 @@ ed_argument_digit(EditLine *el, int c)
 protected el_action_t
 /*ARGSUSED*/
 ed_unassigned(EditLine *el __attribute__((__unused__)),
-	      int c __attribute__((__unused__)))
+              Int c __attribute__((__unused__)))
 {
 
 	return (CC_ERROR);
@@ -450,7 +450,7 @@ ed_unassigned(EditLine *el __attribute__
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_sigint(EditLine *el __attribute__((__unused__)), 
-	      int c __attribute__((__unused__)))
+	      Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -464,7 +464,7 @@ ed_tty_sigint(EditLine *el __attribute__
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_dsusp(EditLine *el __attribute__((__unused__)), 
-	     int c __attribute__((__unused__)))
+	     Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -478,7 +478,7 @@ ed_tty_dsusp(EditLine *el __attribute__(
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_flush_output(EditLine *el __attribute__((__unused__)), 
-		    int c __attribute__((__unused__)))
+		    Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -492,7 +492,7 @@ ed_tty_flush_output(EditLine *el __attri
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_sigquit(EditLine *el __attribute__((__unused__)), 
-	       int c __attribute__((__unused__)))
+	       Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -506,7 +506,7 @@ ed_tty_sigquit(EditLine *el __attribute_
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_sigtstp(EditLine *el __attribute__((__unused__)), 
-	       int c __attribute__((__unused__)))
+	       Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -520,7 +520,7 @@ ed_tty_sigtstp(EditLine *el __attribute_
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_stop_output(EditLine *el __attribute__((__unused__)), 
-		   int c __attribute__((__unused__)))
+		   Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -534,7 +534,7 @@ ed_tty_stop_output(EditLine *el __attrib
 protected el_action_t
 /*ARGSUSED*/
 ed_tty_start_output(EditLine *el __attribute__((__unused__)), 
-		    int c __attribute__((__unused__)))
+		    Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -547,7 +547,7 @@ ed_tty_start_output(EditLine *el __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_newline(EditLine *el, int c __attribute__((__unused__)))
+ed_newline(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	re_goto_bottom(el);
@@ -563,7 +563,7 @@ ed_newline(EditLine *el, int c __attribu
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
+ed_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor <= el->el_line.buffer)
@@ -583,7 +583,7 @@ ed_delete_prev_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_clear_screen(EditLine *el, int c __attribute__((__unused__)))
+ed_clear_screen(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	term_clear_screen(el);	/* clear the whole real screen */
@@ -599,7 +599,7 @@ ed_clear_screen(EditLine *el, int c __at
 protected el_action_t
 /*ARGSUSED*/
 ed_redisplay(EditLine *el __attribute__((__unused__)), 
-	     int c __attribute__((__unused__)))
+	     Int c __attribute__((__unused__)))
 {
 
 	return (CC_REDISPLAY);
@@ -612,7 +612,7 @@ ed_redisplay(EditLine *el __attribute__(
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_start_over(EditLine *el, int c __attribute__((__unused__)))
+ed_start_over(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	ch_reset(el, 0);
@@ -627,7 +627,7 @@ ed_start_over(EditLine *el, int c __attr
 protected el_action_t
 /*ARGSUSED*/
 ed_sequence_lead_in(EditLine *el __attribute__((__unused__)), 
-		    int c __attribute__((__unused__)))
+		    Int c __attribute__((__unused__)))
 {
 
 	return (CC_NORM);
@@ -640,7 +640,7 @@ ed_sequence_lead_in(EditLine *el __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_history(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_history(EditLine *el, Int c __attribute__((__unused__)))
 {
 	char beep = 0;
 	int sv_event = el->el_history.eventno;
@@ -650,7 +650,7 @@ ed_prev_history(EditLine *el, int c __at
 
 	if (el->el_history.eventno == 0) {	/* save the current buffer
 						 * away */
-		(void) strncpy(el->el_history.buf, el->el_line.buffer,
+		(void) Strncpy(el->el_history.buf, el->el_line.buffer,
 		    EL_BUFSIZ);
 		el->el_history.last = el->el_history.buf +
 		    (el->el_line.lastchar - el->el_line.buffer);
@@ -660,7 +660,7 @@ ed_prev_history(EditLine *el, int c __at
 	if (hist_get(el) == CC_ERROR) {
 		if (el->el_map.type == MAP_VI) {
 			el->el_history.eventno = sv_event;
-			return CC_ERROR;
+			
 		}
 		beep = 1;
 		/* el->el_history.eventno was fixed by first call */
@@ -678,7 +678,7 @@ ed_prev_history(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_next_history(EditLine *el, int c __attribute__((__unused__)))
+ed_next_history(EditLine *el, Int c __attribute__((__unused__)))
 {
 	el_action_t beep = CC_REFRESH, rval;
 
@@ -705,9 +705,9 @@ ed_next_history(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_search_prev_history(EditLine *el, int c __attribute__((__unused__)))
+ed_search_prev_history(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char *hp;
+	const Char *hp;
 	int h;
 	bool_t found = 0;
 
@@ -723,7 +723,7 @@ ed_search_prev_history(EditLine *el, int
 		return (CC_ERROR);
 	}
 	if (el->el_history.eventno == 0) {
-		(void) strncpy(el->el_history.buf, el->el_line.buffer,
+		(void) Strncpy(el->el_history.buf, el->el_line.buffer,
 		    EL_BUFSIZ);
 		el->el_history.last = el->el_history.buf +
 		    (el->el_line.lastchar - el->el_line.buffer);
@@ -744,7 +744,7 @@ ed_search_prev_history(EditLine *el, int
 #ifdef SDEBUG
 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp);
 #endif
-		if ((strncmp(hp, el->el_line.buffer, (size_t)
+		if ((Strncmp(hp, el->el_line.buffer, (size_t)
 			    (el->el_line.lastchar - el->el_line.buffer)) ||
 			hp[el->el_line.lastchar - el->el_line.buffer]) &&
 		    c_hmatch(el, hp)) {
@@ -773,9 +773,9 @@ ed_search_prev_history(EditLine *el, int
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_search_next_history(EditLine *el, int c __attribute__((__unused__)))
+ed_search_next_history(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char *hp;
+	const Char *hp;
 	int h;
 	bool_t found = 0;
 
@@ -799,7 +799,7 @@ ed_search_next_history(EditLine *el, int
 #ifdef SDEBUG
 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp);
 #endif
-		if ((strncmp(hp, el->el_line.buffer, (size_t)
+		if ((Strncmp(hp, el->el_line.buffer, (size_t)
 			    (el->el_line.lastchar - el->el_line.buffer)) ||
 			hp[el->el_line.lastchar - el->el_line.buffer]) &&
 		    c_hmatch(el, hp))
@@ -827,9 +827,9 @@ ed_search_next_history(EditLine *el, int
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_prev_line(EditLine *el, int c __attribute__((__unused__)))
+ed_prev_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *ptr;
+	Char *ptr;
 	int nchars = c_hpos(el);
 
 	/*
@@ -870,9 +870,9 @@ ed_prev_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_next_line(EditLine *el, int c __attribute__((__unused__)))
+ed_next_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *ptr;
+	Char *ptr;
 	int nchars = c_hpos(el);
 
 	/*
@@ -904,12 +904,12 @@ ed_next_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-ed_command(EditLine *el, int c __attribute__((__unused__)))
+ed_command(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char tmpbuf[EL_BUFSIZ];
+	Char tmpbuf[EL_BUFSIZ];
 	int tmplen;
 
-	tmplen = c_gets(el, tmpbuf, "\n: ");
+	tmplen = c_gets(el, tmpbuf, STR("\n: "));
 	term__putc(el, '\n');
 
 	if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)

=== modified file 'cmd-line-utils/libedit/el.c'
--- a/cmd-line-utils/libedit/el.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/el.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.c,v 1.47 2009/01/18 12:17:24 lukem Exp $	*/
+/*	$NetBSD: el.c,v 1.62 2011/03/20 12:36:14 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -48,6 +48,9 @@ static char sccsid[] = "@(#)el.c	8.2 (Be
 #include <string.h>
 #include <stdlib.h>
 #include <stdarg.h>
+#include <ctype.h>
+#include <locale.h>
+#include <langinfo.h>
 #include "el.h"
 
 /* el_init():
@@ -56,7 +59,6 @@ static char sccsid[] = "@(#)el.c	8.2 (Be
 public EditLine *
 el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
 {
-
 	EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
 
 	if (el == NULL)
@@ -69,8 +71,11 @@ el_init(const char *prog, FILE *fin, FIL
 	el->el_errfile = ferr;
 
 	el->el_infd = fileno(fin);
+	el->el_outfd = fileno(fout);
+	el->el_errfd = fileno(ferr);
 
-	if ((el->el_prog = el_strdup(prog)) == NULL) {
+	el->el_prog = Strdup(ct_decode_string(prog, &el->el_scratch));
+	if (el->el_prog == NULL) {
 		el_free(el);
 		return NULL;
 	}
@@ -79,6 +84,12 @@ el_init(const char *prog, FILE *fin, FIL
          * Initialize all the modules. Order is important!!!
          */
 	el->el_flags = 0;
+#ifdef WIDECHAR
+	if (setlocale(LC_CTYPE, NULL) != NULL){
+		if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
+			el->el_flags |= CHARSET_IS_UTF8;
+	}
+#endif
 
 	if (term_init(el) == -1) {
 		el_free(el->el_prog);
@@ -123,6 +134,12 @@ el_end(EditLine *el)
 	sig_end(el);
 
 	el_free((ptr_t) el->el_prog);
+#ifdef WIDECHAR
+	el_free((ptr_t) el->el_scratch.cbuff);
+	el_free((ptr_t) el->el_scratch.wbuff);
+	el_free((ptr_t) el->el_lgcyconv.cbuff);
+	el_free((ptr_t) el->el_lgcyconv.wbuff);
+#endif
 	el_free((ptr_t) el);
 }
 
@@ -143,7 +160,7 @@ el_reset(EditLine *el)
  *	set the editline parameters
  */
 public int
-el_set(EditLine *el, int op, ...)
+FUN(el,set)(EditLine *el, int op, ...)
 {
 	va_list ap;
 	int rv = 0;
@@ -154,16 +171,35 @@ el_set(EditLine *el, int op, ...)
 
 	switch (op) {
 	case EL_PROMPT:
-	case EL_RPROMPT:
-		rv = prompt_set(el, va_arg(ap, el_pfunc_t), op);
+	case EL_RPROMPT: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+
+		rv = prompt_set(el, p, 0, op, 1);
 		break;
+	}
+
+	case EL_RESIZE: {
+		el_zfunc_t p = va_arg(ap, el_zfunc_t);
+		void *arg = va_arg(ap, void *);
+		rv = ch_resizefun(el, p, arg);
+		break;
+	}
+
+	case EL_PROMPT_ESC:
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+		int c = va_arg(ap, int);
+
+		rv = prompt_set(el, p, c, op, 1);
+		break;
+	}
 
 	case EL_TERMINAL:
 		rv = term_set(el, va_arg(ap, char *));
 		break;
 
 	case EL_EDITOR:
-		rv = map_set_editor(el, va_arg(ap, char *));
+		rv = map_set_editor(el, va_arg(ap, Char *));
 		break;
 
 	case EL_SIGNAL:
@@ -176,40 +212,39 @@ el_set(EditLine *el, int op, ...)
 	case EL_BIND:
 	case EL_TELLTC:
 	case EL_SETTC:
-	case EL_GETTC:
 	case EL_ECHOTC:
 	case EL_SETTY:
 	{
-		const char *argv[20];
+		const Char *argv[20];
 		int i;
 
 		for (i = 1; i < 20; i++)
-			if ((argv[i] = va_arg(ap, char *)) == NULL)
+			if ((argv[i] = va_arg(ap, Char *)) == NULL)
 				break;
 
 		switch (op) {
 		case EL_BIND:
-			argv[0] = "bind";
+			argv[0] = STR("bind");
 			rv = map_bind(el, i, argv);
 			break;
 
 		case EL_TELLTC:
-			argv[0] = "telltc";
+			argv[0] = STR("telltc");
 			rv = term_telltc(el, i, argv);
 			break;
 
 		case EL_SETTC:
-			argv[0] = "settc";
+			argv[0] = STR("settc");
 			rv = term_settc(el, i, argv);
 			break;
 
 		case EL_ECHOTC:
-			argv[0] = "echotc";
+			argv[0] = STR("echotc");
 			rv = term_echotc(el, i, argv);
 			break;
 
 		case EL_SETTY:
-			argv[0] = "setty";
+			argv[0] = STR("setty");
 			rv = tty_stty(el, i, argv);
 			break;
 
@@ -223,8 +258,8 @@ el_set(EditLine *el, int op, ...)
 
 	case EL_ADDFN:
 	{
-		char *name = va_arg(ap, char *);
-		char *help = va_arg(ap, char *);
+		Char *name = va_arg(ap, Char *);
+		Char *help = va_arg(ap, Char *);
 		el_func_t func = va_arg(ap, el_func_t);
 
 		rv = map_addfunc(el, name, help, func);
@@ -234,9 +269,11 @@ el_set(EditLine *el, int op, ...)
 	case EL_HIST:
 	{
 		hist_fun_t func = va_arg(ap, hist_fun_t);
-		ptr_t ptr = va_arg(ap, char *);
+		ptr_t ptr = va_arg(ap, ptr_t);
 
 		rv = hist_set(el, func, ptr);
+		if (!(el->el_flags & CHARSET_IS_UTF8))
+			el->el_flags &= ~NARROW_HISTORY;
 		break;
 	}
 
@@ -252,6 +289,7 @@ el_set(EditLine *el, int op, ...)
 	{
 		el_rfunc_t rc = va_arg(ap, el_rfunc_t);
 		rv = el_read_setfn(el, rc);
+		el->el_flags &= ~NARROW_READ;
 		break;
 	}
 
@@ -296,9 +334,11 @@ el_set(EditLine *el, int op, ...)
 			break;
 		case 1:
 			el->el_outfile = fp;
+			el->el_outfd = fileno(fp);
 			break;
 		case 2:
 			el->el_errfile = fp;
+			el->el_errfd = fileno(fp);
 			break;
 		default:
 			rv = -1;
@@ -327,7 +367,7 @@ el_set(EditLine *el, int op, ...)
  *	retrieve the editline parameters
  */
 public int
-el_get(EditLine *el, int op, ...)
+FUN(el,get)(EditLine *el, int op, ...)
 {
 	va_list ap;
 	int rv;
@@ -339,12 +379,22 @@ el_get(EditLine *el, int op, ...)
 
 	switch (op) {
 	case EL_PROMPT:
-	case EL_RPROMPT:
-		rv = prompt_get(el, va_arg(ap, el_pfunc_t *), op);
+	case EL_RPROMPT: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		rv = prompt_get(el, p, 0, op);
 		break;
+	}
+	case EL_PROMPT_ESC:
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		Char *c = va_arg(ap, Char *);
+
+		rv = prompt_get(el, p, c, op);
+		break;
+	}
 
 	case EL_EDITOR:
-		rv = map_get_editor(el, va_arg(ap, const char **));
+		rv = map_get_editor(el, va_arg(ap, const Char **));
 		break;
 
 	case EL_SIGNAL:
@@ -386,26 +436,6 @@ el_get(EditLine *el, int op, ...)
 		break;
 	}
 
-#if 0 /* XXX */
-	case EL_ADDFN:
-	{
-		char *name = va_arg(ap, char *);
-		char *help = va_arg(ap, char *);
-		el_func_t func = va_arg(ap, el_func_t);
-
-		rv = map_addfunc(el, name, help, func);
-		break;
-	}
-
-	case EL_HIST:
-		{
-			hist_fun_t func = va_arg(ap, hist_fun_t);
-			ptr_t ptr = va_arg(ap, char *);
-			rv = hist_set(el, func, ptr);
-		}
-		break;
-#endif /* XXX */
-
 	case EL_GETCFN:
 		*va_arg(ap, el_rfunc_t *) = el_read_getfn(el);
 		rv = 0;
@@ -458,11 +488,11 @@ el_get(EditLine *el, int op, ...)
 /* el_line():
  *	Return editing info
  */
-public const LineInfo *
-el_line(EditLine *el)
+public const TYPE(LineInfo) *
+FUN(el,line)(EditLine *el)
 {
 
-	return (const LineInfo *) (void *) &el->el_line;
+	return (const TYPE(LineInfo) *) (void *) &el->el_line;
 }
 
 
@@ -475,10 +505,17 @@ el_source(EditLine *el, const char *fnam
 	FILE *fp;
 	size_t len;
 	char *ptr;
+	const Char *dptr;
 
 	fp = NULL;
 	if (fname == NULL) {
-#ifdef HAVE_ISSETUGID
+/* XXXMYSQL: Bug#49967 */
+#if defined(HAVE_GETUID) && defined(HAVE_GETEUID) && \
+    defined(HAVE_GETGID) && defined(HAVE_GETEGID)
+#define HAVE_IDENTITY_FUNCS 1
+#endif
+
+#if defined(HAVE_ISSETUGID) || defined(HAVE_IDENTITY_FUNCS)
 		static const char elpath[] = "/.editrc";
 /* XXXMYSQL: Portability fix (for which platforms?) */
 #ifdef MAXPATHLEN
@@ -487,8 +524,13 @@ el_source(EditLine *el, const char *fnam
 		char path[4096];
 #endif
 
+#ifdef HAVE_ISSETUGID
 		if (issetugid())
 			return (-1);
+#elif defined(HAVE_IDENTITY_FUNCS)
+                if (getuid() != geteuid() || getgid() != getegid())
+                  return (-1);
+#endif
 		if ((ptr = getenv("HOME")) == NULL)
 			return (-1);
 		if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
@@ -498,9 +540,10 @@ el_source(EditLine *el, const char *fnam
 		fname = path;
 #else
 		/*
-		 * If issetugid() is missing, always return an error, in order
-		 * to keep from inadvertently opening up the user to a security
-		 * hole.
+		 * If issetugid() or the above mentioned get[e][u|g]id()
+		 * functions are missing, always return an error, in order
+		 * to keep from inadvertently opening up the user to a
+		 * security hole.
 		 */
 		return (-1);
 #endif
@@ -511,10 +554,18 @@ el_source(EditLine *el, const char *fnam
 		return (-1);
 
 	while ((ptr = fgetln(fp, &len)) != NULL) {
-		if (len > 0 && ptr[len - 1] == '\n')
+		dptr = ct_decode_string(ptr, &el->el_scratch);
+		if (!dptr)
+			continue;
+		if (len > 0 && dptr[len - 1] == '\n')
 			--len;
-		ptr[len] = '\0';
-		if (parse_line(el, ptr) == -1) {
+
+		/* loop until first non-space char or EOL */
+		while (*dptr != '\0' && Isspace(*dptr))
+			dptr++;
+		if (*dptr == '#')
+			continue;   /* ignore, this is a comment line */
+		if (parse_line(el, dptr) == -1) {
 			(void) fclose(fp);
 			return (-1);
 		}
@@ -562,23 +613,24 @@ el_beep(EditLine *el)
  */
 protected int
 /*ARGSUSED*/
-el_editmode(EditLine *el, int argc, const char **argv)
+el_editmode(EditLine *el, int argc, const Char **argv)
 {
-	const char *how;
+	const Char *how;
 
 	if (argv == NULL || argc != 2 || argv[1] == NULL)
 		return (-1);
 
 	how = argv[1];
-	if (strcmp(how, "on") == 0) {
+	if (Strcmp(how, STR("on")) == 0) {
 		el->el_flags &= ~EDIT_DISABLED;
 		tty_rawmode(el);
-	} else if (strcmp(how, "off") == 0) {
+	} else if (Strcmp(how, STR("off")) == 0) {
 		tty_cookedmode(el);
 		el->el_flags |= EDIT_DISABLED;
 	}
 	else {
-		(void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
+		(void) fprintf(el->el_errfile, "edit: Bad value `" FSTR "'.\n",
+		    how);
 		return (-1);
 	}
 	return (0);

=== modified file 'cmd-line-utils/libedit/el.h'
--- a/cmd-line-utils/libedit/el.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/el.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.h,v 1.17 2006/12/15 22:13:33 christos Exp $	*/
+/*	$NetBSD: el.h,v 1.22 2011/01/27 23:11:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -46,6 +46,8 @@
 #define	VIDEFAULT
 #define	ANCHOR
 
+#include "histedit.h"
+#include "chartype.h"
 #include <stdio.h>
 #include <sys/types.h>
 
@@ -55,6 +57,10 @@
 #define	NO_TTY		0x02
 #define	EDIT_DISABLED	0x04
 #define	UNBUFFERED	0x08
+#define	CHARSET_IS_UTF8 0x10
+#define	IGNORE_EXTCHARS 0x20            /* Ignore characters read > 0xff */
+#define	NARROW_HISTORY	0x40
+#define	NARROW_READ	0x80
 
 typedef int bool_t;			/* True or not			*/
 
@@ -66,10 +72,10 @@ typedef struct coord_t {		/* Position on
 } coord_t;
 
 typedef struct el_line_t {
-	char	*buffer;		/* Input line			*/
-	char	*cursor;		/* Cursor position		*/
-	char	*lastchar;		/* Last character		*/
-	const char	*limit;		/* Max position			*/
+	Char 		*buffer;	/* Input line			*/
+	Char	        *cursor;	/* Cursor position		*/
+	Char	        *lastchar;	/* Last character		*/
+	const Char	*limit;		/* Max position			*/
 } el_line_t;
 
 /*
@@ -82,13 +88,12 @@ typedef struct el_state_t {
 	int		metanext;	/* Is the next char a meta char */
 	el_action_t	lastcmd;	/* Previous command		*/
 	el_action_t	thiscmd;	/* this command 		*/
-	char		thisch;		/* char that generated it	*/
+	Char		thisch;		/* char that generated it	*/
 } el_state_t;
 
 /*
  * Until we come up with something better...
  */
-#define	el_strdup(a)	strdup(a)
 #define	el_malloc(a)	malloc(a)
 #define	el_realloc(a,b)	realloc(a, b)
 #define	el_free(a)	free(a)
@@ -109,15 +114,18 @@ typedef struct el_state_t {
 #include "read.h"
 
 struct editline {
-	char		 *el_prog;	/* the program name		*/
+	Char		 *el_prog;	/* the program name		*/
 	FILE		 *el_infile;	/* Stdio stuff			*/
 	FILE		 *el_outfile;	/* Stdio stuff			*/
 	FILE		 *el_errfile;	/* Stdio stuff			*/
 	int		  el_infd;	/* Input file descriptor	*/
+	int		  el_outfd;	/* Output file descriptor	*/
+	int		  el_errfd;	/* Error file descriptor	*/
 	int		  el_flags;	/* Various flags.		*/
+	int		  el_errno;	/* Local copy of errno		*/
 	coord_t		  el_cursor;	/* Cursor location		*/
-	char		**el_display;	/* Real screen image = what is there */
-	char		**el_vdisplay;	/* Virtual screen image = what we see */
+	Char		**el_display;	/* Real screen image = what is there */
+	Char		**el_vdisplay;	/* Virtual screen image = what we see */
 	void		 *el_data;	/* Client data			*/
 	el_line_t	  el_line;	/* The current line information	*/
 	el_state_t	  el_state;	/* Current editor state		*/
@@ -133,9 +141,14 @@ struct editline {
 	el_search_t	  el_search;	/* Search stuff			*/
 	el_signal_t	  el_signal;	/* Signal handling stuff	*/
 	el_read_t	  el_read;	/* Character reading stuff	*/
+#ifdef WIDECHAR
+	ct_buffer_t       el_scratch;   /* Scratch conversion buffer    */
+	ct_buffer_t       el_lgcyconv;  /* Buffer for legacy wrappers   */
+	LineInfo          el_lgcylinfo; /* Legacy LineInfo buffer       */
+#endif
 };
 
-protected int	el_editmode(EditLine *, int, const char **);
+protected int	el_editmode(EditLine *, int, const Char **);
 
 /* XXXMYSQL: Bug#23097 mysql can't insert korean on mysql prompt. */
 #define el_isprint(x)	((unsigned char) (x) < 0x80 ? isprint(x) : 1)

=== modified file 'cmd-line-utils/libedit/el_term.h'
--- a/cmd-line-utils/libedit/el_term.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/el_term.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: term.h,v 1.19 2008/09/10 15:45:37 christos Exp $	*/
+/*	$NetBSD: term.h,v 1.21 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -43,7 +43,7 @@
 #include "histedit.h"
 
 typedef struct {		/* Symbolic function key bindings	*/
-	const char	*name;	/* name of the key			*/
+	const Char	*name;	/* name of the key			*/
 	int		 key;	/* Index in termcap table		*/
 	key_value_t	 fun;	/* Function bound to it			*/
 	int		 type;	/* Type of function			*/
@@ -84,8 +84,8 @@ typedef struct {
 protected void	term_move_to_line(EditLine *, int);
 protected void	term_move_to_char(EditLine *, int);
 protected void	term_clear_EOL(EditLine *, int);
-protected void	term_overwrite(EditLine *, const char *, int);
-protected void	term_insertwrite(EditLine *, char *, int);
+protected void	term_overwrite(EditLine *, const Char *, size_t);
+protected void	term_insertwrite(EditLine *, Char *, int);
 protected void	term_deletechars(EditLine *, int);
 protected void	term_clear_screen(EditLine *);
 protected void	term_beep(EditLine *);
@@ -93,18 +93,18 @@ protected int	term_change_size(EditLine 
 protected int	term_get_size(EditLine *, int *, int *);
 protected int	term_init(EditLine *);
 protected void	term_bind_arrow(EditLine *);
-protected void	term_print_arrow(EditLine *, const char *);
-protected int	term_clear_arrow(EditLine *, const char *);
-protected int	term_set_arrow(EditLine *, const char *, key_value_t *, int);
+protected void	term_print_arrow(EditLine *, const Char *);
+protected int	term_clear_arrow(EditLine *, const Char *);
+protected int	term_set_arrow(EditLine *, const Char *, key_value_t *, int);
 protected void	term_end(EditLine *);
 protected void	term_get(EditLine *, const char **);
 protected int	term_set(EditLine *, const char *);
-protected int	term_settc(EditLine *, int, const char **);
+protected int	term_settc(EditLine *, int, const Char **);
 protected int	term_gettc(EditLine *, int, char **);
-protected int	term_telltc(EditLine *, int, const char **);
-protected int	term_echotc(EditLine *, int, const char **);
-protected void	term_writec(EditLine *, int);
-protected int	term__putc(EditLine *, int);
+protected int	term_telltc(EditLine *, int, const Char **);
+protected int	term_echotc(EditLine *, int, const Char **);
+protected void	term_writec(EditLine *, Int);
+protected int	term__putc(EditLine *, Int);
 protected void	term__flush(EditLine *);
 
 /*

=== added file 'cmd-line-utils/libedit/eln.c'
--- a/cmd-line-utils/libedit/eln.c	1970-01-01 00:00:00 +0000
+++ b/cmd-line-utils/libedit/eln.c	2011-04-17 13:40:20 +0000
@@ -0,0 +1,370 @@
+/*	$NetBSD: eln.c,v 1.9 2010/11/04 13:53:12 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#endif /* not lint && not SCCSID */
+
+#include "histedit.h"
+#include "el.h"
+#include "read.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+public int
+el_getc(EditLine *el, char *cp)
+{
+	int num_read;
+	wchar_t wc = 0;
+
+	if (!(el->el_flags & CHARSET_IS_UTF8))
+		el->el_flags |= IGNORE_EXTCHARS;
+	num_read = el_wgetc (el, &wc);
+	if (!(el->el_flags & CHARSET_IS_UTF8))
+		el->el_flags &= ~IGNORE_EXTCHARS;
+
+	if (num_read > 0)
+		*cp = (unsigned char)wc;
+	return num_read;
+}
+
+
+public void
+el_push(EditLine *el, const char *str)
+{
+	/* Using multibyte->wide string decoding works fine under single-byte
+	 * character sets too, and Does The Right Thing. */
+	el_wpush(el, ct_decode_string(str, &el->el_lgcyconv));
+}
+
+
+public const char *
+el_gets(EditLine *el, int *nread)
+{
+	const wchar_t *tmp;
+
+	el->el_flags |= IGNORE_EXTCHARS;
+	tmp = el_wgets(el, nread);
+	el->el_flags &= ~IGNORE_EXTCHARS;
+	return ct_encode_string(tmp, &el->el_lgcyconv);
+}
+
+
+public int
+el_parse(EditLine *el, int argc, const char *argv[])
+{
+	int ret;
+	const wchar_t **wargv;
+
+	wargv = (const wchar_t **)
+	    ct_decode_argv(argc, argv, &el->el_lgcyconv);
+	if (!wargv)
+		return -1;
+	ret = el_wparse(el, argc, wargv);
+	ct_free_argv(wargv);
+
+	return ret;
+}
+
+
+public int
+el_set(EditLine *el, int op, ...)
+{
+	va_list ap;
+	int ret;
+
+	if (!el)
+		return -1;
+	va_start(ap, op);
+
+	switch (op) {
+	case EL_PROMPT:         /* el_pfunc_t */
+	case EL_RPROMPT: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+		ret = prompt_set(el, p, 0, op, 0);
+		break;
+	}
+
+	case EL_RESIZE: {
+		el_zfunc_t p = va_arg(ap, el_zfunc_t);
+		void *arg = va_arg(ap, void *);
+		ret = ch_resizefun(el, p, arg);
+		break;
+	}
+
+	case EL_TERMINAL:       /* const char * */
+		ret = el_wset(el, op, va_arg(ap, char *));
+		break;
+
+	case EL_EDITOR:		/* const wchar_t * */
+		ret = el_wset(el, op, ct_decode_string(va_arg(ap, char *),
+		    &el->el_lgcyconv));
+		break;
+
+	case EL_SIGNAL:         /* int */
+	case EL_EDITMODE:
+	case EL_UNBUFFERED:
+	case EL_PREP_TERM:
+		ret = el_wset(el, op, va_arg(ap, int));
+		break;
+
+	case EL_BIND:   /* const char * list -> const wchar_t * list */
+	case EL_TELLTC:
+	case EL_SETTC:
+	case EL_ECHOTC:
+	case EL_SETTY: {
+		const char *argv[20];
+		int i;
+		const wchar_t **wargv;
+		for (i = 1; i < (int)__arraycount(argv); ++i)
+			if ((argv[i] = va_arg(ap, char *)) == NULL)
+			    break;
+		argv[0] = NULL;
+		wargv = (const wchar_t **)
+		    ct_decode_argv(i, argv, &el->el_lgcyconv);
+		if (!wargv) {
+		    ret = -1;
+		    goto out;
+		}
+		/*
+		 * AFAIK we can't portably pass through our new wargv to
+		 * el_wset(), so we have to reimplement the body of
+		 * el_wset() for these ops.
+		 */
+		switch (op) {
+		case EL_BIND:
+			wargv[0] = STR("bind");
+			ret = map_bind(el, i, wargv);
+			break;
+		case EL_TELLTC:
+			wargv[0] = STR("telltc");
+			ret = term_telltc(el, i, wargv);
+			break;
+		case EL_SETTC:
+			wargv[0] = STR("settc");
+			ret = term_settc(el, i, wargv);
+			break;
+		case EL_ECHOTC:
+			wargv[0] = STR("echotc");
+			ret = term_echotc(el, i, wargv);
+			break;
+		case EL_SETTY:
+			wargv[0] = STR("setty");
+			ret = tty_stty(el, i, wargv);
+			break;
+		default:
+			ret = -1;
+		}
+		ct_free_argv(wargv);
+		break;
+	}
+
+	/* XXX: do we need to change el_func_t too? */
+	case EL_ADDFN: {          /* const char *, const char *, el_func_t */
+		const char *args[2];
+		el_func_t func;
+		wchar_t **wargv;
+
+		args[0] = va_arg(ap, const char *);
+		args[1] = va_arg(ap, const char *);
+		func = va_arg(ap, el_func_t);
+
+		wargv = ct_decode_argv(2, args, &el->el_lgcyconv);
+		if (!wargv) {
+		    ret = -1;
+		    goto out;
+		}
+		// XXX: The two strdup's leak
+		ret = map_addfunc(el, Strdup(wargv[0]), Strdup(wargv[1]),
+		    func);
+		ct_free_argv(wargv);
+		break;
+	}
+	case EL_HIST: {           /* hist_fun_t, const char * */
+		hist_fun_t fun = va_arg(ap, hist_fun_t);
+		ptr_t ptr = va_arg(ap, ptr_t);
+		ret = hist_set(el, fun, ptr);
+		el->el_flags |= NARROW_HISTORY;
+		break;
+	}
+	/* XXX: do we need to change el_rfunc_t? */
+	case EL_GETCFN:         /* el_rfunc_t */
+		ret = el_wset(el, op, va_arg(ap, el_rfunc_t));
+		el->el_flags |= NARROW_READ;
+		break;
+	case EL_CLIENTDATA:     /* void * */
+		ret = el_wset(el, op, va_arg(ap, void *));
+		break;
+	case EL_SETFP: {          /* int, FILE * */
+		int what = va_arg(ap, int);
+		FILE *fp = va_arg(ap, FILE *);
+		ret = el_wset(el, op, what, fp);
+		break;
+	}
+	case EL_PROMPT_ESC: /* el_pfunc_t, char */
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t p = va_arg(ap, el_pfunc_t);
+		char c = va_arg(ap, int);
+		ret = prompt_set(el, p, c, op, 0);
+		break;
+	}
+	default:
+		ret = -1;
+		break;
+	}
+
+out:
+	va_end(ap);
+	return ret;
+}
+
+
+public int
+el_get(EditLine *el, int op, ...)
+{
+	va_list ap;
+	int ret;
+
+	if (!el)
+		return -1;
+
+	va_start(ap, op);
+
+	switch (op) {
+	case EL_PROMPT:         /* el_pfunc_t * */
+	case EL_RPROMPT: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		ret = prompt_get(el, p, 0, op);
+		break;
+	}
+
+	case EL_PROMPT_ESC: /* el_pfunc_t *, char **/
+	case EL_RPROMPT_ESC: {
+		el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+		char *c = va_arg(ap, char *);
+		wchar_t wc;
+		ret = prompt_get(el, p, &wc, op);
+		*c = (unsigned char)wc;
+		break;
+	}
+
+	case EL_EDITOR: {
+		const char **p = va_arg(ap, const char **);
+		const wchar_t *pw;
+		ret = el_wget(el, op, &pw);
+		*p = ct_encode_string(pw, &el->el_lgcyconv);
+		if (!el->el_lgcyconv.csize)
+			ret = -1;
+		break;
+	}
+
+	case EL_TERMINAL:       /* const char ** */
+		ret = el_wget(el, op, va_arg(ap, const char **));
+		break;
+
+	case EL_SIGNAL:         /* int * */
+	case EL_EDITMODE:
+	case EL_UNBUFFERED:
+	case EL_PREP_TERM:
+		ret = el_wget(el, op, va_arg(ap, int *));
+		break;
+
+	case EL_GETTC: {
+		char *argv[20];
+		static char gettc[] = "gettc";
+		int i;
+		for (i = 1; i < (int)__arraycount(argv); ++i)
+			if ((argv[i] = va_arg(ap, char *)) == NULL)
+				break;
+		argv[0] = gettc;
+		ret = term_gettc(el, i, argv);
+		break;
+	}
+
+	/* XXX: do we need to change el_rfunc_t? */
+	case EL_GETCFN:         /* el_rfunc_t */
+		ret = el_wget(el, op, va_arg(ap, el_rfunc_t *));
+		break;
+
+	case EL_CLIENTDATA:     /* void ** */
+		ret = el_wget(el, op, va_arg(ap, void **));
+		break;
+
+	case EL_GETFP: {          /* int, FILE ** */
+		int what = va_arg(ap, int);
+		FILE **fpp = va_arg(ap, FILE **);
+		ret = el_wget(el, op, what, fpp);
+		break;
+	}
+
+	default:
+		ret = -1;
+		break;
+	}
+
+	va_end(ap);
+	return ret;
+}
+
+
+const LineInfo *
+el_line(EditLine *el)
+{
+	const LineInfoW *winfo = el_wline(el);
+	LineInfo *info = &el->el_lgcylinfo;
+	size_t offset;
+	const Char *p;
+
+	info->buffer   = ct_encode_string(winfo->buffer, &el->el_lgcyconv);
+
+	offset = 0;
+	for (p = winfo->buffer; p < winfo->cursor; p++)
+		offset += ct_enc_width(*p);
+	info->cursor = info->buffer + offset;
+
+	offset = 0;
+	for (p = winfo->buffer; p < winfo->lastchar; p++)
+		offset += ct_enc_width(*p);
+	info->lastchar = info->buffer + offset;
+
+	return info;
+}
+
+
+int
+el_insertstr(EditLine *el, const char *str)
+{
+	return el_winsertstr(el, ct_decode_string(str, &el->el_lgcyconv));
+}

=== modified file 'cmd-line-utils/libedit/emacs.c'
--- a/cmd-line-utils/libedit/emacs.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/emacs.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: emacs.c,v 1.21 2006/03/06 21:11:56 christos Exp $	*/
+/*	$NetBSD: emacs.c,v 1.23 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -51,7 +51,7 @@ static char sccsid[] = "@(#)emacs.c	8.1 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_delete_or_list(EditLine *el, int c)
+em_delete_or_list(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar) {
@@ -87,9 +87,9 @@ em_delete_or_list(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-em_delete_next_word(EditLine *el, int c __attribute__((__unused__)))
+em_delete_next_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *p, *kp;
+	Char *cp, *p, *kp;
 
 	if (el->el_line.cursor == el->el_line.lastchar)
 		return (CC_ERROR);
@@ -102,7 +102,7 @@ em_delete_next_word(EditLine *el, int c 
 		*kp++ = *p;
 	el->el_chared.c_kill.last = kp;
 
-	c_delafter(el, cp - el->el_line.cursor);	/* delete after dot */
+	c_delafter(el, (int)(cp - el->el_line.cursor));	/* delete after dot */
 	if (el->el_line.cursor > el->el_line.lastchar)
 		el->el_line.cursor = el->el_line.lastchar;
 				/* bounds check */
@@ -116,9 +116,9 @@ em_delete_next_word(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_yank(EditLine *el, int c __attribute__((__unused__)))
+em_yank(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf)
 		return (CC_NORM);
@@ -132,7 +132,8 @@ em_yank(EditLine *el, int c __attribute_
 	cp = el->el_line.cursor;
 
 	/* open the space, */
-	c_insert(el, el->el_chared.c_kill.last - el->el_chared.c_kill.buf);
+	c_insert(el,
+	    (int)(el->el_chared.c_kill.last - el->el_chared.c_kill.buf));
 	/* copy the chars */
 	for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++)
 		*cp++ = *kp;
@@ -151,9 +152,9 @@ em_yank(EditLine *el, int c __attribute_
  */
 protected el_action_t
 /*ARGSUSED*/
-em_kill_line(EditLine *el, int c __attribute__((__unused__)))
+em_kill_line(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	cp = el->el_line.buffer;
 	kp = el->el_chared.c_kill.buf;
@@ -173,9 +174,9 @@ em_kill_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-em_kill_region(EditLine *el, int c __attribute__((__unused__)))
+em_kill_region(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	if (!el->el_chared.c_kill.mark)
 		return (CC_ERROR);
@@ -186,14 +187,14 @@ em_kill_region(EditLine *el, int c __att
 		while (cp < el->el_chared.c_kill.mark)
 			*kp++ = *cp++;	/* copy it */
 		el->el_chared.c_kill.last = kp;
-		c_delafter(el, cp - el->el_line.cursor);
+		c_delafter(el, (int)(cp - el->el_line.cursor));
 	} else {		/* mark is before cursor */
 		cp = el->el_chared.c_kill.mark;
 		kp = el->el_chared.c_kill.buf;
 		while (cp < el->el_line.cursor)
 			*kp++ = *cp++;	/* copy it */
 		el->el_chared.c_kill.last = kp;
-		c_delbefore(el, cp - el->el_chared.c_kill.mark);
+		c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark));
 		el->el_line.cursor = el->el_chared.c_kill.mark;
 	}
 	return (CC_REFRESH);
@@ -206,9 +207,9 @@ em_kill_region(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-em_copy_region(EditLine *el, int c __attribute__((__unused__)))
+em_copy_region(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	if (!el->el_chared.c_kill.mark)
 		return (CC_ERROR);
@@ -235,7 +236,7 @@ em_copy_region(EditLine *el, int c __att
  *	Gosling emacs transpose chars [^T]
  */
 protected el_action_t
-em_gosmacs_transpose(EditLine *el, int c)
+em_gosmacs_transpose(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor > &el->el_line.buffer[1]) {
@@ -255,7 +256,7 @@ em_gosmacs_transpose(EditLine *el, int c
  */
 protected el_action_t
 /*ARGSUSED*/
-em_next_word(EditLine *el, int c __attribute__((__unused__)))
+em_next_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 	if (el->el_line.cursor == el->el_line.lastchar)
 		return (CC_ERROR);
@@ -280,16 +281,16 @@ em_next_word(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-em_upper_case(EditLine *el, int c __attribute__((__unused__)))
+em_upper_case(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *ep;
+	Char *cp, *ep;
 
 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
 	    el->el_state.argument, ce__isword);
 
 	for (cp = el->el_line.cursor; cp < ep; cp++)
-		if (islower((unsigned char)*cp))
-			*cp = toupper((unsigned char)*cp);
+		if (Islower(*cp))
+			*cp = Toupper(*cp);
 
 	el->el_line.cursor = ep;
 	if (el->el_line.cursor > el->el_line.lastchar)
@@ -304,24 +305,24 @@ em_upper_case(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-em_capitol_case(EditLine *el, int c __attribute__((__unused__)))
+em_capitol_case(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *ep;
+	Char *cp, *ep;
 
 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
 	    el->el_state.argument, ce__isword);
 
 	for (cp = el->el_line.cursor; cp < ep; cp++) {
-		if (isalpha((unsigned char)*cp)) {
-			if (islower((unsigned char)*cp))
-				*cp = toupper((unsigned char)*cp);
+		if (Isalpha(*cp)) {
+			if (Islower(*cp))
+				*cp = Toupper(*cp);
 			cp++;
 			break;
 		}
 	}
 	for (; cp < ep; cp++)
-		if (isupper((unsigned char)*cp))
-			*cp = tolower((unsigned char)*cp);
+		if (Isupper(*cp))
+			*cp = Tolower(*cp);
 
 	el->el_line.cursor = ep;
 	if (el->el_line.cursor > el->el_line.lastchar)
@@ -336,16 +337,16 @@ em_capitol_case(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-em_lower_case(EditLine *el, int c __attribute__((__unused__)))
+em_lower_case(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *ep;
+	Char *cp, *ep;
 
 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
 	    el->el_state.argument, ce__isword);
 
 	for (cp = el->el_line.cursor; cp < ep; cp++)
-		if (isupper((unsigned char)*cp))
-			*cp = tolower((unsigned char)*cp);
+		if (Isupper(*cp))
+			*cp = Tolower(*cp);
 
 	el->el_line.cursor = ep;
 	if (el->el_line.cursor > el->el_line.lastchar)
@@ -360,7 +361,7 @@ em_lower_case(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-em_set_mark(EditLine *el, int c __attribute__((__unused__)))
+em_set_mark(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_chared.c_kill.mark = el->el_line.cursor;
@@ -374,9 +375,9 @@ em_set_mark(EditLine *el, int c __attrib
  */
 protected el_action_t
 /*ARGSUSED*/
-em_exchange_mark(EditLine *el, int c __attribute__((__unused__)))
+em_exchange_mark(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp;
+	Char *cp;
 
 	cp = el->el_line.cursor;
 	el->el_line.cursor = el->el_chared.c_kill.mark;
@@ -391,7 +392,7 @@ em_exchange_mark(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-em_universal_argument(EditLine *el, int c __attribute__((__unused__)))
+em_universal_argument(EditLine *el, Int c __attribute__((__unused__)))
 {				/* multiply current argument by 4 */
 
 	if (el->el_state.argument > 1000000)
@@ -408,7 +409,7 @@ em_universal_argument(EditLine *el, int 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_meta_next(EditLine *el, int c __attribute__((__unused__)))
+em_meta_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_state.metanext = 1;
@@ -421,7 +422,7 @@ em_meta_next(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-em_toggle_overwrite(EditLine *el, int c __attribute__((__unused__)))
+em_toggle_overwrite(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ?
@@ -435,9 +436,9 @@ em_toggle_overwrite(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-em_copy_prev_word(EditLine *el, int c __attribute__((__unused__)))
+em_copy_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *cp, *oldc, *dp;
+	Char *cp, *oldc, *dp;
 
 	if (el->el_line.cursor == el->el_line.buffer)
 		return (CC_ERROR);
@@ -447,7 +448,7 @@ em_copy_prev_word(EditLine *el, int c __
 	cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
 	    el->el_state.argument, ce__isword);
 
-	c_insert(el, oldc - cp);
+	c_insert(el, (int)(oldc - cp));
 	for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++)
 		*dp++ = *cp;
 
@@ -462,7 +463,7 @@ em_copy_prev_word(EditLine *el, int c __
  */
 protected el_action_t
 /*ARGSUSED*/
-em_inc_search_next(EditLine *el, int c __attribute__((__unused__)))
+em_inc_search_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_search.patlen = 0;
@@ -475,7 +476,7 @@ em_inc_search_next(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-em_inc_search_prev(EditLine *el, int c __attribute__((__unused__)))
+em_inc_search_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_search.patlen = 0;
@@ -489,7 +490,7 @@ em_inc_search_prev(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-em_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
+em_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor <= el->el_line.buffer)

=== modified file 'cmd-line-utils/libedit/filecomplete.c'
--- a/cmd-line-utils/libedit/filecomplete.c	2010-10-19 22:51:34 +0000
+++ b/cmd-line-utils/libedit/filecomplete.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: filecomplete.c,v 1.13 2009/01/26 17:32:41 apb Exp $	*/
+/*	$NetBSD: filecomplete.c,v 1.23 2010/12/06 00:05:38 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -78,8 +78,8 @@ extern char *alloca ();
 #include "histedit.h"
 #include "filecomplete.h"
 
-static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
-    '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
+static const Char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@',
+    '$', '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
 
 
 /********************************/
@@ -95,9 +95,11 @@ static char break_chars[] = { ' ', '\t',
 char *
 fn_tilde_expand(const char *txt)
 {
+        /* XXXMYSQL : warning: unused variable ‘pwbuf’ & 'pwres'. */
 	struct passwd *pass;
 	char *temp;
 	size_t len = 0;
+	//char pwbuf[1024];
 
 	if (txt[0] != '~')
 		return (strdup(txt));
@@ -163,20 +165,24 @@ fn_filename_completion_function(const ch
 			nptr = realloc(filename, strlen(temp) + 1);
 			if (nptr == NULL) {
 				free(filename);
+				filename = NULL;
 				return NULL;
 			}
 			filename = nptr;
 			(void)strcpy(filename, temp);
 			len = temp - text;	/* including last slash */
+
 			nptr = realloc(dirname, len + 1);
 			if (nptr == NULL) {
-				free(filename);
+				free(dirname);
+				dirname = NULL;
 				return NULL;
 			}
 			dirname = nptr;
 			(void)strncpy(dirname, text, len);
 			dirname[len] = '\0';
 		} else {
+			free(filename);
 			if (*text == 0)
 				filename = NULL;
 			else {
@@ -184,6 +190,7 @@ fn_filename_completion_function(const ch
 				if (filename == NULL)
 					return NULL;
 			}
+			free(dirname);
 			dirname = NULL;
 		}
 
@@ -193,12 +200,14 @@ fn_filename_completion_function(const ch
 		}
 
 		/* support for ``~user'' syntax */
-		free(dirpath);
 
-		if (dirname == NULL && (dirname = strdup("./")) == NULL)
-			return NULL;
-
-		if (*dirname == '~')
+		free(dirpath);
+		dirpath = NULL;
+		if (dirname == NULL) {
+			if ((dirname = strdup("")) == NULL)
+				return NULL;
+			dirpath = strdup("./");
+		} else if (*dirname == '~')
 			dirpath = fn_tilde_expand(dirname);
 		else
 			dirpath = strdup(dirname);
@@ -348,37 +357,47 @@ _fn_qsort_string_compare(const void *i1,
 
 /*
  * Display list of strings in columnar format on readline's output stream.
- * 'matches' is list of strings, 'len' is number of strings in 'matches',
- * 'max' is maximum length of string in 'matches'.
+ * 'matches' is list of strings, 'num' is number of strings in 'matches',
+ * 'width' is maximum length of string in 'matches'.
+ *
+ * matches[0] is not one of the match strings, but it is counted in
+ * num, so the strings are matches[1] *through* matches[num-1].
  */
 void
-fn_display_match_list (EditLine *el, char **matches, int len, int max)
+fn_display_match_list (EditLine *el, char **matches, size_t num, size_t width)
 {
-	int i, idx, limit, count;
+	size_t line, lines, col, cols, thisguy;
 	int screenwidth = el->el_term.t_size.h;
 
+	/* Ignore matches[0]. Avoid 1-based array logic below. */
+	matches++;
+	num--;
+
+	/*
+	 * Find out how many entries can be put on one line; count
+	 * with one space between strings the same way it's printed.
+	 */
+	cols = screenwidth / (width + 1);
+	if (cols == 0)
+		cols = 1;
+
+	/* how many lines of output, rounded up */
+	lines = (num + cols - 1) / cols;
+
+	/* Sort the items. */
+	qsort(matches, num, sizeof(char *), _fn_qsort_string_compare);
+
 	/*
-	 * Find out how many entries can be put on one line, count
-	 * with two spaces between strings.
+	 * On the ith line print elements i, i+lines, i+lines*2, etc.
 	 */
-	limit = screenwidth / (max + 2);
-	if (limit == 0)
-		limit = 1;
-
-	/* how many lines of output */
-	count = len / limit;
-	if (count * limit < len)
-		count++;
-
-	/* Sort the items if they are not already sorted. */
-	qsort(&matches[1], (size_t)(len - 1), sizeof(char *),
-	    _fn_qsort_string_compare);
-
-	idx = 1;
-	for(; count > 0; count--) {
-		for(i = 0; i < limit && matches[idx]; i++, idx++)
-			(void)fprintf(el->el_outfile, "%-*s  ", max,
-			    matches[idx]);
+	for (line = 0; line < lines; line++) {
+		for (col = 0; col < cols; col++) {
+			thisguy = line + col * lines;
+			if (thisguy >= num)
+				break;
+			(void)fprintf(el->el_outfile, "%s%-*s",
+			    col == 0 ? "" : " ", (int)width, matches[thisguy]);
+		}
 		(void)fprintf(el->el_outfile, "\n");
 	}
 }
@@ -399,13 +418,14 @@ int
 fn_complete(EditLine *el,
 	char *(*complet_func)(const char *, int),
 	char **(*attempted_completion_function)(const char *, int, int),
-	const char *word_break, const char *special_prefixes,
-	const char *(*app_func)(const char *), int query_items,
+	const Char *word_break, const Char *special_prefixes,
+	const char *(*app_func)(const char *), size_t query_items,
 	int *completion_type, int *over, int *point, int *end)
 {
-	const LineInfo *li;
-	char *temp, **matches;
-	const char *ctemp;
+	const TYPE(LineInfo) *li;
+	Char *temp;
+        char **matches;
+	const Char *ctemp;
 	size_t len;
 	int what_to_do = '\t';
 	int retval = CC_NORM;
@@ -423,45 +443,45 @@ fn_complete(EditLine *el,
 		app_func = append_char_function;
 
 	/* We now look backwards for the start of a filename/variable word */
-	li = el_line(el);
-	ctemp = (const char *) li->cursor;
+	li = FUN(el,line)(el);
+	ctemp = li->cursor;
 	while (ctemp > li->buffer
-	    && !strchr(word_break, ctemp[-1])
-	    && (!special_prefixes || !strchr(special_prefixes, ctemp[-1]) ) )
+	    && !Strchr(word_break, ctemp[-1])
+	    && (!special_prefixes || !Strchr(special_prefixes, ctemp[-1]) ) )
 		ctemp--;
 
 	len = li->cursor - ctemp;
 #if defined(__SSP__) || defined(__SSP_ALL__)
-	temp = malloc(len + 1);
+	temp = malloc(sizeof(*temp) * (len + 1));
 #else
-	temp = alloca(len + 1);
+	temp = alloca(sizeof(*temp) * (len + 1));
 #endif
-	(void)strncpy(temp, ctemp, len);
+	(void)Strncpy(temp, ctemp, len);
 	temp[len] = '\0';
 
 	/* these can be used by function called in completion_matches() */
 	/* or (*attempted_completion_function)() */
 	if (point != 0)
-		*point = li->cursor - li->buffer;
+		*point = (int)(li->cursor - li->buffer);
 	if (end != NULL)
-		*end = li->lastchar - li->buffer;
+		*end = (int)(li->lastchar - li->buffer);
 
 	if (attempted_completion_function) {
-		int cur_off = li->cursor - li->buffer;
-		matches = (*attempted_completion_function) (temp,
+		int cur_off = (int)(li->cursor - li->buffer);
+		matches = (*attempted_completion_function) (ct_encode_string(temp, &el->el_scratch),
 		    (int)(cur_off - len), cur_off);
 	} else
 		matches = 0;
 	if (!attempted_completion_function || 
 	    (over != NULL && !*over && !matches))
-		matches = completion_matches(temp, complet_func);
+		matches = completion_matches(ct_encode_string(temp, &el->el_scratch), complet_func);
 
 	if (over != NULL)
 		*over = 0;
 
 	if (matches) {
 		int i;
-		int matches_num, maxlen, match_len, match_display=1;
+		size_t matches_num, maxlen, match_len, match_display=1;
 
 		retval = CC_REFRESH;
 		/*
@@ -470,7 +490,8 @@ fn_complete(EditLine *el,
 		 */
 		if (matches[0][0] != '\0') {
 			el_deletestr(el, (int) len);
-			el_insertstr(el, matches[0]);
+			FUN(el,insertstr)(el,
+			    ct_decode_string(matches[0], &el->el_scratch));
 		}
 
 		if (what_to_do == '?')
@@ -482,7 +503,9 @@ fn_complete(EditLine *el,
 			 * it, unless we do filename completion and the
 			 * object is a directory.
 			 */
-			el_insertstr(el, (*app_func)(matches[0])); 
+			FUN(el,insertstr)(el,
+			    ct_decode_string((*app_func)(matches[0]),
+			    &el->el_scratch));
 		} else if (what_to_do == '!') {
     display_matches:
 			/*
@@ -490,11 +513,12 @@ fn_complete(EditLine *el,
 			 * matches.
 			 */
 
-			for(i=1, maxlen=0; matches[i]; i++) {
+			for(i = 1, maxlen = 0; matches[i]; i++) {
 				match_len = strlen(matches[i]);
 				if (match_len > maxlen)
 					maxlen = match_len;
 			}
+			/* matches[1] through matches[i-1] are available */
 			matches_num = i - 1;
 				
 			/* newline to get on next line from command line */
@@ -506,7 +530,7 @@ fn_complete(EditLine *el,
 			 */
 			if (matches_num > query_items) {
 				(void)fprintf(el->el_outfile,
-				    "Display all %d possibilities? (y or n) ",
+				    "Display all %zu possibilities? (y or n) ",
 				    matches_num);
 				(void)fflush(el->el_outfile);
 				if (getc(stdin) != 'y')
@@ -514,9 +538,17 @@ fn_complete(EditLine *el,
 				(void)fprintf(el->el_outfile, "\n");
 			}
 
-			if (match_display)
-				fn_display_match_list(el, matches, matches_num,
-					maxlen);
+			if (match_display) {
+				/*
+				 * Interface of this function requires the
+				 * strings be matches[1..num-1] for compat.
+				 * We have matches_num strings not counting
+				 * the prefix in matches[0], so we need to
+				 * add 1 to matches_num for the call.
+				 */
+				fn_display_match_list(el, matches,
+				    matches_num+1, maxlen);
+			}
 			retval = CC_REDISPLAY;
 		} else if (matches[0][0]) {
 			/*

=== modified file 'cmd-line-utils/libedit/filecomplete.h'
--- a/cmd-line-utils/libedit/filecomplete.h	2009-04-30 11:53:30 +0000
+++ b/cmd-line-utils/libedit/filecomplete.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: filecomplete.h,v 1.6 2008/04/29 06:53:01 martin Exp $	*/
+/*	$NetBSD: filecomplete.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -34,10 +34,10 @@
 int fn_complete(EditLine *,
     char *(*)(const char *, int),
     char **(*)(const char *, int, int),
-    const char *, const char *, const char *(*)(const char *), int,
+    const Char *, const Char *, const char *(*)(const char *), size_t,
     int *, int *, int *, int *);
 
-void fn_display_match_list(EditLine *, char **, int, int);
+void fn_display_match_list(EditLine *, char **, size_t, size_t);
 char *fn_tilde_expand(const char *);
 char *fn_filename_completion_function(const char *, int);
 

=== modified file 'cmd-line-utils/libedit/hist.c'
--- a/cmd-line-utils/libedit/hist.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/hist.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: hist.c,v 1.15 2003/11/01 23:36:39 christos Exp $	*/
+/*	$NetBSD: hist.c,v 1.17 2009/12/30 23:54:52 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -55,7 +55,7 @@ hist_init(EditLine *el)
 
 	el->el_history.fun = NULL;
 	el->el_history.ref = NULL;
-	el->el_history.buf = (char *) el_malloc(EL_BUFSIZ);
+	el->el_history.buf = el_malloc(EL_BUFSIZ * sizeof(*el->el_history.buf));
 	el->el_history.sz  = EL_BUFSIZ;
 	if (el->el_history.buf == NULL)
 		return (-1);
@@ -96,11 +96,11 @@ hist_set(EditLine *el, hist_fun_t fun, p
 protected el_action_t
 hist_get(EditLine *el)
 {
-	const char *hp;
+	const Char *hp;
 	int h;
 
 	if (el->el_history.eventno == 0) {	/* if really the current line */
-		(void) strncpy(el->el_line.buffer, el->el_history.buf,
+		(void) Strncpy(el->el_line.buffer, el->el_history.buf,
 		    el->el_history.sz);
 		el->el_line.lastchar = el->el_line.buffer +
 		    (el->el_history.last - el->el_history.buf);
@@ -127,9 +127,10 @@ hist_get(EditLine *el)
 			el->el_history.eventno = h;
 			return (CC_ERROR);
 		}
-	(void) strlcpy(el->el_line.buffer, hp,
+	(void) Strncpy(el->el_line.buffer, hp,
 			(size_t)(el->el_line.limit - el->el_line.buffer));
-	el->el_line.lastchar = el->el_line.buffer + strlen(el->el_line.buffer);
+	el->el_line.buffer[el->el_line.limit - el->el_line.buffer - 1] = '\0';
+	el->el_line.lastchar = el->el_line.buffer + Strlen(el->el_line.buffer);
 
 	if (el->el_line.lastchar > el->el_line.buffer
 	    && el->el_line.lastchar[-1] == '\n')
@@ -152,33 +153,33 @@ hist_get(EditLine *el)
  *	process a history command
  */
 protected int
-hist_command(EditLine *el, int argc, const char **argv)
+hist_command(EditLine *el, int argc, const Char **argv)
 {
-	const char *str;
+	const Char *str;
 	int num;
 	HistEvent ev;
 
 	if (el->el_history.ref == NULL)
 		return (-1);
 
-	if (argc == 1 || strcmp(argv[1], "list") == 0) {
+	if (argc == 1 || Strcmp(argv[1], STR("list")) == 0) {
 		 /* List history entries */
 
 		for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el))
 			(void) fprintf(el->el_outfile, "%d %s",
-			    el->el_history.ev.num, str);
+			    el->el_history.ev.num, ct_encode_string(str, &el->el_scratch));
 		return (0);
 	}
 
 	if (argc != 3)
 		return (-1);
 
-	num = (int)strtol(argv[2], NULL, 0);
+	num = (int)Strtol(argv[2], NULL, 0);
 
-	if (strcmp(argv[1], "size") == 0)
+	if (Strcmp(argv[1], STR("size")) == 0)
 		return history(el->el_history.ref, &ev, H_SETSIZE, num);
 
-	if (strcmp(argv[1], "unique") == 0)
+	if (Strcmp(argv[1], STR("unique")) == 0)
 		return history(el->el_history.ref, &ev, H_SETUNIQUE, num);
 
 	return -1;
@@ -192,13 +193,13 @@ protected int
 /*ARGSUSED*/
 hist_enlargebuf(EditLine *el, size_t oldsz, size_t newsz)
 {
-	char *newbuf;
+	Char *newbuf;
 
-	newbuf = realloc(el->el_history.buf, newsz);
+	newbuf = el_realloc(el->el_history.buf, newsz * sizeof(*newbuf));
 	if (!newbuf)
 		return 0;
 
-	(void) memset(&newbuf[oldsz], '\0', newsz - oldsz);
+	(void) memset(&newbuf[oldsz], '\0', (newsz - oldsz) * sizeof(*newbuf));
 
 	el->el_history.last = newbuf +
 				(el->el_history.last - el->el_history.buf);
@@ -207,3 +208,15 @@ hist_enlargebuf(EditLine *el, size_t old
 
 	return 1;
 }
+
+#ifdef WIDECHAR
+protected wchar_t *
+hist_convert(EditLine *el, int fn, ptr_t arg)
+{
+	HistEventW ev;
+	if ((*(el)->el_history.fun)((el)->el_history.ref, &ev, fn, arg) == -1)
+		return NULL;
+	return ct_decode_string((const char *)(const void *)ev.str,
+	    &el->el_scratch);
+}
+#endif

=== modified file 'cmd-line-utils/libedit/hist.h'
--- a/cmd-line-utils/libedit/hist.h	2005-04-21 10:06:46 +0000
+++ b/cmd-line-utils/libedit/hist.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: hist.h,v 1.10 2003/08/07 16:44:31 agc Exp $	*/
+/*	$NetBSD: hist.h,v 1.12 2009/12/30 23:54:52 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -42,21 +42,29 @@
 
 #include "histedit.h"
 
-typedef int (*hist_fun_t)(ptr_t, HistEvent *, int, ...);
+typedef int (*hist_fun_t)(ptr_t, TYPE(HistEvent) *, int, ...);
 
 typedef struct el_history_t {
-	char		*buf;		/* The history buffer		*/
+	Char		*buf;		/* The history buffer		*/
 	size_t		sz;		/* Size of history buffer	*/
-	char		*last;		/* The last character		*/
+	Char		*last;		/* The last character		*/
 	int		 eventno;	/* Event we are looking for	*/
 	ptr_t		 ref;		/* Argument for history fcns	*/
 	hist_fun_t	 fun;		/* Event access			*/
-	HistEvent	 ev;		/* Event cookie			*/
+	TYPE(HistEvent)	 ev;		/* Event cookie			*/
 } el_history_t;
 
-#define	HIST_FUN(el, fn, arg)	\
+#define	HIST_FUN_INTERNAL(el, fn, arg)	\
     ((((*(el)->el_history.fun) ((el)->el_history.ref, &(el)->el_history.ev, \
 	fn, arg)) == -1) ? NULL : (el)->el_history.ev.str)
+#ifdef WIDECHAR
+#define HIST_FUN(el, fn, arg) \
+    (((el)->el_flags & NARROW_HISTORY) ? hist_convert(el, fn, arg) : \
+	HIST_FUN_INTERNAL(el, fn, arg))
+#else
+#define HIST_FUN(el, fn, arg) HIST_FUN_INTERNAL(el, fn, arg)
+#endif
+
 
 #define	HIST_NEXT(el)		HIST_FUN(el, H_NEXT, NULL)
 #define	HIST_FIRST(el)		HIST_FUN(el, H_FIRST, NULL)
@@ -70,7 +78,10 @@ protected int		hist_init(EditLine *);
 protected void		hist_end(EditLine *);
 protected el_action_t	hist_get(EditLine *);
 protected int		hist_set(EditLine *, hist_fun_t, ptr_t);
-protected int		hist_command(EditLine *, int, const char **);
+protected int		hist_command(EditLine *, int, const Char **);
 protected int		hist_enlargebuf(EditLine *, size_t, size_t);
+#ifdef WIDECHAR
+protected wchar_t 	*hist_convert(EditLine *, int, ptr_t);
+#endif
 
 #endif /* _h_el_hist */

=== modified file 'cmd-line-utils/libedit/histedit.h'
--- a/cmd-line-utils/libedit/histedit.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/histedit.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: histedit.h,v 1.35 2009/02/05 19:15:44 christos Exp $	*/
+/*	$NetBSD: histedit.h,v 1.47 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -43,6 +43,8 @@
 #define	LIBEDIT_MAJOR 2
 #define	LIBEDIT_MINOR 11
 
+#include <stdint.h>
+
 #include <sys/types.h>
 #include <stdio.h>
 
@@ -114,29 +116,46 @@ unsigned char	_el_fn_complete(EditLine *
 
 /*
  * el_set/el_get parameters
- */
-#define	EL_PROMPT	0	/* , el_pfunc_t);		*/
-#define	EL_TERMINAL	1	/* , const char *);		*/
-#define	EL_EDITOR	2	/* , const char *);		*/
-#define	EL_SIGNAL	3	/* , int);			*/
-#define	EL_BIND		4	/* , const char *, ..., NULL);	*/
-#define	EL_TELLTC	5	/* , const char *, ..., NULL);	*/
-#define	EL_SETTC	6	/* , const char *, ..., NULL);	*/
-#define	EL_ECHOTC	7	/* , const char *, ..., NULL);	*/
-#define	EL_SETTY	8	/* , const char *, ..., NULL);	*/
-#define	EL_ADDFN	9	/* , const char *, const char *	*/
-				/* , el_func_t);		*/
-#define	EL_HIST		10	/* , hist_fun_t, const char *);	*/
-#define	EL_EDITMODE	11	/* , int);			*/
-#define	EL_RPROMPT	12	/* , el_pfunc_t);		*/
-#define	EL_GETCFN	13	/* , el_rfunc_t);		*/
-#define	EL_CLIENTDATA	14	/* , void *);			*/
-#define	EL_UNBUFFERED	15	/* , int);			*/
-#define	EL_PREP_TERM    16      /* , int);                      */
-#define	EL_GETTC	17	/* , const char *, ..., NULL);	*/
-#define	EL_GETFP	18	/* , int, FILE **);		*/
-#define	EL_SETFP	19	/* , int, FILE *);		*/
-#define EL_REFRESH	20	/* , void);			*/
+ *
+ * When using el_wset/el_wget (as opposed to el_set/el_get):
+ *   Char is wchar_t, otherwise it is char.
+ *   prompt_func is el_wpfunc_t, otherwise it is el_pfunc_t .
+
+ * Prompt function prototypes are:
+ *   typedef char    *(*el_pfunct_t)  (EditLine *);
+ *   typedef wchar_t *(*el_wpfunct_t) (EditLine *);
+ *
+ * For operations that support set or set/get, the argument types listed are for
+ * the "set" operation. For "get", each listed type must be a pointer.
+ * E.g. EL_EDITMODE takes an int when set, but an int* when get.
+ * 
+ * Operations that only support "get" have the correct argument types listed.
+ */
+#define	EL_PROMPT	0	/* , prompt_func);		      set/get */
+#define	EL_TERMINAL	1	/* , const char *);		      set/get */
+#define	EL_EDITOR	2	/* , const Char *);		      set/get */
+#define	EL_SIGNAL	3	/* , int);			      set/get */
+#define	EL_BIND		4	/* , const Char *, ..., NULL);	      set     */
+#define	EL_TELLTC	5	/* , const Char *, ..., NULL);	      set     */
+#define	EL_SETTC	6	/* , const Char *, ..., NULL);	      set     */
+#define	EL_ECHOTC	7	/* , const Char *, ..., NULL);        set     */
+#define	EL_SETTY	8	/* , const Char *, ..., NULL);        set     */
+#define	EL_ADDFN	9	/* , const Char *, const Char,        set     */
+				/*   el_func_t);		 	      */
+#define	EL_HIST		10	/* , hist_fun_t, const ptr_t);	      set     */
+#define	EL_EDITMODE	11	/* , int);			      set/get */
+#define	EL_RPROMPT	12	/* , prompt_func);		      set/get */
+#define	EL_GETCFN	13	/* , el_rfunc_t);		      set/get */
+#define	EL_CLIENTDATA	14	/* , void *);			      set/get */
+#define	EL_UNBUFFERED	15	/* , int);			      set/get */
+#define	EL_PREP_TERM	16	/* , int);			      set     */
+#define	EL_GETTC	17	/* , const Char *, ..., NULL);		  get */
+#define	EL_GETFP	18	/* , int, FILE **);		          get */
+#define	EL_SETFP	19	/* , int, FILE *);		      set     */
+#define	EL_REFRESH	20	/* , void);			      set     */
+#define	EL_PROMPT_ESC	21	/* , prompt_func, Char);	      set/get */
+#define	EL_RPROMPT_ESC	22	/* , prompt_func, Char);	      set/get */
+#define	EL_RESIZE	23	/* , el_zfunc_t, void *);	      set     */
 
 #define	EL_BUILTIN_GETCFN	(NULL)
 
@@ -188,12 +207,12 @@ int		history(History *, HistEvent *, int
 #define	H_NEXT		 6	/* , void);		*/
 #define	H_CURR		 8	/* , const int);	*/
 #define	H_SET		 7	/* , int);		*/
-#define	H_ADD		 9	/* , const char *);	*/
-#define	H_ENTER		10	/* , const char *);	*/
-#define	H_APPEND	11	/* , const char *);	*/
+#define	H_ADD		 9	/* , const wchar_t *);	*/
+#define	H_ENTER		10	/* , const wchar_t *);	*/
+#define	H_APPEND	11	/* , const wchar_t *);	*/
 #define	H_END		12	/* , void);		*/
-#define	H_NEXT_STR	13	/* , const char *);	*/
-#define	H_PREV_STR	14	/* , const char *);	*/
+#define	H_NEXT_STR	13	/* , const wchar_t *);	*/
+#define	H_PREV_STR	14	/* , const wchar_t *);	*/
 #define	H_NEXT_EVENT	15	/* , const int);	*/
 #define	H_PREV_EVENT	16	/* , const int);	*/
 #define	H_LOAD		17	/* , const char *);	*/
@@ -202,6 +221,10 @@ int		history(History *, HistEvent *, int
 #define	H_SETUNIQUE	20	/* , int);		*/
 #define	H_GETUNIQUE	21	/* , void);		*/
 #define	H_DEL		22	/* , int);		*/
+#define	H_NEXT_EVDATA	23	/* , const int, histdata_t *);	*/
+#define	H_DELDATA	24	/* , int, histdata_t *);*/
+#define	H_REPLACE	25	/* , const char *, histdata_t);	*/
+
 
 
 /*
@@ -221,6 +244,74 @@ int		 tok_line(Tokenizer *, const LineIn
 int		 tok_str(Tokenizer *, const char *,
 		    int *, const char ***);
 
+/*
+ * Begin Wide Character Support
+ */
+#ifdef __linux__
+/* Apparently we need _GNU_SOURCE defined to get access to wcsdup on Linux */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#endif
+
+#include <wchar.h>
+#include <wctype.h>
+
+/*
+ * Wide character versions
+ */
+
+/*
+ * ==== Editing ====
+ */
+typedef struct lineinfow {
+	const wchar_t	*buffer;
+	const wchar_t	*cursor;
+	const wchar_t	*lastchar;
+} LineInfoW;
+
+const wchar_t	*el_wgets(EditLine *, int *);
+int		 el_wgetc(EditLine *, wchar_t *);
+void		 el_wpush(EditLine *, const wchar_t *);
+
+int		 el_wparse(EditLine *, int, const wchar_t **);
+
+int		 el_wset(EditLine *, int, ...);
+int		 el_wget(EditLine *, int, ...);
+
+const LineInfoW	*el_wline(EditLine *);
+int		 el_winsertstr(EditLine *, const wchar_t *);
+#define          el_wdeletestr  el_deletestr
+
+/*
+ * ==== History ====
+ */
+typedef struct histeventW {
+	int		 num;
+	const wchar_t	*str;
+} HistEventW;
+
+typedef struct historyW HistoryW;
+
+HistoryW *	history_winit(void);
+void		history_wend(HistoryW *);
+
+int		history_w(HistoryW *, HistEventW *, int, ...);
+
+/*
+ * ==== Tokenization ====
+ */
+typedef struct tokenizerW TokenizerW;
+
+/* Wide character tokenizer support */
+TokenizerW	*tok_winit(const wchar_t *);
+void		 tok_wend(TokenizerW *);
+void		 tok_wreset(TokenizerW *);
+int		 tok_wline(TokenizerW *, const LineInfoW *,
+		    int *, const wchar_t ***, int *, int *);
+int		 tok_wstr(TokenizerW *, const wchar_t *,
+		    int *, const wchar_t ***);
+
 #ifdef __cplusplus
 }
 #endif

=== modified file 'cmd-line-utils/libedit/history.c'
--- a/cmd-line-utils/libedit/history.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/history.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: history.c,v 1.33 2009/02/06 14:40:32 sketch Exp $	*/
+/*	$NetBSD: history.c,v 1.38 2011/01/16 03:05:51 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@ static char sccsid[] = "@(#)history.c	8.
 #endif /* not lint && not SCCSID */
 
 /*
- * hist.c: History access functions
+ * hist.c: TYPE(History) access functions
  */
 #include <string.h>
 #include <stdlib.h>
@@ -56,13 +56,14 @@ static char sccsid[] = "@(#)history.c	8.
 static const char hist_cookie[] = "_HiStOrY_V2_\n";
 
 #include "histedit.h"
+#include "chartype.h"
 
-typedef int (*history_gfun_t)(ptr_t, HistEvent *);
-typedef int (*history_efun_t)(ptr_t, HistEvent *, const char *);
-typedef void (*history_vfun_t)(ptr_t, HistEvent *);
-typedef int (*history_sfun_t)(ptr_t, HistEvent *, const int);
+typedef int (*history_gfun_t)(ptr_t, TYPE(HistEvent) *);
+typedef int (*history_efun_t)(ptr_t, TYPE(HistEvent) *, const Char *);
+typedef void (*history_vfun_t)(ptr_t, TYPE(HistEvent) *);
+typedef int (*history_sfun_t)(ptr_t, TYPE(HistEvent) *, const int);
 
-struct history {
+struct TYPE(history) {
 	ptr_t h_ref;		/* Argument for history fcns	 */
 	int h_ent;		/* Last entry point for history	 */
 	history_gfun_t h_first;	/* Get the first element	 */
@@ -88,29 +89,29 @@ struct history {
 #define	HADD(h, ev, str)	(*(h)->h_add)((h)->h_ref, ev, str)
 #define	HDEL(h, ev, n)		(*(h)->h_del)((h)->h_ref, ev, n)
 
-#define	h_strdup(a)	strdup(a)
+#define	h_strdup(a)	Strdup(a)
 #define	h_malloc(a)	malloc(a)
 #define	h_realloc(a, b)	realloc((a), (b))
 #define	h_free(a)	free(a)
 
 typedef struct {
     int		num;
-    char	*str;
+    Char	*str;
 } HistEventPrivate;
 
 
 
-private int history_setsize(History *, HistEvent *, int);
-private int history_getsize(History *, HistEvent *);
-private int history_setunique(History *, HistEvent *, int);
-private int history_getunique(History *, HistEvent *);
-private int history_set_fun(History *, History *);
-private int history_load(History *, const char *);
-private int history_save(History *, const char *);
-private int history_prev_event(History *, HistEvent *, int);
-private int history_next_event(History *, HistEvent *, int);
-private int history_next_string(History *, HistEvent *, const char *);
-private int history_prev_string(History *, HistEvent *, const char *);
+private int history_setsize(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_getsize(TYPE(History) *, TYPE(HistEvent) *);
+private int history_setunique(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_getunique(TYPE(History) *, TYPE(HistEvent) *);
+private int history_set_fun(TYPE(History) *, TYPE(History) *);
+private int history_load(TYPE(History) *, const char *);
+private int history_save(TYPE(History) *, const char *);
+private int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int);
+private int history_next_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
+private int history_prev_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
 
 
 /***********************************************************************/
@@ -119,7 +120,8 @@ private int history_prev_string(History 
  * Builtin- history implementation
  */
 typedef struct hentry_t {
-	HistEvent ev;		/* What we return		 */
+	TYPE(HistEvent) ev;		/* What we return		 */
+	void *data;		/* data				 */
 	struct hentry_t *next;	/* Next entry			 */
 	struct hentry_t *prev;	/* Previous entry		 */
 } hentry_t;
@@ -130,24 +132,27 @@ typedef struct history_t {
 	int max;		/* Maximum number of events	*/
 	int cur;		/* Current number of events	*/
 	int eventid;		/* For generation of unique event id	 */
-	int flags;		/* History flags		*/
+	int flags;		/* TYPE(History) flags		*/
 #define H_UNIQUE	1	/* Store only unique elements	*/
 } history_t;
 
-private int history_def_next(ptr_t, HistEvent *);
-private int history_def_first(ptr_t, HistEvent *);
-private int history_def_prev(ptr_t, HistEvent *);
-private int history_def_last(ptr_t, HistEvent *);
-private int history_def_curr(ptr_t, HistEvent *);
-private int history_def_set(ptr_t, HistEvent *, const int);
-private void history_def_clear(ptr_t, HistEvent *);
-private int history_def_enter(ptr_t, HistEvent *, const char *);
-private int history_def_add(ptr_t, HistEvent *, const char *);
-private int history_def_del(ptr_t, HistEvent *, const int);
-
-private int history_def_init(ptr_t *, HistEvent *, int);
-private int history_def_insert(history_t *, HistEvent *, const char *);
-private void history_def_delete(history_t *, HistEvent *, hentry_t *);
+private int history_def_next(ptr_t, TYPE(HistEvent) *);
+private int history_def_first(ptr_t, TYPE(HistEvent) *);
+private int history_def_prev(ptr_t, TYPE(HistEvent) *);
+private int history_def_last(ptr_t, TYPE(HistEvent) *);
+private int history_def_curr(ptr_t, TYPE(HistEvent) *);
+private int history_def_set(ptr_t, TYPE(HistEvent) *, const int);
+private void history_def_clear(ptr_t, TYPE(HistEvent) *);
+private int history_def_enter(ptr_t, TYPE(HistEvent) *, const Char *);
+private int history_def_add(ptr_t, TYPE(HistEvent) *, const Char *);
+private int history_def_del(ptr_t, TYPE(HistEvent) *, const int);
+
+private int history_def_init(ptr_t *, TYPE(HistEvent) *, int);
+private int history_def_insert(history_t *, TYPE(HistEvent) *, const Char *);
+private void history_def_delete(history_t *, TYPE(HistEvent) *, hentry_t *);
+
+private int history_deldata_nth(history_t *, TYPE(HistEvent) *, int, void **);
+private int history_set_nth(ptr_t, TYPE(HistEvent) *, int);
 
 #define	history_def_setsize(p, num)(void) (((history_t *)p)->max = (num))
 #define	history_def_getsize(p)  (((history_t *)p)->cur)
@@ -165,23 +170,23 @@ private void history_def_delete(history_
 				}
 
 /* error messages */
-static const char *const he_errlist[] = {
-	"OK",
-	"unknown error",
-	"malloc() failed",
-	"first event not found",
-	"last event not found",
-	"empty list",
-	"no next event",
-	"no previous event",
-	"current event is invalid",
-	"event not found",
-	"can't read history from file",
-	"can't write history",
-	"required parameter(s) not supplied",
-	"history size negative",
-	"function not allowed with other history-functions-set the default",
-	"bad parameters"
+static const Char *const he_errlist[] = {
+	STR("OK"),
+	STR("unknown error"),
+	STR("malloc() failed"),
+	STR("first event not found"),
+	STR("last event not found"),
+	STR("empty list"),
+	STR("no next event"),
+	STR("no previous event"),
+	STR("current event is invalid"),
+	STR("event not found"),
+	STR("can't read history from file"),
+	STR("can't write history"),
+	STR("required parameter(s) not supplied"),
+	STR("history size negative"),
+	STR("function not allowed with other history-functions-set the default"),
+	STR("bad parameters")
 };
 /* error codes */
 #define	_HE_OK                   0
@@ -205,7 +210,7 @@ static const char *const he_errlist[] = 
  *	Default function to return the first event in the history.
  */
 private int
-history_def_first(ptr_t p, HistEvent *ev)
+history_def_first(ptr_t p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -225,7 +230,7 @@ history_def_first(ptr_t p, HistEvent *ev
  *	Default function to return the last event in the history.
  */
 private int
-history_def_last(ptr_t p, HistEvent *ev)
+history_def_last(ptr_t p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -245,7 +250,7 @@ history_def_last(ptr_t p, HistEvent *ev)
  *	Default function to return the next event in the history.
  */
 private int
-history_def_next(ptr_t p, HistEvent *ev)
+history_def_next(ptr_t p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -270,7 +275,7 @@ history_def_next(ptr_t p, HistEvent *ev)
  *	Default function to return the previous event in the history.
  */
 private int
-history_def_prev(ptr_t p, HistEvent *ev)
+history_def_prev(ptr_t p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -296,7 +301,7 @@ history_def_prev(ptr_t p, HistEvent *ev)
  *	Default function to return the current event in the history.
  */
 private int
-history_def_curr(ptr_t p, HistEvent *ev)
+history_def_curr(ptr_t p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -317,7 +322,7 @@ history_def_curr(ptr_t p, HistEvent *ev)
  *	given one.
  */
 private int
-history_def_set(ptr_t p, HistEvent *ev, const int n)
+history_def_set(ptr_t p, TYPE(HistEvent) *ev, const int n)
 {
 	history_t *h = (history_t *) p;
 
@@ -339,27 +344,53 @@ history_def_set(ptr_t p, HistEvent *ev, 
 }
 
 
+/* history_set_nth():
+ *	Default function to set the current event in the history to the
+ *	n-th one.
+ */
+private int
+history_set_nth(ptr_t p, TYPE(HistEvent) *ev, int n)
+{
+	history_t *h = (history_t *) p;
+
+	if (h->cur == 0) {
+		he_seterrev(ev, _HE_EMPTY_LIST);
+		return (-1);
+	}
+	for (h->cursor = h->list.prev; h->cursor != &h->list;
+	    h->cursor = h->cursor->prev)
+		if (n-- <= 0)
+			break;
+	if (h->cursor == &h->list) {
+		he_seterrev(ev, _HE_NOT_FOUND);
+		return (-1);
+	}
+	return (0);
+}
+
+
 /* history_def_add():
  *	Append string to element
  */
 private int
-history_def_add(ptr_t p, HistEvent *ev, const char *str)
+history_def_add(ptr_t p, TYPE(HistEvent) *ev, const Char *str)
 {
 	history_t *h = (history_t *) p;
 	size_t len;
-	char *s;
+	Char *s;
 	HistEventPrivate *evp = (void *)&h->cursor->ev;
 
 	if (h->cursor == &h->list)
 		return (history_def_enter(p, ev, str));
-	len = strlen(evp->str) + strlen(str) + 1;
-	s = (char *) h_malloc(len);
+	len = Strlen(evp->str) + Strlen(str) + 1;
+	s = h_malloc(len * sizeof(*s));
 	if (s == NULL) {
 		he_seterrev(ev, _HE_MALLOC_FAILED);
 		return (-1);
 	}
-	(void) strlcpy(s, h->cursor->ev.str, len);
-	(void) strlcat(s, str, len);
+	(void) Strncpy(s, h->cursor->ev.str, len);
+        s[len - 1] = '\0';
+	(void) Strncat(s, str, len - Strlen(s) - 1);
 	h_free((ptr_t)evp->str);
 	evp->str = s;
 	*ev = h->cursor->ev;
@@ -367,18 +398,36 @@ history_def_add(ptr_t p, HistEvent *ev, 
 }
 
 
+private int
+history_deldata_nth(history_t *h, TYPE(HistEvent) *ev,
+    int num, void **data)
+{
+	if (history_set_nth(h, ev, num) != 0)
+		return (-1);
+	/* magic value to skip delete (just set to n-th history) */
+	if (data == (void **)-1)
+		return (0);
+	ev->str = Strdup(h->cursor->ev.str);
+	ev->num = h->cursor->ev.num;
+	if (data)
+		*data = h->cursor->data;
+	history_def_delete(h, ev, h->cursor);
+	return (0);
+}
+
+
 /* history_def_del():
  *	Delete element hp of the h list
  */
 /* ARGSUSED */
 private int
-history_def_del(ptr_t p, HistEvent *ev __attribute__((__unused__)),
+history_def_del(ptr_t p, TYPE(HistEvent) *ev __attribute__((__unused__)),
     const int num)
 {
 	history_t *h = (history_t *) p;
 	if (history_def_set(h, ev, num) != 0)
 		return (-1);
-	ev->str = strdup(h->cursor->ev.str);
+	ev->str = Strdup(h->cursor->ev.str);
 	ev->num = h->cursor->ev.num;
 	history_def_delete(h, ev, h->cursor);
 	return (0);
@@ -391,13 +440,16 @@ history_def_del(ptr_t p, HistEvent *ev _
 /* ARGSUSED */
 private void
 history_def_delete(history_t *h, 
-		   HistEvent *ev __attribute__((__unused__)), hentry_t *hp)
+		   TYPE(HistEvent) *ev __attribute__((__unused__)), hentry_t *hp)
 {
 	HistEventPrivate *evp = (void *)&hp->ev;
 	if (hp == &h->list)
 		abort();
-	if (h->cursor == hp)
+	if (h->cursor == hp) {
 		h->cursor = hp->prev;
+		if (h->cursor == &h->list)
+			h->cursor = hp->next;
+	}
 	hp->prev->next = hp->next;
 	hp->next->prev = hp->prev;
 	h_free((ptr_t) evp->str);
@@ -410,7 +462,7 @@ history_def_delete(history_t *h, 
  *	Insert element with string str in the h list
  */
 private int
-history_def_insert(history_t *h, HistEvent *ev, const char *str)
+history_def_insert(history_t *h, TYPE(HistEvent) *ev, const Char *str)
 {
 
 	h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t));
@@ -420,6 +472,7 @@ history_def_insert(history_t *h, HistEve
 		h_free((ptr_t)h->cursor);
 		goto oomem;
 	}
+	h->cursor->data = NULL;
 	h->cursor->ev.num = ++h->eventid;
 	h->cursor->next = h->list.next;
 	h->cursor->prev = &h->list;
@@ -439,12 +492,12 @@ oomem:
  *	Default function to enter an item in the history
  */
 private int
-history_def_enter(ptr_t p, HistEvent *ev, const char *str)
+history_def_enter(ptr_t p, TYPE(HistEvent) *ev, const Char *str)
 {
 	history_t *h = (history_t *) p;
 
 	if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list &&
-	    strcmp(h->list.next->ev.str, str) == 0)
+	    Strcmp(h->list.next->ev.str, str) == 0)
 	    return (0); 
 
 	if (history_def_insert(h, ev, str) == -1)
@@ -466,7 +519,7 @@ history_def_enter(ptr_t p, HistEvent *ev
  */
 /* ARGSUSED */
 private int
-history_def_init(ptr_t *p, HistEvent *ev __attribute__((__unused__)), int n)
+history_def_init(ptr_t *p, TYPE(HistEvent) *ev __attribute__((__unused__)), int n)
 {
 	history_t *h = (history_t *) h_malloc(sizeof(history_t));
 	if (h == NULL)
@@ -491,7 +544,7 @@ history_def_init(ptr_t *p, HistEvent *ev
  *	Default history cleanup function
  */
 private void
-history_def_clear(ptr_t p, HistEvent *ev)
+history_def_clear(ptr_t p, TYPE(HistEvent) *ev)
 {
 	history_t *h = (history_t *) p;
 
@@ -509,11 +562,11 @@ history_def_clear(ptr_t p, HistEvent *ev
 /* history_init():
  *	Initialization function.
  */
-public History *
-history_init(void)
+public TYPE(History) *
+FUN(history,init)(void)
 {
-	HistEvent ev;
-	History *h = (History *) h_malloc(sizeof(History));
+	TYPE(HistEvent) ev;
+	TYPE(History) *h = (TYPE(History) *) h_malloc(sizeof(TYPE(History)));
 	if (h == NULL)
 		return NULL;
 
@@ -541,9 +594,9 @@ history_init(void)
  *	clean up history;
  */
 public void
-history_end(History *h)
+FUN(history,end)(TYPE(History) *h)
 {
-	HistEvent ev;
+	TYPE(HistEvent) ev;
 
 	if (h->h_next == history_def_next)
 		history_def_clear(h->h_ref, &ev);
@@ -557,7 +610,7 @@ history_end(History *h)
  *	Set history number of events
  */
 private int
-history_setsize(History *h, HistEvent *ev, int num)
+history_setsize(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
 {
 
 	if (h->h_next != history_def_next) {
@@ -577,7 +630,7 @@ history_setsize(History *h, HistEvent *e
  *      Get number of events currently in history
  */
 private int
-history_getsize(History *h, HistEvent *ev)
+history_getsize(TYPE(History) *h, TYPE(HistEvent) *ev)
 {
 	if (h->h_next != history_def_next) {
 		he_seterrev(ev, _HE_NOT_ALLOWED);
@@ -596,7 +649,7 @@ history_getsize(History *h, HistEvent *e
  *	Set if adjacent equal events should not be entered in history.
  */
 private int
-history_setunique(History *h, HistEvent *ev, int uni)
+history_setunique(TYPE(History) *h, TYPE(HistEvent) *ev, int uni)
 {
 
 	if (h->h_next != history_def_next) {
@@ -612,7 +665,7 @@ history_setunique(History *h, HistEvent 
  *	Get if adjacent equal events should not be entered in history.
  */
 private int
-history_getunique(History *h, HistEvent *ev)
+history_getunique(TYPE(History) *h, TYPE(HistEvent) *ev)
 {
 	if (h->h_next != history_def_next) {
 		he_seterrev(ev, _HE_NOT_ALLOWED);
@@ -627,9 +680,9 @@ history_getunique(History *h, HistEvent 
  *	Set history functions
  */
 private int
-history_set_fun(History *h, History *nh)
+history_set_fun(TYPE(History) *h, TYPE(History) *nh)
 {
-	HistEvent ev;
+	TYPE(HistEvent) ev;
 
 	if (nh->h_first == NULL || nh->h_next == NULL || nh->h_last == NULL ||
 	    nh->h_prev == NULL || nh->h_curr == NULL || nh->h_set == NULL ||
@@ -670,17 +723,20 @@ history_set_fun(History *h, History *nh)
 
 
 /* history_load():
- *	History load function
+ *	TYPE(History) load function
  */
 private int
-history_load(History *h, const char *fname)
+history_load(TYPE(History) *h, const char *fname)
 {
 	FILE *fp;
 	char *line;
 	size_t sz, max_size;
 	char *ptr;
 	int i = -1;
-	HistEvent ev;
+	TYPE(HistEvent) ev;
+#ifdef WIDECHAR
+	static ct_buffer_t conv;
+#endif
 
 	if ((fp = fopen(fname, "r")) == NULL)
 		return (i);
@@ -714,7 +770,7 @@ history_load(History *h, const char *fna
 		}
 		(void) strunvis(ptr, line);
 		line[sz] = c;
-		if (HENTER(h, &ev, ptr) == -1) {
+		if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) {
 			i = -1;
 			goto oomem;
 		}
@@ -728,16 +784,19 @@ done:
 
 
 /* history_save():
- *	History save function
+ *	TYPE(History) save function
  */
 private int
-history_save(History *h, const char *fname)
+history_save(TYPE(History) *h, const char *fname)
 {
 	FILE *fp;
-	HistEvent ev;
+	TYPE(HistEvent) ev;
 	int i = -1, retval;
 	size_t len, max_size;
 	char *ptr;
+#ifdef WIDECHAR
+	static ct_buffer_t conv;
+#endif
 
 	if ((fp = fopen(fname, "w")) == NULL)
 		return (-1);
@@ -752,7 +811,7 @@ history_save(History *h, const char *fna
 	for (i = 0, retval = HLAST(h, &ev);
 	    retval != -1;
 	    retval = HPREV(h, &ev), i++) {
-		len = strlen(ev.str) * 4;
+		len = Strlen(ev.str) * 4;
 		if (len >= max_size) {
 			char *nptr;
 			max_size = (len + 1024) & ~1023;
@@ -763,7 +822,7 @@ history_save(History *h, const char *fna
 			}
 			ptr = nptr;
 		}
-		(void) strvis(ptr, ev.str, VIS_WHITE);
+		(void) strvis(ptr, ct_encode_string(ev.str, &conv), VIS_WHITE);
 		(void) fprintf(fp, "%s\n", ptr);
 	}
 oomem:
@@ -778,7 +837,7 @@ done:
  *	Find the previous event, with number given
  */
 private int
-history_prev_event(History *h, HistEvent *ev, int num)
+history_prev_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
 {
 	int retval;
 
@@ -791,11 +850,28 @@ history_prev_event(History *h, HistEvent
 }
 
 
+private int
+history_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d)
+{
+	int retval;
+
+	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
+		if (ev->num == num) {
+			if (d)
+				*d = ((history_t *)h->h_ref)->cursor->data;
+			return (0);
+		}
+
+	he_seterrev(ev, _HE_NOT_FOUND);
+	return (-1);
+}
+
+
 /* history_next_event():
  *	Find the next event, with number given
  */
 private int
-history_next_event(History *h, HistEvent *ev, int num)
+history_next_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
 {
 	int retval;
 
@@ -812,13 +888,13 @@ history_next_event(History *h, HistEvent
  *	Find the previous event beginning with string
  */
 private int
-history_prev_string(History *h, HistEvent *ev, const char *str)
+history_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
 {
-	size_t len = strlen(str);
+	size_t len = Strlen(str);
 	int retval;
 
 	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev))
-		if (strncmp(str, ev->str, len) == 0)
+		if (Strncmp(str, ev->str, len) == 0)
 			return (0);
 
 	he_seterrev(ev, _HE_NOT_FOUND);
@@ -830,13 +906,13 @@ history_prev_string(History *h, HistEven
  *	Find the next event beginning with string
  */
 private int
-history_next_string(History *h, HistEvent *ev, const char *str)
+history_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
 {
-	size_t len = strlen(str);
+	size_t len = Strlen(str);
 	int retval;
 
 	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
-		if (strncmp(str, ev->str, len) == 0)
+		if (Strncmp(str, ev->str, len) == 0)
 			return (0);
 
 	he_seterrev(ev, _HE_NOT_FOUND);
@@ -848,10 +924,10 @@ history_next_string(History *h, HistEven
  *	User interface to history functions.
  */
 int
-history(History *h, HistEvent *ev, int fun, ...)
+FUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...)
 {
 	va_list va;
-	const char *str;
+	const Char *str;
 	int retval;
 
 	va_start(va, fun);
@@ -876,7 +952,7 @@ history(History *h, HistEvent *ev, int f
 		break;
 
 	case H_ADD:
-		str = va_arg(va, const char *);
+		str = va_arg(va, const Char *);
 		retval = HADD(h, ev, str);
 		break;
 
@@ -885,13 +961,13 @@ history(History *h, HistEvent *ev, int f
 		break;
 
 	case H_ENTER:
-		str = va_arg(va, const char *);
+		str = va_arg(va, const Char *);
 		if ((retval = HENTER(h, ev, str)) != -1)
 			h->h_ent = ev->num;
 		break;
 
 	case H_APPEND:
-		str = va_arg(va, const char *);
+		str = va_arg(va, const Char *);
 		if ((retval = HSET(h, ev, h->h_ent)) != -1)
 			retval = HADD(h, ev, str);
 		break;
@@ -946,16 +1022,16 @@ history(History *h, HistEvent *ev, int f
 		break;
 
 	case H_PREV_STR:
-		retval = history_prev_string(h, ev, va_arg(va, const char *));
+		retval = history_prev_string(h, ev, va_arg(va, const Char *));
 		break;
 
 	case H_NEXT_STR:
-		retval = history_next_string(h, ev, va_arg(va, const char *));
+		retval = history_next_string(h, ev, va_arg(va, const Char *));
 		break;
 
 	case H_FUNC:
 	{
-		History hf;
+		TYPE(History) hf;
 
 		hf.h_ref = va_arg(va, ptr_t);
 		h->h_ent = -1;
@@ -976,15 +1052,46 @@ history(History *h, HistEvent *ev, int f
 	}
 
 	case H_END:
-		history_end(h);
+		FUN(history,end)(h);
 		retval = 0;
 		break;
 
+	case H_NEXT_EVDATA:
+	{
+		int num = va_arg(va, int);
+		void **d = va_arg(va, void **);
+		retval = history_next_evdata(h, ev, num, d);
+		break;
+	}
+
+	case H_DELDATA:
+	{
+		int num = va_arg(va, int);
+		void **d = va_arg(va, void **);
+		retval = history_deldata_nth((history_t *)h->h_ref, ev, num, d);
+		break;
+	}
+
+	case H_REPLACE: /* only use after H_NEXT_EVDATA */
+	{
+		const Char *line = va_arg(va, const Char *);
+		void *d = va_arg(va, void *);
+		const Char *s;
+		if(!line || !(s = Strdup(line))) {
+			retval = -1;
+			break;
+		}
+		((history_t *)h->h_ref)->cursor->ev.str = s;
+		((history_t *)h->h_ref)->cursor->data = d;
+		retval = 0;
+		break;
+	}
+
 	default:
 		retval = -1;
 		he_seterrev(ev, _HE_UNKNOWN);
 		break;
 	}
 	va_end(va);
-	return (retval);
+	return retval;
 }

=== modified file 'cmd-line-utils/libedit/key.c'
--- a/cmd-line-utils/libedit/key.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/key.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.c,v 1.19 2006/03/23 20:22:51 christos Exp $	*/
+/*	$NetBSD: key.c,v 1.23 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -71,7 +71,7 @@ static char sccsid[] = "@(#)key.c	8.1 (B
  * of these node elements
  */
 struct key_node_t {
-	char		ch;		/* single character of key 	 */
+	Char		ch;		/* single character of key 	 */
 	int		type;		/* node type			 */
 	key_value_t	val;		/* command code or pointer to str,  */
 					/* if this is a leaf 		 */
@@ -79,17 +79,17 @@ struct key_node_t {
 	struct key_node_t *sibling;	/* ptr to another key with same prefix*/
 };
 
-private int		 node_trav(EditLine *, key_node_t *, char *,
+private int		 node_trav(EditLine *, key_node_t *, Char *,
     key_value_t *);
-private int		 node__try(EditLine *, key_node_t *, const char *,
+private int		 node__try(EditLine *, key_node_t *, const Char *,
     key_value_t *, int);
-private key_node_t	*node__get(int);
+private key_node_t	*node__get(Int);
 private void		 node__free(key_node_t *);
 private void		 node__put(EditLine *, key_node_t *);
-private int		 node__delete(EditLine *, key_node_t **, const char *);
-private int		 node_lookup(EditLine *, const char *, key_node_t *,
-    int);
-private int		 node_enum(EditLine *, key_node_t *, int);
+private int		 node__delete(EditLine *, key_node_t **, const Char *);
+private int		 node_lookup(EditLine *, const Char *, key_node_t *,
+    size_t);
+private int		 node_enum(EditLine *, key_node_t *, size_t);
 
 #define	KEY_BUFSIZ	EL_BUFSIZ
 
@@ -101,7 +101,7 @@ protected int
 key_init(EditLine *el)
 {
 
-	el->el_key.buf = (char *) el_malloc(KEY_BUFSIZ);
+	el->el_key.buf = el_malloc(KEY_BUFSIZ * sizeof(*el->el_key.buf));
 	if (el->el_key.buf == NULL)
 		return (-1);
 	el->el_key.map = NULL;
@@ -138,7 +138,7 @@ key_map_cmd(EditLine *el, int cmd)
  *	Associate str with a key value
  */
 protected key_value_t *
-key_map_str(EditLine *el, char *str)
+key_map_str(EditLine *el, Char *str)
 {
 
 	el->el_key.val.str = str;
@@ -170,7 +170,7 @@ key_reset(EditLine *el)
  *      The last character read is returned in *ch.
  */
 protected int
-key_get(EditLine *el, char *ch, key_value_t *val)
+key_get(EditLine *el, Char *ch, key_value_t *val)
 {
 
 	return (node_trav(el, el->el_key.map, ch, val));
@@ -184,7 +184,7 @@ key_get(EditLine *el, char *ch, key_valu
  *      out str or a unix command.
  */
 protected void
-key_add(EditLine *el, const char *key, key_value_t *val, int ntype)
+key_add(EditLine *el, const Char *key, key_value_t *val, int ntype)
 {
 
 	if (key[0] == '\0') {
@@ -212,9 +212,12 @@ key_add(EditLine *el, const char *key, k
  *
  */
 protected void
-key_clear(EditLine *el, el_action_t *map, const char *in)
+key_clear(EditLine *el, el_action_t *map, const Char *in)
 {
-
+#ifdef WIDECHAR
+        if (*in > N_KEYS) /* can't be in the map */
+                return;
+#endif
 	if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) &&
 	    ((map == el->el_map.key &&
 	    el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) ||
@@ -229,7 +232,7 @@ key_clear(EditLine *el, el_action_t *map
  *      they exists.
  */
 protected int
-key_delete(EditLine *el, const char *key)
+key_delete(EditLine *el, const Char *key)
 {
 
 	if (key[0] == '\0') {
@@ -250,7 +253,7 @@ key_delete(EditLine *el, const char *key
  *	Print entire el->el_key.map if null
  */
 protected void
-key_print(EditLine *el, const char *key)
+key_print(EditLine *el, const Char *key)
 {
 
 	/* do nothing if el->el_key.map is empty and null key specified */
@@ -260,7 +263,7 @@ key_print(EditLine *el, const char *key)
 	el->el_key.buf[0] = '"';
 	if (node_lookup(el, key, el->el_key.map, 1) <= -1)
 		/* key is not bound */
-		(void) fprintf(el->el_errfile, "Unbound extended key \"%s\"\n",
+		(void) fprintf(el->el_errfile, "Unbound extended key \"" FSTR "\"\n",
 		    key);
 	return;
 }
@@ -271,14 +274,14 @@ key_print(EditLine *el, const char *key)
  * 	found.  May read in more characters.
  */
 private int
-node_trav(EditLine *el, key_node_t *ptr, char *ch, key_value_t *val)
+node_trav(EditLine *el, key_node_t *ptr, Char *ch, key_value_t *val)
 {
 
 	if (ptr->ch == *ch) {
 		/* match found */
 		if (ptr->next) {
 			/* key not complete so get next char */
-			if (el_getc(el, ch) != 1) {	/* if EOF or error */
+			if (FUN(el,getc)(el, ch) != 1) {/* if EOF or error */
 				val->cmd = ED_END_OF_FILE;
 				return (XK_CMD);
 				/* PWP: Pretend we just read an end-of-file */
@@ -308,7 +311,7 @@ node_trav(EditLine *el, key_node_t *ptr,
  * 	Find a node that matches *str or allocate a new one
  */
 private int
-node__try(EditLine *el, key_node_t *ptr, const char *str, key_value_t *val, int ntype)
+node__try(EditLine *el, key_node_t *ptr, const Char *str, key_value_t *val, int ntype)
 {
 
 	if (ptr->ch != *str) {
@@ -349,7 +352,7 @@ node__try(EditLine *el, key_node_t *ptr,
 			break;
 		case XK_STR:
 		case XK_EXE:
-			if ((ptr->val.str = el_strdup(val->str)) == NULL)
+			if ((ptr->val.str = Strdup(val->str)) == NULL)
 				return -1;
 			break;
 		default:
@@ -370,7 +373,7 @@ node__try(EditLine *el, key_node_t *ptr,
  *	Delete node that matches str
  */
 private int
-node__delete(EditLine *el, key_node_t **inptr, const char *str)
+node__delete(EditLine *el, key_node_t **inptr, const Char *str)
 {
 	key_node_t *ptr;
 	key_node_t *prev_ptr = NULL;
@@ -450,7 +453,7 @@ node__put(EditLine *el, key_node_t *ptr)
  *	Returns pointer to a key_node_t for ch.
  */
 private key_node_t *
-node__get(int ch)
+node__get(Int ch)
 {
 	key_node_t *ptr;
 
@@ -480,14 +483,14 @@ node__free(key_node_t *k)
  *	Print if last node
  */
 private int
-node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
+node_lookup(EditLine *el, const Char *str, key_node_t *ptr, size_t cnt)
 {
-	int ncnt;
+	ssize_t used;
 
 	if (ptr == NULL)
 		return (-1);	/* cannot have null ptr */
 
-	if (*str == 0) {
+	if (!str || *str == 0) {
 		/* no more chars in str.  node_enum from here. */
 		(void) node_enum(el, ptr, cnt);
 		return (0);
@@ -495,17 +498,19 @@ node_lookup(EditLine *el, const char *st
 		/* If match put this char into el->el_key.buf.  Recurse */
 		if (ptr->ch == *str) {
 			/* match found */
-			ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
-			    (unsigned char) ptr->ch);
+			used = ct_visual_char(el->el_key.buf + cnt,
+			    KEY_BUFSIZ - cnt, ptr->ch);
+			if (used == -1)
+				return (-1); /* ran out of buffer space */
 			if (ptr->next != NULL)
 				/* not yet at leaf */
 				return (node_lookup(el, str + 1, ptr->next,
-				    ncnt + 1));
+				    used + cnt));
 			else {
 			    /* next node is null so key should be complete */
 				if (str[1] == 0) {
-					el->el_key.buf[ncnt + 1] = '"';
-					el->el_key.buf[ncnt + 2] = '\0';
+					el->el_key.buf[cnt + used    ] = '"';
+					el->el_key.buf[cnt + used + 1] = '\0';
 					key_kprint(el, el->el_key.buf,
 					    &ptr->val, ptr->type);
 					return (0);
@@ -529,16 +534,16 @@ node_lookup(EditLine *el, const char *st
  *	Traverse the node printing the characters it is bound in buffer
  */
 private int
-node_enum(EditLine *el, key_node_t *ptr, int cnt)
+node_enum(EditLine *el, key_node_t *ptr, size_t cnt)
 {
-	int ncnt;
+        ssize_t used;
 
 	if (cnt >= KEY_BUFSIZ - 5) {	/* buffer too small */
 		el->el_key.buf[++cnt] = '"';
 		el->el_key.buf[++cnt] = '\0';
 		(void) fprintf(el->el_errfile,
 		    "Some extended keys too long for internal print buffer");
-		(void) fprintf(el->el_errfile, " \"%s...\"\n", el->el_key.buf);
+		(void) fprintf(el->el_errfile, " \"" FSTR "...\"\n", el->el_key.buf);
 		return (0);
 	}
 	if (ptr == NULL) {
@@ -549,15 +554,14 @@ node_enum(EditLine *el, key_node_t *ptr,
 		return (-1);
 	}
 	/* put this char at end of str */
-	ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
-	    (unsigned char)ptr->ch);
+        used = ct_visual_char(el->el_key.buf + cnt, KEY_BUFSIZ - cnt, ptr->ch);
 	if (ptr->next == NULL) {
 		/* print this key and function */
-		el->el_key.buf[ncnt + 1] = '"';
-		el->el_key.buf[ncnt + 2] = '\0';
+		el->el_key.buf[cnt + used   ] = '"';
+		el->el_key.buf[cnt + used + 1] = '\0';
 		key_kprint(el, el->el_key.buf, &ptr->val, ptr->type);
 	} else
-		(void) node_enum(el, ptr->next, ncnt + 1);
+		(void) node_enum(el, ptr->next, cnt + used);
 
 	/* go to sibling if there is one */
 	if (ptr->sibling)
@@ -571,7 +575,7 @@ node_enum(EditLine *el, key_node_t *ptr,
  *	function specified by val
  */
 protected void
-key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
+key_kprint(EditLine *el, const Char *key, key_value_t *val, int ntype)
 {
 	el_bindings_t *fp;
 	char unparsbuf[EL_BUFSIZ];
@@ -584,13 +588,16 @@ key_kprint(EditLine *el, const char *key
 			(void) key__decode_str(val->str, unparsbuf,
 			    sizeof(unparsbuf), 
 			    ntype == XK_STR ? "\"\"" : "[]");
-			(void) fprintf(el->el_outfile, fmt, key, unparsbuf);
+			(void) fprintf(el->el_outfile, fmt,
+			    ct_encode_string(key, &el->el_scratch), unparsbuf);
 			break;
 		case XK_CMD:
 			for (fp = el->el_map.help; fp->name; fp++)
 				if (val->cmd == fp->func) {
+                    ct_wcstombs(unparsbuf, fp->name, sizeof(unparsbuf));
+                    unparsbuf[sizeof(unparsbuf) -1] = '\0';
 					(void) fprintf(el->el_outfile, fmt,
-					    key, fp->name);
+                        ct_encode_string(key, &el->el_scratch), unparsbuf);
 					break;
 				}
 #ifdef DEBUG_KEY
@@ -605,7 +612,8 @@ key_kprint(EditLine *el, const char *key
 			break;
 		}
 	else
-		(void) fprintf(el->el_outfile, fmt, key, "no input");
+		(void) fprintf(el->el_outfile, fmt, ct_encode_string(key,
+		    &el->el_scratch), "no input");
 }
 
 
@@ -614,52 +622,14 @@ key_kprint(EditLine *el, const char *key
 		*b++ = c; \
 	else \
 		b++
-/* key__decode_char():
- *	Put a printable form of char in buf.
- */
-protected int
-key__decode_char(char *buf, int cnt, int off, int ch)
-{
-	char *sb = buf + off;
-	char *eb = buf + cnt;
-	char *b = sb;
-	if (ch == 0) {
-		ADDC('^');
-		ADDC('@');
-		return b - sb;
-	}
-	if (iscntrl(ch)) {
-		ADDC('^');
-		if (ch == '\177')
-			ADDC('?');
-		else
-			ADDC(ch | 0100);
-	} else if (ch == '^') {
-		ADDC('\\');
-		ADDC('^');
-	} else if (ch == '\\') {
-		ADDC('\\');
-		ADDC('\\');
-	} else if (ch == ' ' || (el_isprint(ch) && !isspace(ch))) {
-		ADDC(ch);
-	} else {
-		ADDC('\\');
-		ADDC((((unsigned int) ch >> 6) & 7) + '0');
-		ADDC((((unsigned int) ch >> 3) & 7) + '0');
-		ADDC((ch & 7) + '0');
-	}
-	return b - sb;
-}
-
-
 /* key__decode_str():
  *	Make a printable version of the ey
  */
-protected int
-key__decode_str(const char *str, char *buf, int len, const char *sep)
+protected size_t
+key__decode_str(const Char *str, char *buf, size_t len, const char *sep)
 {
 	char *b = buf, *eb = b + len;
-	const char *p;
+	const Char *p;
 
 	b = buf;
 	if (sep[0] != '\0') {
@@ -668,38 +638,27 @@ key__decode_str(const char *str, char *b
 	if (*str == '\0') {
 		ADDC('^');
 		ADDC('@');
-		if (sep[0] != '\0' && sep[1] != '\0') {
-			ADDC(sep[1]);
-		}
-		goto done;
+		goto add_endsep;
 	}
 	for (p = str; *p != 0; p++) {
-		if (iscntrl((unsigned char) *p)) {
-			ADDC('^');
-			if (*p == '\177') {
-				ADDC('?');
-			} else {
-				ADDC(*p | 0100);
-			}
-		} else if (*p == '^' || *p == '\\') {
-			ADDC('\\');
-			ADDC(*p);
-		} else if (*p == ' ' || (el_isprint((unsigned char) *p) &&
-			!isspace((unsigned char) *p))) {
-			ADDC(*p);
-		} else {
-			ADDC('\\');
-			ADDC((((unsigned int) *p >> 6) & 7) + '0');
-			ADDC((((unsigned int) *p >> 3) & 7) + '0');
-			ADDC((*p & 7) + '0');
+		Char dbuf[VISUAL_WIDTH_MAX];
+		Char *p2 = dbuf;
+		ssize_t l = ct_visual_char(dbuf, VISUAL_WIDTH_MAX, *p);
+		while (l-- > 0) {
+			ssize_t n = ct_encode_char(b, (size_t)(eb - b), *p2++);
+			if (n == -1) /* ran out of space */
+				goto add_endsep;
+			else
+				b += n;
 		}
 	}
+add_endsep:
 	if (sep[0] != '\0' && sep[1] != '\0') {
 		ADDC(sep[1]);
 	}
-done:
 	ADDC('\0');
-	if (b - buf >= len)
+	if ((size_t)(b - buf) >= len)
 	    buf[len - 1] = '\0';
-	return b - buf;
+	return (size_t)(b - buf);
 }
+

=== modified file 'cmd-line-utils/libedit/key.h'
--- a/cmd-line-utils/libedit/key.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/key.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.h,v 1.10 2006/03/23 20:22:51 christos Exp $	*/
+/*	$NetBSD: key.h,v 1.13 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -42,13 +42,13 @@
 
 typedef union key_value_t {
 	el_action_t	 cmd;	/* If it is a command the #	*/
-	char		*str;	/* If it is a string...		*/
+	Char		*str;	/* If it is a string...		*/
 } key_value_t;
 
 typedef struct key_node_t key_node_t;
 
 typedef struct el_key_t {
-	char		*buf;	/* Key print buffer		*/
+	Char		*buf;	/* Key print buffer		*/
 	key_node_t	*map;	/* Key map			*/
 	key_value_t	 val;	/* Local conversion buffer	*/
 } el_key_t;
@@ -65,17 +65,16 @@ typedef struct el_key_t {
 protected int		 key_init(EditLine *);
 protected void		 key_end(EditLine *);
 protected key_value_t	*key_map_cmd(EditLine *, int);
-protected key_value_t	*key_map_str(EditLine *, char *);
+protected key_value_t	*key_map_str(EditLine *, Char *);
 protected void		 key_reset(EditLine *);
-protected int		 key_get(EditLine *, char *, key_value_t *);
-protected void		 key_add(EditLine *, const char *, key_value_t *, int);
-protected void		 key_clear(EditLine *, el_action_t *, const char *);
-protected int		 key_delete(EditLine *, const char *);
-protected void		 key_print(EditLine *, const char *);
-protected void	         key_kprint(EditLine *, const char *, key_value_t *,
+protected int		 key_get(EditLine *, Char *, key_value_t *);
+protected void		 key_add(EditLine *, const Char *, key_value_t *, int);
+protected void		 key_clear(EditLine *, el_action_t *, const Char *);
+protected int		 key_delete(EditLine *, const Char *);
+protected void		 key_print(EditLine *, const Char *);
+protected void	         key_kprint(EditLine *, const Char *, key_value_t *,
     int);
-protected int		 key__decode_str(const char *, char *, int,
+protected size_t	 key__decode_str(const Char *, char *, size_t,
     const char *);
-protected int		 key__decode_char(char *, int, int, int);
 
 #endif /* _h_el_key */

=== modified file 'cmd-line-utils/libedit/makelist.sh'
--- a/cmd-line-utils/libedit/makelist.sh	2009-08-04 11:25:19 +0000
+++ b/cmd-line-utils/libedit/makelist.sh	2011-04-17 13:40:20 +0000
@@ -1,5 +1,5 @@
 #!/bin/sh -
-#	$NetBSD: makelist,v 1.11 2005/10/22 16:45:03 christos Exp $
+#	$NetBSD: makelist,v 1.16 2010/04/18 21:17:05 christos Exp $
 #
 # Copyright (c) 1992, 1993
 #	The Regents of the University of California.  All rights reserved.
@@ -36,7 +36,7 @@
 # makelist.sh: Automatically generate header files...
 
 AWK=@AWK@
-USAGE="Usage: $0 -h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
+USAGE="Usage: $0 -n|-h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
 
 if [ "x$1" = "x" ]
 then
@@ -53,6 +53,14 @@ case $FLAG in
 
 #	generate foo.h file from foo.c
 #
+-n)
+    cat << _EOF
+#undef WIDECHAR
+#define NARROWCHAR
+#include "${FILES}"
+_EOF
+    ;;
+    
 -h)
     set - `echo $FILES | sed -e 's/\\./_/g'`
     hdr="_h_`basename $1`"
@@ -70,7 +78,7 @@ case $FLAG in
 # XXX:	need a space between name and prototype so that -fc and -fh
 #	parsing is much easier
 #
-		printf("protected el_action_t\t%s (EditLine *, int);\n", name);
+		printf("protected el_action_t\t%s (EditLine *, Int);\n", name);
 	    }
 	}
 	END {
@@ -85,6 +93,7 @@ case $FLAG in
 	BEGIN {
 	    printf("/* Automatically generated file, do not edit */\n");
 	    printf("#include \"config.h\"\n#include \"el.h\"\n");
+	    printf("#include \"chartype.h\"\n");
 	    printf("private const struct el_bindings_t el_func_help[] = {\n");
 	    low = "abcdefghijklmnopqrstuvwxyz_";
 	    high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
@@ -106,18 +115,18 @@ case $FLAG in
 		    fname = fname s;
 		}
 
-		printf("    { %-30.30s %-30.30s\n","\"" fname "\",", uname ",");
+		printf("    { %-30.30s %-30.30s\n","STR(\"" fname "\"),", uname ",");
 		ok = 1;
 	    }
 	}
 	/^ \*/ {
 	    if (ok) {
-		printf("      \"");
+		printf("      STR(\"");
 		for (i = 2; i < NF; i++)
 		    printf("%s ", $i);
-		# XXXMYSQL: support CRLF
+        # XXXMYSQL: support CRLF
 		sub("\r", "", $i);
-		printf("%s\" },\n", $i);
+		printf("%s\") },\n", $i);
 		ok = 0;
 	    }
 	}
@@ -157,7 +166,7 @@ case $FLAG in
 	END {
 	    printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count);
 
-	    printf("typedef el_action_t (*el_func_t)(EditLine *, int);");
+	    printf("typedef el_action_t (*el_func_t)(EditLine *, Int);");
 	    printf("\nprotected const el_func_t* func__get(void);\n");
 	    printf("#endif /* _h_fcns_c */\n");
 	}'

=== modified file 'cmd-line-utils/libedit/map.c'
--- a/cmd-line-utils/libedit/map.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/map.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: map.c,v 1.24 2006/04/09 01:36:51 christos Exp $	*/
+/*	$NetBSD: map.c,v 1.25 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -46,10 +46,8 @@ static char sccsid[] = "@(#)map.c	8.1 (B
 #include <stdlib.h>
 #include "el.h"
 
-#define	N_KEYS 256
-
-private void	map_print_key(EditLine *, el_action_t *, const char *);
-private void	map_print_some_keys(EditLine *, el_action_t *, int, int);
+private void	map_print_key(EditLine *, el_action_t *, const Char *);
+private void	map_print_some_keys(EditLine *, el_action_t *, Int, Int);
 private void	map_print_all_keys(EditLine *);
 private void	map_init_nls(EditLine *);
 private void	map_init_meta(EditLine *);
@@ -967,7 +965,7 @@ map_init_nls(EditLine *el)
 	el_action_t *map = el->el_map.key;
 
 	for (i = 0200; i <= 0377; i++)
-		if (el_isprint(i))
+		if (Isprint(i))
 			map[i] = ED_INSERT;
 }
 
@@ -978,7 +976,7 @@ map_init_nls(EditLine *el)
 private void
 map_init_meta(EditLine *el)
 {
-	char buf[3];
+	Char buf[3];
 	int i;
 	el_action_t *map = el->el_map.key;
 	el_action_t *alt = el->el_map.alt;
@@ -996,7 +994,7 @@ map_init_meta(EditLine *el)
 		} else
 			map = alt;
 	}
-	buf[0] = (char) i;
+	buf[0] = (Char) i;
 	buf[2] = 0;
 	for (i = 0200; i <= 0377; i++)
 		switch (map[i]) {
@@ -1050,7 +1048,7 @@ protected void
 map_init_emacs(EditLine *el)
 {
 	int i;
-	char buf[3];
+	Char buf[3];
 	el_action_t *key = el->el_map.key;
 	el_action_t *alt = el->el_map.alt;
 	const el_action_t *emacs = el->el_map.emacs;
@@ -1081,14 +1079,14 @@ map_init_emacs(EditLine *el)
  *	Set the editor
  */
 protected int
-map_set_editor(EditLine *el, char *editor)
+map_set_editor(EditLine *el, Char *editor)
 {
 
-	if (strcmp(editor, "emacs") == 0) {
+	if (Strcmp(editor, STR("emacs")) == 0) {
 		map_init_emacs(el);
 		return (0);
 	}
-	if (strcmp(editor, "vi") == 0) {
+	if (Strcmp(editor, STR("vi")) == 0) {
 		map_init_vi(el);
 		return (0);
 	}
@@ -1100,17 +1098,17 @@ map_set_editor(EditLine *el, char *edito
  *	Retrieve the editor
  */
 protected int
-map_get_editor(EditLine *el, const char **editor)
+map_get_editor(EditLine *el, const Char **editor)
 {
 
 	if (editor == NULL)
 		return (-1);
 	switch (el->el_map.type) {
 	case MAP_EMACS:
-		*editor = "emacs";
+		*editor = STR("emacs");
 		return (0);
 	case MAP_VI:
-		*editor = "vi";
+		*editor = STR("vi");
 		return (0);
 	}
 	return (-1);
@@ -1121,7 +1119,7 @@ map_get_editor(EditLine *el, const char 
  *	Print the function description for 1 key
  */
 private void
-map_print_key(EditLine *el, el_action_t *map, const char *in)
+map_print_key(EditLine *el, el_action_t *map, const Char *in)
 {
 	char outbuf[EL_BUFSIZ];
 	el_bindings_t *bp, *ep;
@@ -1132,7 +1130,7 @@ map_print_key(EditLine *el, el_action_t 
 		for (bp = el->el_map.help; bp < ep; bp++)
 			if (bp->func == map[(unsigned char) *in]) {
 				(void) fprintf(el->el_outfile,
-				    "%s\t->\t%s\n", outbuf, bp->name);
+				    "%s\t->\t" FSTR "\n", outbuf, bp->name);
 				return;
 			}
 	} else
@@ -1144,10 +1142,10 @@ map_print_key(EditLine *el, el_action_t 
  *	Print keys from first to last
  */
 private void
-map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
+map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last)
 {
 	el_bindings_t *bp, *ep;
-	char firstbuf[2], lastbuf[2];
+	Char firstbuf[2], lastbuf[2];
 	char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
 
 	firstbuf[0] = first;
@@ -1169,7 +1167,7 @@ map_print_some_keys(EditLine *el, el_act
 			if (first == last) {
 				(void) key__decode_str(firstbuf, unparsbuf, 
 				    sizeof(unparsbuf), STRQQ);
-				(void) fprintf(el->el_outfile, "%-15s->  %s\n",
+				(void) fprintf(el->el_outfile, "%-15s->  " FSTR "\n",
 				    unparsbuf, bp->name);
 			} else {
 				(void) key__decode_str(firstbuf, unparsbuf, 
@@ -1177,7 +1175,7 @@ map_print_some_keys(EditLine *el, el_act
 				(void) key__decode_str(lastbuf, extrabuf, 
 				    sizeof(extrabuf), STRQQ);
 				(void) fprintf(el->el_outfile,
-				    "%-4s to %-7s->  %s\n",
+				    "%-4s to %-7s->  " FSTR "\n",
 				    unparsbuf, extrabuf, bp->name);
 			}
 			return;
@@ -1233,9 +1231,9 @@ map_print_all_keys(EditLine *el)
 	map_print_some_keys(el, el->el_map.alt, prev, i - 1);
 
 	(void) fprintf(el->el_outfile, "Multi-character bindings\n");
-	key_print(el, "");
+	key_print(el, STR(""));
 	(void) fprintf(el->el_outfile, "Arrow key bindings\n");
-	term_print_arrow(el, "");
+	term_print_arrow(el, STR(""));
 }
 
 
@@ -1243,15 +1241,15 @@ map_print_all_keys(EditLine *el)
  *	Add/remove/change bindings
  */
 protected int
-map_bind(EditLine *el, int argc, const char **argv)
+map_bind(EditLine *el, int argc, const Char **argv)
 {
 	el_action_t *map;
 	int ntype, rem;
-	const char *p;
-	char inbuf[EL_BUFSIZ];
-	char outbuf[EL_BUFSIZ];
-	const char *in = NULL;
-	char *out = NULL;
+	const Char *p;
+	Char inbuf[EL_BUFSIZ];
+	Char outbuf[EL_BUFSIZ];
+	const Char *in = NULL;
+	Char *out = NULL;
 	el_bindings_t *bp, *ep;
 	int cmd;
 	int key;
@@ -1297,12 +1295,12 @@ map_bind(EditLine *el, int argc, const c
 				ep = &el->el_map.help[el->el_map.nfunc];
 				for (bp = el->el_map.help; bp < ep; bp++)
 					(void) fprintf(el->el_outfile,
-					    "%s\n\t%s\n",
+					    "" FSTR "\n\t" FSTR "\n",
 					    bp->name, bp->description);
 				return (0);
 			default:
 				(void) fprintf(el->el_errfile,
-				    "%s: Invalid switch `%c'.\n",
+				    "" FSTR ": Invalid switch `%c'.\n",
 				    argv[0], p[1]);
 			}
 		else
@@ -1316,7 +1314,7 @@ map_bind(EditLine *el, int argc, const c
 		in = argv[argc++];
 	else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
 		(void) fprintf(el->el_errfile,
-		    "%s: Invalid \\ or ^ in instring.\n",
+		    "" FSTR ": Invalid \\ or ^ in instring.\n",
 		    argv[0]);
 		return (-1);
 	}
@@ -1352,7 +1350,7 @@ map_bind(EditLine *el, int argc, const c
 	case XK_EXE:
 		if ((out = parse__string(outbuf, argv[argc])) == NULL) {
 			(void) fprintf(el->el_errfile,
-			    "%s: Invalid \\ or ^ in outstring.\n", argv[0]);
+			    "" FSTR ": Invalid \\ or ^ in outstring.\n", argv[0]);
 			return (-1);
 		}
 		if (key)
@@ -1365,7 +1363,8 @@ map_bind(EditLine *el, int argc, const c
 	case XK_CMD:
 		if ((cmd = parse_cmd(el, argv[argc])) == -1) {
 			(void) fprintf(el->el_errfile,
-			    "%s: Invalid command `%s'.\n", argv[0], argv[argc]);
+			    "" FSTR ": Invalid command `" FSTR "'.\n",
+			    argv[0], argv[argc]);
 			return (-1);
 		}
 		if (key)
@@ -1393,7 +1392,7 @@ map_bind(EditLine *el, int argc, const c
  *	add a user defined function
  */
 protected int
-map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func)
+map_addfunc(EditLine *el, const Char *name, const Char *help, el_func_t func)
 {
 	void *p;
 	int nf = el->el_map.nfunc + 1;

=== modified file 'cmd-line-utils/libedit/map.h'
--- a/cmd-line-utils/libedit/map.h	2005-04-21 10:06:46 +0000
+++ b/cmd-line-utils/libedit/map.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: map.h,v 1.8 2003/08/07 16:44:32 agc Exp $	*/
+/*	$NetBSD: map.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -41,9 +41,9 @@
 #define	_h_el_map
 
 typedef struct el_bindings_t {	/* for the "bind" shell command */
-	const char	*name;		/* function name for bind command */
+	const Char	*name;		/* function name for bind command */
 	int		 func;		/* function numeric value */
-	const char	*description;	/* description of function */
+	const Char	*description;	/* description of function */
 } el_bindings_t;
 
 
@@ -63,13 +63,15 @@ typedef struct el_map_t {
 #define	MAP_EMACS	0
 #define	MAP_VI		1
 
-protected int	map_bind(EditLine *, int, const char **);
+#define N_KEYS      256
+
+protected int	map_bind(EditLine *, int, const Char **);
 protected int	map_init(EditLine *);
 protected void	map_end(EditLine *);
 protected void	map_init_vi(EditLine *);
 protected void	map_init_emacs(EditLine *);
-protected int	map_set_editor(EditLine *, char *);
-protected int	map_get_editor(EditLine *, const char **);
-protected int	map_addfunc(EditLine *, const char *, const char *, el_func_t);
+protected int	map_set_editor(EditLine *, Char *);
+protected int	map_get_editor(EditLine *, const Char **);
+protected int	map_addfunc(EditLine *, const Char *, const Char *, el_func_t);
 
 #endif /* _h_el_map */

=== modified file 'cmd-line-utils/libedit/np/strlcat.c'
--- a/cmd-line-utils/libedit/np/strlcat.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/np/strlcat.c	2011-04-17 13:40:20 +0000
@@ -24,6 +24,7 @@
 #include "config.h"
 #endif
 
+#include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
 #endif /* LIBC_SCCS and not lint */
 

=== modified file 'cmd-line-utils/libedit/np/strlcpy.c'
--- a/cmd-line-utils/libedit/np/strlcpy.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/np/strlcpy.c	2011-04-17 13:40:20 +0000
@@ -23,6 +23,8 @@
 #else
 #include "config.h"
 #endif
+
+#include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
 #endif /* LIBC_SCCS and not lint */
 

=== modified file 'cmd-line-utils/libedit/np/unvis.c'
--- a/cmd-line-utils/libedit/np/unvis.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/np/unvis.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: unvis.c,v 1.28 2005/09/13 01:44:09 christos Exp $	*/
+/*	$NetBSD: unvis.c,v 1.36 2011/03/18 09:07:20 martin Exp $	*/
 
 /*-
  * Copyright (c) 1989, 1993
@@ -31,6 +31,7 @@
 
 #include "config.h"
 
+#include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
 #if 0
 static char sccsid[] = "@(#)unvis.c	8.1 (Berkeley) 6/4/93";
@@ -38,11 +39,18 @@ static char sccsid[] = "@(#)unvis.c	8.1 
 #endif
 #endif /* LIBC_SCCS and not lint */
 
+/* XXXMYSQL : Make compiler happy. */
+#ifdef _LIBC
+#include "namespace.h"
+#endif
+
 #include <sys/types.h>
 
 #include <assert.h>
 #include <ctype.h>
+#include <stdint.h>
 #include <stdio.h>
+#include <errno.h>
 #ifdef HAVE_VIS_H
 #include <vis.h>
 #else
@@ -50,7 +58,7 @@ static char sccsid[] = "@(#)unvis.c	8.1 
 #endif
 
 #ifdef __weak_alias
-__weak_alias(strunvis,_strunvis)
+__weak_alias(strnunvisx,_strnunvisx)
 #endif
 
 #if !HAVE_VIS
@@ -64,143 +72,276 @@ __weak_alias(strunvis,_strunvis)
 #define	S_CTRL		4	/* control char started (^) */
 #define	S_OCTAL2	5	/* octal digit 2 */
 #define	S_OCTAL3	6	/* octal digit 3 */
-#define	S_HEX1		7	/* hex digit */
-#define	S_HEX2		8	/* hex digit 2 */
+#define	S_HEX1		7	/* http hex digit */
+#define	S_HEX2		8	/* http hex digit 2 */
+#define S_MIME1		9	/* mime hex digit 1 */
+#define S_MIME2		10	/* mime hex digit 2 */
+#define S_EATCRNL	11	/* mime eating CRNL */
+#define S_AMP		12	/* seen & */
+#define S_NUMBER	13	/* collecting number */
+#define S_STRING	14	/* collecting string */
 
 #define	isoctal(c)	(((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
 #define xtod(c)		(isdigit(c) ? (c - '0') : ((tolower(c) - 'a') + 10))
+#define XTOD(c)		(isdigit(c) ? (c - '0') : ((c - 'A') + 10))
+
+/*
+ * RFC 1866
+ */
+static const struct nv {
+	const char *name;
+	uint8_t value;
+} nv[] = {
+	{ "AElig",	198 }, /* capital AE diphthong (ligature)  */
+	{ "Aacute",	193 }, /* capital A, acute accent  */
+	{ "Acirc",	194 }, /* capital A, circumflex accent  */
+	{ "Agrave",	192 }, /* capital A, grave accent  */
+	{ "Aring",	197 }, /* capital A, ring  */
+	{ "Atilde",	195 }, /* capital A, tilde  */
+	{ "Auml",	196 }, /* capital A, dieresis or umlaut mark  */
+	{ "Ccedil",	199 }, /* capital C, cedilla  */
+	{ "ETH",	208 }, /* capital Eth, Icelandic  */
+	{ "Eacute",	201 }, /* capital E, acute accent  */
+	{ "Ecirc",	202 }, /* capital E, circumflex accent  */
+	{ "Egrave",	200 }, /* capital E, grave accent  */
+	{ "Euml",	203 }, /* capital E, dieresis or umlaut mark  */
+	{ "Iacute",	205 }, /* capital I, acute accent  */
+	{ "Icirc",	206 }, /* capital I, circumflex accent  */
+	{ "Igrave",	204 }, /* capital I, grave accent  */
+	{ "Iuml",	207 }, /* capital I, dieresis or umlaut mark  */
+	{ "Ntilde",	209 }, /* capital N, tilde  */
+	{ "Oacute",	211 }, /* capital O, acute accent  */
+	{ "Ocirc",	212 }, /* capital O, circumflex accent  */
+	{ "Ograve",	210 }, /* capital O, grave accent  */
+	{ "Oslash",	216 }, /* capital O, slash  */
+	{ "Otilde",	213 }, /* capital O, tilde  */
+	{ "Ouml",	214 }, /* capital O, dieresis or umlaut mark  */
+	{ "THORN",	222 }, /* capital THORN, Icelandic  */
+	{ "Uacute",	218 }, /* capital U, acute accent  */
+	{ "Ucirc",	219 }, /* capital U, circumflex accent  */
+	{ "Ugrave",	217 }, /* capital U, grave accent  */
+	{ "Uuml",	220 }, /* capital U, dieresis or umlaut mark  */
+	{ "Yacute",	221 }, /* capital Y, acute accent  */
+	{ "aacute",	225 }, /* small a, acute accent  */
+	{ "acirc",	226 }, /* small a, circumflex accent  */
+	{ "acute",	180 }, /* acute accent  */
+	{ "aelig",	230 }, /* small ae diphthong (ligature)  */
+	{ "agrave",	224 }, /* small a, grave accent  */
+	{ "amp",	 38 }, /* ampersand  */
+	{ "aring",	229 }, /* small a, ring  */
+	{ "atilde",	227 }, /* small a, tilde  */
+	{ "auml",	228 }, /* small a, dieresis or umlaut mark  */
+	{ "brvbar",	166 }, /* broken (vertical) bar  */
+	{ "ccedil",	231 }, /* small c, cedilla  */
+	{ "cedil",	184 }, /* cedilla  */
+	{ "cent",	162 }, /* cent sign  */
+	{ "copy",	169 }, /* copyright sign  */
+	{ "curren",	164 }, /* general currency sign  */
+	{ "deg",	176 }, /* degree sign  */
+	{ "divide",	247 }, /* divide sign  */
+	{ "eacute",	233 }, /* small e, acute accent  */
+	{ "ecirc",	234 }, /* small e, circumflex accent  */
+	{ "egrave",	232 }, /* small e, grave accent  */
+	{ "eth",	240 }, /* small eth, Icelandic  */
+	{ "euml",	235 }, /* small e, dieresis or umlaut mark  */
+	{ "frac12",	189 }, /* fraction one-half  */
+	{ "frac14",	188 }, /* fraction one-quarter  */
+	{ "frac34",	190 }, /* fraction three-quarters  */
+	{ "gt",		 62 }, /* greater than  */
+	{ "iacute",	237 }, /* small i, acute accent  */
+	{ "icirc",	238 }, /* small i, circumflex accent  */
+	{ "iexcl",	161 }, /* inverted exclamation mark  */
+	{ "igrave",	236 }, /* small i, grave accent  */
+	{ "iquest",	191 }, /* inverted question mark  */
+	{ "iuml",	239 }, /* small i, dieresis or umlaut mark  */
+	{ "laquo",	171 }, /* angle quotation mark, left  */
+	{ "lt",		 60 }, /* less than  */
+	{ "macr",	175 }, /* macron  */
+	{ "micro",	181 }, /* micro sign  */
+	{ "middot",	183 }, /* middle dot  */
+	{ "nbsp",	160 }, /* no-break space  */
+	{ "not",	172 }, /* not sign  */
+	{ "ntilde",	241 }, /* small n, tilde  */
+	{ "oacute",	243 }, /* small o, acute accent  */
+	{ "ocirc",	244 }, /* small o, circumflex accent  */
+	{ "ograve",	242 }, /* small o, grave accent  */
+	{ "ordf",	170 }, /* ordinal indicator, feminine  */
+	{ "ordm",	186 }, /* ordinal indicator, masculine  */
+	{ "oslash",	248 }, /* small o, slash  */
+	{ "otilde",	245 }, /* small o, tilde  */
+	{ "ouml",	246 }, /* small o, dieresis or umlaut mark  */
+	{ "para",	182 }, /* pilcrow (paragraph sign)  */
+	{ "plusmn",	177 }, /* plus-or-minus sign  */
+	{ "pound",	163 }, /* pound sterling sign  */
+	{ "quot",	 34 }, /* double quote  */
+	{ "raquo",	187 }, /* angle quotation mark, right  */
+	{ "reg",	174 }, /* registered sign  */
+	{ "sect",	167 }, /* section sign  */
+	{ "shy",	173 }, /* soft hyphen  */
+	{ "sup1",	185 }, /* superscript one  */
+	{ "sup2",	178 }, /* superscript two  */
+	{ "sup3",	179 }, /* superscript three  */
+	{ "szlig",	223 }, /* small sharp s, German (sz ligature)  */
+	{ "thorn",	254 }, /* small thorn, Icelandic  */
+	{ "times",	215 }, /* multiply sign  */
+	{ "uacute",	250 }, /* small u, acute accent  */
+	{ "ucirc",	251 }, /* small u, circumflex accent  */
+	{ "ugrave",	249 }, /* small u, grave accent  */
+	{ "uml",	168 }, /* umlaut (dieresis)  */
+	{ "uuml",	252 }, /* small u, dieresis or umlaut mark  */
+	{ "yacute",	253 }, /* small y, acute accent  */
+	{ "yen",	165 }, /* yen sign  */
+	{ "yuml",	255 }, /* small y, dieresis or umlaut mark  */
+};
 
 /*
  * unvis - decode characters previously encoded by vis
  */
 int
-unvis(cp, c, astate, flag)
-	char *cp;
-	int c;
-	int *astate, flag;
+unvis(char *cp, int c, int *astate, int flag)
 {
 	unsigned char uc = (unsigned char)c;
+	unsigned char st, ia, is, lc;
+
+/*
+ * Bottom 8 bits of astate hold the state machine state.
+ * Top 8 bits hold the current character in the http 1866 nv string decoding
+ */
+#define GS(a)		((a) & 0xff)
+#define SS(a, b)	(((uint32_t)(a) << 24) | (b))
+#define GI(a)		((uint32_t)(a) >> 24)
 
 	_DIAGASSERT(cp != NULL);
 	_DIAGASSERT(astate != NULL);
+	st = GS(*astate);
 
 	if (flag & UNVIS_END) {
-		if (*astate == S_OCTAL2 || *astate == S_OCTAL3
-		    || *astate == S_HEX2) {
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+		switch (st) {
+		case S_OCTAL2:
+		case S_OCTAL3:
+		case S_HEX2:
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
+		case S_GROUND:
+			return UNVIS_NOCHAR;
+		default:
+			return UNVIS_SYNBAD;
 		}
-		return (*astate == S_GROUND ? UNVIS_NOCHAR : UNVIS_SYNBAD);
 	}
 
-	switch (*astate) {
+	switch (st) {
 
 	case S_GROUND:
 		*cp = 0;
-		if (c == '\\') {
-			*astate = S_START;
-			return (0);
-		}
-		if ((flag & VIS_HTTPSTYLE) && c == '%') {
-			*astate = S_HEX1;
-			return (0);
+		if ((flag & VIS_NOESCAPE) == 0 && c == '\\') {
+			*astate = SS(0, S_START);
+			return UNVIS_NOCHAR;
+		}
+		if ((flag & VIS_HTTP1808) && c == '%') {
+			*astate = SS(0, S_HEX1);
+			return UNVIS_NOCHAR;
+		}
+		if ((flag & VIS_HTTP1866) && c == '&') {
+			*astate = SS(0, S_AMP);
+			return UNVIS_NOCHAR;
+		}
+		if ((flag & VIS_MIMESTYLE) && c == '=') {
+			*astate = SS(0, S_MIME1);
+			return UNVIS_NOCHAR;
 		}
 		*cp = c;
-		return (UNVIS_VALID);
+		return UNVIS_VALID;
 
 	case S_START:
 		switch(c) {
 		case '\\':
 			*cp = c;
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case '0': case '1': case '2': case '3':
 		case '4': case '5': case '6': case '7':
 			*cp = (c - '0');
-			*astate = S_OCTAL2;
-			return (0);
+			*astate = SS(0, S_OCTAL2);
+			return UNVIS_NOCHAR;
 		case 'M':
 			*cp = (char)0200;
-			*astate = S_META;
-			return (0);
+			*astate = SS(0, S_META);
+			return UNVIS_NOCHAR;
 		case '^':
-			*astate = S_CTRL;
-			return (0);
+			*astate = SS(0, S_CTRL);
+			return UNVIS_NOCHAR;
 		case 'n':
 			*cp = '\n';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'r':
 			*cp = '\r';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'b':
 			*cp = '\b';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'a':
 			*cp = '\007';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'v':
 			*cp = '\v';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 't':
 			*cp = '\t';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'f':
 			*cp = '\f';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 's':
 			*cp = ' ';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case 'E':
 			*cp = '\033';
-			*astate = S_GROUND;
-			return (UNVIS_VALID);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
 		case '\n':
 			/*
 			 * hidden newline
 			 */
-			*astate = S_GROUND;
-			return (UNVIS_NOCHAR);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_NOCHAR;
 		case '$':
 			/*
 			 * hidden marker
 			 */
-			*astate = S_GROUND;
-			return (UNVIS_NOCHAR);
+			*astate = SS(0, S_GROUND);
+			return UNVIS_NOCHAR;
 		}
-		*astate = S_GROUND;
-		return (UNVIS_SYNBAD);
+		goto bad;
 
 	case S_META:
 		if (c == '-')
-			*astate = S_META1;
+			*astate = SS(0, S_META1);
 		else if (c == '^')
-			*astate = S_CTRL;
-		else {
-			*astate = S_GROUND;
-			return (UNVIS_SYNBAD);
-		}
-		return (0);
+			*astate = SS(0, S_CTRL);
+		else 
+			goto bad;
+		return UNVIS_NOCHAR;
 
 	case S_META1:
-		*astate = S_GROUND;
+		*astate = SS(0, S_GROUND);
 		*cp |= c;
-		return (UNVIS_VALID);
+		return UNVIS_VALID;
 
 	case S_CTRL:
 		if (c == '?')
 			*cp |= 0177;
 		else
 			*cp |= c & 037;
-		*astate = S_GROUND;
-		return (UNVIS_VALID);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALID;
 
 	case S_OCTAL2:	/* second possible octal digit */
 		if (isoctal(uc)) {
@@ -208,102 +349,206 @@ unvis(cp, c, astate, flag)
 			 * yes - and maybe a third
 			 */
 			*cp = (*cp << 3) + (c - '0');
-			*astate = S_OCTAL3;
-			return (0);
+			*astate = SS(0, S_OCTAL3);
+			return UNVIS_NOCHAR;
 		}
 		/*
 		 * no - done with current sequence, push back passed char
 		 */
-		*astate = S_GROUND;
-		return (UNVIS_VALIDPUSH);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALIDPUSH;
 
 	case S_OCTAL3:	/* third possible octal digit */
-		*astate = S_GROUND;
+		*astate = SS(0, S_GROUND);
 		if (isoctal(uc)) {
 			*cp = (*cp << 3) + (c - '0');
-			return (UNVIS_VALID);
+			return UNVIS_VALID;
 		}
 		/*
 		 * we were done, push back passed char
 		 */
-		return (UNVIS_VALIDPUSH);
+		return UNVIS_VALIDPUSH;
 
 	case S_HEX1:
 		if (isxdigit(uc)) {
 			*cp = xtod(uc);
-			*astate = S_HEX2;
-			return (0);
+			*astate = SS(0, S_HEX2);
+			return UNVIS_NOCHAR;
 		}
 		/*
 		 * no - done with current sequence, push back passed char
 		 */
-		*astate = S_GROUND;
-		return (UNVIS_VALIDPUSH);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALIDPUSH;
 
 	case S_HEX2:
 		*astate = S_GROUND;
 		if (isxdigit(uc)) {
 			*cp = xtod(uc) | (*cp << 4);
-			return (UNVIS_VALID);
+			return UNVIS_VALID;
+		}
+		return UNVIS_VALIDPUSH;
+
+	case S_MIME1:
+		if (uc == '\n' || uc == '\r') {
+			*astate = SS(0, S_EATCRNL);
+			return UNVIS_NOCHAR;
+		}
+		if (isxdigit(uc) && (isdigit(uc) || isupper(uc))) {
+			*cp = XTOD(uc);
+			*astate = SS(0, S_MIME2);
+			return UNVIS_NOCHAR;
+		}
+		goto bad;
+
+	case S_MIME2:
+		if (isxdigit(uc) && (isdigit(uc) || isupper(uc))) {
+			*astate = SS(0, S_GROUND);
+			*cp = XTOD(uc) | (*cp << 4);
+			return UNVIS_VALID;
 		}
-		return (UNVIS_VALIDPUSH);
+		goto bad;
+
+	case S_EATCRNL:
+		switch (uc) {
+		case '\r':
+		case '\n':
+			return UNVIS_NOCHAR;
+		case '=':
+			*astate = SS(0, S_MIME1);
+			return UNVIS_NOCHAR;
+		default:
+			*cp = uc;
+			*astate = SS(0, S_GROUND);
+			return UNVIS_VALID;
+		}
+
+	case S_AMP:
+		*cp = 0;
+		if (uc == '#') {
+			*astate = SS(0, S_NUMBER);
+			return UNVIS_NOCHAR;
+		}
+		*astate = SS(0, S_STRING);
+		/*FALLTHROUGH*/
+
+	case S_STRING:
+		ia = *cp;		/* index in the array */
+		is = GI(*astate);	/* index in the string */
+		lc = is == 0 ? 0 : nv[ia].name[is - 1];	/* last character */
+
+		if (uc == ';')
+			uc = '\0';
+
+		for (; ia < __arraycount(nv); ia++) {
+			if (is != 0 && nv[ia].name[is - 1] != lc)
+				goto bad;
+			if (nv[ia].name[is] == uc)
+				break;
+		}
+
+		if (ia == __arraycount(nv))
+			goto bad;
+
+		if (uc != 0) {
+			*cp = ia;
+			*astate = SS(is + 1, S_STRING);
+			return UNVIS_NOCHAR;
+		}
+
+		*cp = nv[ia].value;
+		*astate = SS(0, S_GROUND);
+		return UNVIS_VALID;
+
+	case S_NUMBER:
+		if (uc == ';')
+			return UNVIS_VALID;
+		if (!isdigit(uc))
+			goto bad;
+		*cp += (*cp * 10) + uc - '0';
+		return UNVIS_NOCHAR;
 
 	default:
+	bad:
 		/*
 		 * decoder in unknown state - (probably uninitialized)
 		 */
-		*astate = S_GROUND;
-		return (UNVIS_SYNBAD);
+		*astate = SS(0, S_GROUND);
+		return UNVIS_SYNBAD;
 	}
 }
 
 /*
- * strunvis - decode src into dst
+ * strnunvisx - decode src into dst
  *
  *	Number of chars decoded into dst is returned, -1 on error.
  *	Dst is null terminated.
  */
 
 int
-strunvisx(dst, src, flag)
-	char *dst;
-	const char *src;
-	int flag;
+strnunvisx(char *dst, size_t dlen, const char *src, int flag)
 {
 	char c;
-	char *start = dst;
+	char t, *start = dst;
 	int state = 0;
 
 	_DIAGASSERT(src != NULL);
 	_DIAGASSERT(dst != NULL);
+#define CHECKSPACE() \
+	do { \
+		if (dlen-- == 0) { \
+			errno = ENOSPC; \
+			return -1; \
+		} \
+	} while (/*CONSTCOND*/0)
 
 	while ((c = *src++) != '\0') {
  again:
-		switch (unvis(dst, c, &state, flag)) {
+		switch (unvis(&t, c, &state, flag)) {
 		case UNVIS_VALID:
-			dst++;
+			CHECKSPACE();
+			*dst++ = t;
 			break;
 		case UNVIS_VALIDPUSH:
-			dst++;
+			CHECKSPACE();
+			*dst++ = t;
 			goto again;
 		case 0:
 		case UNVIS_NOCHAR:
 			break;
+		case UNVIS_SYNBAD:
+			errno = EINVAL;
+			return -1;
 		default:
-			return (-1);
+			_DIAGASSERT(0);
+			errno = EINVAL;
+			return -1;
 		}
 	}
-	if (unvis(dst, c, &state, UNVIS_END) == UNVIS_VALID)
-		dst++;
+	if (unvis(&t, c, &state, UNVIS_END) == UNVIS_VALID) {
+		CHECKSPACE();
+		*dst++ = t;
+	}
+	CHECKSPACE();
 	*dst = '\0';
-	return (dst - start);
+	return (int)(dst - start);
+}
+
+int
+strunvisx(char *dst, const char *src, int flag)
+{
+	return strnunvisx(dst, (size_t)~0, src, flag);
+}
+
+int
+strunvis(char *dst, const char *src)
+{
+	return strnunvisx(dst, (size_t)~0, src, 0);
 }
 
 int
-strunvis(dst, src)
-	char *dst;
-	const char *src;
+strnunvis(char *dst, size_t dlen, const char *src)
 {
-	return strunvisx(dst, src, 0);
+	return strnunvisx(dst, dlen, src, 0);
 }
 #endif

=== modified file 'cmd-line-utils/libedit/np/vis.c'
--- a/cmd-line-utils/libedit/np/vis.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/np/vis.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: vis.c,v 1.38 2008/09/04 09:41:44 lukem Exp $	*/
+/*	$NetBSD: vis.c,v 1.44 2011/03/12 19:52:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1989, 1993
@@ -57,9 +57,15 @@
 
 #include "config.h"
 
+#include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
 #endif /* LIBC_SCCS and not lint */
 
+/* XXXMYSQL : Make compiler happy. */
+#ifdef _LIBC
+#include "namespace.h"
+#endif
+
 #include <sys/types.h>
 
 #include <assert.h>
@@ -68,15 +74,11 @@
 #else
 #include "np/vis.h"
 #endif
+#include <errno.h>
 #include <stdlib.h>
 
 #ifdef __weak_alias
-__weak_alias(strsvis,_strsvis)
-__weak_alias(strsvisx,_strsvisx)
-__weak_alias(strvis,_strvis)
 __weak_alias(strvisx,_strvisx)
-__weak_alias(svis,_svis)
-__weak_alias(vis,_vis)
 #endif
 
 #if !HAVE_VIS || !HAVE_SVIS
@@ -85,7 +87,7 @@ __weak_alias(vis,_vis)
 #include <stdio.h>
 #include <string.h>
 
-static char *do_svis(char *, int, int, int, const char *);
+static char *do_svis(char *, size_t *, int, int, int, const char *);
 
 #undef BELL
 #define BELL '\a'
@@ -94,6 +96,7 @@ static char *do_svis(char *, int, int, i
 #define iswhite(c)	(c == ' ' || c == '\t' || c == '\n')
 #define issafe(c)	(c == '\b' || c == BELL || c == '\r')
 #define xtoa(c)		"0123456789abcdef"[c]
+#define XTOA(c)		"0123456789ABCDEF"[c]
 
 #define MAXEXTRAS	5
 
@@ -120,14 +123,54 @@ do {									      \
  * This is do_hvis, for HTTP style (RFC 1808)
  */
 static char *
-do_hvis(char *dst, int c, int flag, int nextc, const char *extra)
+do_hvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
 {
-	if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) {
+
+	if ((isascii(c) && isalnum(c))
+	    /* safe */
+	    || c == '$' || c == '-' || c == '_' || c == '.' || c == '+'
+	    /* extra */
+	    || c == '!' || c == '*' || c == '\'' || c == '(' || c == ')'
+	    || c == ',') {
+		dst = do_svis(dst, dlen, c, flag, nextc, extra);
+	} else {
+		if (dlen) {
+			if (*dlen < 3)
+				return NULL;
+			*dlen -= 3;
+		}
 		*dst++ = '%';
 		*dst++ = xtoa(((unsigned int)c >> 4) & 0xf);
 		*dst++ = xtoa((unsigned int)c & 0xf);
+	}
+
+	return dst;
+}
+
+/*
+ * This is do_mvis, for Quoted-Printable MIME (RFC 2045)
+ * NB: No handling of long lines or CRLF.
+ */
+static char *
+do_mvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
+{
+	if ((c != '\n') &&
+	    /* Space at the end of the line */
+	    ((isspace(c) && (nextc == '\r' || nextc == '\n')) ||
+	    /* Out of range */
+	    (!isspace(c) && (c < 33 || (c > 60 && c < 62) || c > 126)) ||
+	    /* Specific char to be escaped */ 
+	    strchr("#$@[\\]^`{|}~", c) != NULL)) {
+		if (dlen) {
+			if (*dlen < 3)
+				return NULL;
+			*dlen -= 3;
+		}
+		*dst++ = '=';
+		*dst++ = XTOA(((unsigned int)c >> 4) & 0xf);
+		*dst++ = XTOA((unsigned int)c & 0xf);
 	} else {
-		dst = do_svis(dst, c, flag, nextc, extra);
+		dst = do_svis(dst, dlen, c, flag, nextc, extra);
 	}
 	return dst;
 }
@@ -142,16 +185,28 @@ do_hvis(char *dst, int c, int flag, int 
  *	      backslash-protected.
  */
 static char *
-do_svis(char *dst, int c, int flag, int nextc, const char *extra)
+do_svis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
 {
 	int isextra;
+	size_t odlen = dlen ? *dlen : 0;
+
 	isextra = strchr(extra, c) != NULL;
+#define HAVE(x) \
+	do { \
+		if (dlen) { \
+			if (*dlen < (x)) \
+				goto out; \
+			*dlen -= (x); \
+		} \
+	} while (/*CONSTCOND*/0)
 	if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) ||
 	    ((flag & VIS_SAFE) && issafe(c)))) {
+		HAVE(1);
 		*dst++ = c;
 		return dst;
 	}
 	if (flag & VIS_CSTYLE) {
+		HAVE(2);
 		switch (c) {
 		case '\n':
 			*dst++ = '\\'; *dst++ = 'n';
@@ -180,6 +235,7 @@ do_svis(char *dst, int c, int flag, int 
 		case '\0':
 			*dst++ = '\\'; *dst++ = '0';
 			if (isoctal(nextc)) {
+				HAVE(2);
 				*dst++ = '0';
 				*dst++ = '0';
 			}
@@ -189,57 +245,104 @@ do_svis(char *dst, int c, int flag, int 
 				*dst++ = '\\'; *dst++ = c;
 				return dst;
 			}
+			if (dlen)
+				*dlen = odlen;
 		}
 	}
 	if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) {
+		HAVE(4);
 		*dst++ = '\\';
 		*dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + '0';
 		*dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + '0';
 		*dst++ =			     (c	      & 07) + '0';
 	} else {
-		if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\';
+		if ((flag & VIS_NOSLASH) == 0) {
+			HAVE(1);
+			*dst++ = '\\';
+		}
+
 		if (c & 0200) {
+			HAVE(1);
 			c &= 0177; *dst++ = 'M';
 		}
+
 		if (iscntrl(c)) {
+			HAVE(2);
 			*dst++ = '^';
 			if (c == 0177)
 				*dst++ = '?';
 			else
 				*dst++ = c + '@';
 		} else {
+			HAVE(2);
 			*dst++ = '-'; *dst++ = c;
 		}
 	}
 	return dst;
+out:
+	*dlen = odlen;
+	return NULL;
 }
 
+typedef char *(*visfun_t)(char *, size_t *, int, int, int, const char *);
 
 /*
- * svis - visually encode characters, also encoding the characters
+ * Return the appropriate encoding function depending on the flags given.
+ */
+static visfun_t
+getvisfun(int flag)
+{
+	if (flag & VIS_HTTPSTYLE)
+		return do_hvis;
+	if (flag & VIS_MIMESTYLE)
+		return do_mvis;
+	return do_svis;
+}
+
+/*
+ * isnvis - visually encode characters, also encoding the characters
  *	  pointed to by `extra'
  */
-char *
-svis(char *dst, int c, int flag, int nextc, const char *extra)
+static char *
+isnvis(char *dst, size_t *dlen, int c, int flag, int nextc, const char *extra)
 {
 	char *nextra = NULL;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 	_DIAGASSERT(extra != NULL);
 	MAKEEXTRALIST(flag, nextra, extra);
 	if (!nextra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return NULL;
+		}
 		*dst = '\0';		/* can't create nextra, return "" */
 		return dst;
 	}
-	if (flag & VIS_HTTPSTYLE)
-		dst = do_hvis(dst, c, flag, nextc, nextra);
-	else
-		dst = do_svis(dst, c, flag, nextc, nextra);
+	f = getvisfun(flag);
+	dst = (*f)(dst, dlen, c, flag, nextc, nextra);
 	free(nextra);
+	if (dst == NULL || (dlen && *dlen == 0)) {
+		errno = ENOSPC;
+		return NULL;
+	}
 	*dst = '\0';
 	return dst;
 }
 
+char *
+svis(char *dst, int c, int flag, int nextc, const char *extra)
+{
+	return isnvis(dst, NULL, c, flag, nextc, extra);
+}
+
+char *
+snvis(char *dst, size_t dlen, int c, int flag, int nextc, const char *extra)
+{
+	return isnvis(dst, &dlen, c, flag, nextc, extra);
+}
+
 
 /*
  * strsvis, strsvisx - visually encode characters from src into dst
@@ -256,13 +359,14 @@ svis(char *dst, int c, int flag, int nex
  *	Strsvisx encodes exactly len bytes from src into dst.
  *	This is useful for encoding a block of data.
  */
-int
-strsvis(char *dst, const char *csrc, int flag, const char *extra)
+static int
+istrsnvis(char *dst, size_t *dlen, const char *csrc, int flag, const char *extra)
 {
 	int c;
 	char *start;
 	char *nextra = NULL;
 	const unsigned char *src = (const unsigned char *)csrc;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 	_DIAGASSERT(src != NULL);
@@ -272,52 +376,87 @@ strsvis(char *dst, const char *csrc, int
 		*dst = '\0';		/* can't create nextra, return "" */
 		return 0;
 	}
-	if (flag & VIS_HTTPSTYLE) {
-		for (start = dst; (c = *src++) != '\0'; /* empty */)
-			dst = do_hvis(dst, c, flag, *src, nextra);
-	} else {
-		for (start = dst; (c = *src++) != '\0'; /* empty */)
-			dst = do_svis(dst, c, flag, *src, nextra);
+	f = getvisfun(flag);
+	for (start = dst; (c = *src++) != '\0'; /* empty */) {
+		dst = (*f)(dst, dlen, c, flag, *src, nextra);
+		if (dst == NULL) {
+			errno = ENOSPC;
+			return -1;
+		}
 	}
 	free(nextra);
+	if (dlen && *dlen == 0) {
+		errno = ENOSPC;
+		return -1;
+	}
 	*dst = '\0';
-	return (dst - start);
+	return (int)(dst - start);
 }
 
+int
+strsvis(char *dst, const char *csrc, int flag, const char *extra)
+{
+	return istrsnvis(dst, NULL, csrc, flag, extra);
+}
 
 int
-strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra)
+strsnvis(char *dst, size_t dlen, const char *csrc, int flag, const char *extra)
+{
+	return istrsnvis(dst, &dlen, csrc, flag, extra);
+}
+
+static int
+istrsnvisx(char *dst, size_t *dlen, const char *csrc, size_t len, int flag,
+    const char *extra)
 {
 	unsigned char c;
 	char *start;
 	char *nextra = NULL;
 	const unsigned char *src = (const unsigned char *)csrc;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 	_DIAGASSERT(src != NULL);
 	_DIAGASSERT(extra != NULL);
 	MAKEEXTRALIST(flag, nextra, extra);
 	if (! nextra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return -1;
+		}
 		*dst = '\0';		/* can't create nextra, return "" */
 		return 0;
 	}
 
-	if (flag & VIS_HTTPSTYLE) {
-		for (start = dst; len > 0; len--) {
-			c = *src++;
-			dst = do_hvis(dst, c, flag,
-			    len > 1 ? *src : '\0', nextra);
-		}
-	} else {
-		for (start = dst; len > 0; len--) {
-			c = *src++;
-			dst = do_svis(dst, c, flag,
-			    len > 1 ? *src : '\0', nextra);
+	f = getvisfun(flag);
+	for (start = dst; len > 0; len--) {
+		c = *src++;
+		dst = (*f)(dst, dlen, c, flag, len > 1 ? *src : '\0', nextra);
+		if (dst == NULL) {
+			errno = ENOSPC;
+			return -1;
 		}
 	}
 	free(nextra);
+	if (dlen && *dlen == 0) {
+		errno = ENOSPC;
+		return -1;
+	}
 	*dst = '\0';
-	return (dst - start);
+	return (int)(dst - start);
+}
+
+int
+strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra)
+{
+	return istrsnvisx(dst, NULL, csrc, len, flag, extra);
+}
+
+int
+strsnvisx(char *dst, size_t dlen, const char *csrc, size_t len, int flag,
+    const char *extra)
+{
+	return istrsnvisx(dst, &dlen, csrc, len, flag, extra);
 }
 #endif
 
@@ -325,28 +464,47 @@ strsvisx(char *dst, const char *csrc, si
 /*
  * vis - visually encode characters
  */
-char *
-vis(char *dst, int c, int flag, int nextc)
+static char *
+invis(char *dst, size_t *dlen, int c, int flag, int nextc)
 {
 	char *extra = NULL;
 	unsigned char uc = (unsigned char)c;
+	visfun_t f;
 
 	_DIAGASSERT(dst != NULL);
 
 	MAKEEXTRALIST(flag, extra, "");
 	if (! extra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return NULL;
+		}
 		*dst = '\0';		/* can't create extra, return "" */
 		return dst;
 	}
-	if (flag & VIS_HTTPSTYLE)
-		dst = do_hvis(dst, uc, flag, nextc, extra);
-	else
-		dst = do_svis(dst, uc, flag, nextc, extra);
+	f = getvisfun(flag);
+	dst = (*f)(dst, dlen, uc, flag, nextc, extra);
 	free(extra);
+	if (dst == NULL || (dlen && *dlen == 0)) {
+		errno = ENOSPC;
+		return NULL;
+	}
 	*dst = '\0';
 	return dst;
 }
 
+char *
+vis(char *dst, int c, int flag, int nextc)
+{
+	return invis(dst, NULL, c, flag, nextc);
+}
+
+char *
+nvis(char *dst, size_t dlen, int c, int flag, int nextc)
+{
+	return invis(dst, &dlen, c, flag, nextc);
+}
+
 
 /*
  * strvis, strvisx - visually encode characters from src into dst
@@ -358,36 +516,68 @@ vis(char *dst, int c, int flag, int next
  *	Strvisx encodes exactly len bytes from src into dst.
  *	This is useful for encoding a block of data.
  */
-int
-strvis(char *dst, const char *src, int flag)
+static int
+istrnvis(char *dst, size_t *dlen, const char *src, int flag)
 {
 	char *extra = NULL;
 	int rv;
 
 	MAKEEXTRALIST(flag, extra, "");
 	if (!extra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return -1;
+		}
 		*dst = '\0';		/* can't create extra, return "" */
 		return 0;
 	}
-	rv = strsvis(dst, src, flag, extra);
+	rv = istrsnvis(dst, dlen, src, flag, extra);
 	free(extra);
 	return rv;
 }
 
+int
+strvis(char *dst, const char *src, int flag)
+{
+	return istrnvis(dst, NULL, src, flag);
+}
 
 int
-strvisx(char *dst, const char *src, size_t len, int flag)
+strnvis(char *dst, size_t dlen, const char *src, int flag)
+{
+	return istrnvis(dst, &dlen, src, flag);
+}
+
+static int
+istrnvisx(char *dst, size_t *dlen, const char *src, size_t len, int flag)
 {
 	char *extra = NULL;
 	int rv;
 
 	MAKEEXTRALIST(flag, extra, "");
 	if (!extra) {
+		if (dlen && *dlen == 0) {
+			errno = ENOSPC;
+			return -1;
+		}
 		*dst = '\0';		/* can't create extra, return "" */
 		return 0;
 	}
-	rv = strsvisx(dst, src, len, flag, extra);
+	rv = istrsnvisx(dst, dlen, src, len, flag, extra);
 	free(extra);
 	return rv;
 }
+
+int
+strvisx(char *dst, const char *src, size_t len, int flag)
+{
+	return istrnvisx(dst, NULL, src, len, flag);
+}
+
+int
+strnvisx(char *dst, size_t dlen, const char *src, size_t len, int flag)
+{
+	return istrnvisx(dst, &dlen, src, len, flag);
+}
+
 #endif

=== modified file 'cmd-line-utils/libedit/np/vis.h'
--- a/cmd-line-utils/libedit/np/vis.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/np/vis.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: vis.h,v 1.16 2005/09/13 01:44:32 christos Exp $	*/
+/*	$NetBSD: vis.h,v 1.19 2011/03/12 19:52:45 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -39,24 +39,29 @@
 /*
  * to select alternate encoding format
  */
-#define	VIS_OCTAL	0x01	/* use octal \ddd format */
-#define	VIS_CSTYLE	0x02	/* use \[nrft0..] where appropiate */
+#define	VIS_OCTAL	0x001	/* use octal \ddd format */
+#define	VIS_CSTYLE	0x002	/* use \[nrft0..] where appropiate */
 
 /*
  * to alter set of characters encoded (default is to encode all
  * non-graphic except space, tab, and newline).
  */
-#define	VIS_SP		0x04	/* also encode space */
-#define	VIS_TAB		0x08	/* also encode tab */
-#define	VIS_NL		0x10	/* also encode newline */
+#define	VIS_SP		0x004	/* also encode space */
+#define	VIS_TAB		0x008	/* also encode tab */
+#define	VIS_NL		0x010	/* also encode newline */
 #define	VIS_WHITE	(VIS_SP | VIS_TAB | VIS_NL)
-#define	VIS_SAFE	0x20	/* only encode "unsafe" characters */
+#define	VIS_SAFE	0x020	/* only encode "unsafe" characters */
 
 /*
  * other
  */
-#define	VIS_NOSLASH	0x40	/* inhibit printing '\' */
-#define	VIS_HTTPSTYLE	0x80	/* http-style escape % HEX HEX */
+#define	VIS_NOSLASH	0x040	/* inhibit printing '\' */
+#define	VIS_HTTP1808	0x080	/* http-style escape % hex hex */
+#define	VIS_HTTPSTYLE	0x080	/* http-style escape % hex hex */
+#define	VIS_MIMESTYLE	0x100	/* mime-style escape = HEX HEX */
+#define	VIS_HTTP1866	0x200	/* http-style &#num; or &string; */
+#define	VIS_NOESCAPE	0x400	/* don't decode `\' */
+#define	_VIS_END	0x800	/* for unvis */
 
 /*
  * unvis return codes
@@ -70,18 +75,41 @@
 /*
  * unvis flags
  */
-#define	UNVIS_END	1	/* no more characters */
+#define	UNVIS_END	_VIS_END	/* no more characters */
+#include <sys/cdefs.h>
+/* XXXMYSQL */
+#ifndef __RENAME
+#define __RENAME(x)
+#endif
 
 __BEGIN_DECLS
 char	*vis(char *, int, int, int);
+char	*nvis(char *, size_t, int, int, int);
+
 char	*svis(char *, int, int, int, const char *);
+char	*snvis(char *, size_t, int, int, int, const char *);
+
 int	strvis(char *, const char *, int);
+int	strnvis(char *, size_t, const char *, int);
+
 int	strsvis(char *, const char *, int, const char *);
+int	strsnvis(char *, size_t, const char *, int, const char *);
+
 int	strvisx(char *, const char *, size_t, int);
+int	strnvisx(char *, size_t, const char *, size_t, int);
+
 int	strsvisx(char *, const char *, size_t, int, const char *);
+int	strsnvisx(char *, size_t, const char *, size_t, int, const char *);
+
 int	strunvis(char *, const char *);
+int	strnunvis(char *, size_t, const char *);
+
 int	strunvisx(char *, const char *, int);
-int	unvis(char *, int, int *, int);
+int	strnunvisx(char *, size_t, const char *, int);
+
+#ifndef __LIBC12_SOURCE__
+int	unvis(char *, int, int *, int) __RENAME(__unvis50);
+#endif
 __END_DECLS
 
 #endif /* !_VIS_H_ */

=== modified file 'cmd-line-utils/libedit/parse.c'
--- a/cmd-line-utils/libedit/parse.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/parse.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.22 2005/05/29 04:58:15 lukem Exp $	*/
+/*	$NetBSD: parse.c,v 1.23 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -57,17 +57,17 @@ static char sccsid[] = "@(#)parse.c	8.1 
 #include <stdlib.h>
 
 private const struct {
-	const char *name;
-	int (*func)(EditLine *, int, const char **);
+	const Char *name;
+	int (*func)(EditLine *, int, const Char **);
 } cmds[] = {
-	{ "bind",	map_bind	},
-	{ "echotc",	term_echotc	},
-	{ "edit",	el_editmode	},
-	{ "history",	hist_command	},
-	{ "telltc",	term_telltc	},
-	{ "settc",	term_settc	},
-	{ "setty",	tty_stty	},
-	{ NULL,		NULL		}
+	{ STR("bind"),  	map_bind	},
+	{ STR("echotc"),	term_echotc	},
+	{ STR("edit"),  	el_editmode	},
+	{ STR("history"),	hist_command	},
+	{ STR("telltc"),	term_telltc	},
+	{ STR("settc"),	        term_settc	},
+	{ STR("setty"),	        tty_stty	},
+	{ NULL,		        NULL		}
 };
 
 
@@ -75,16 +75,16 @@ private const struct {
  *	Parse a line and dispatch it
  */
 protected int
-parse_line(EditLine *el, const char *line)
+parse_line(EditLine *el, const Char *line)
 {
-	const char **argv;
+	const Char **argv;
 	int argc;
-	Tokenizer *tok;
+	TYPE(Tokenizer) *tok;
 
-	tok = tok_init(NULL);
-	tok_str(tok, line, &argc, &argv);
-	argc = el_parse(el, argc, argv);
-	tok_end(tok);
+	tok = FUN(tok,init)(NULL);
+	FUN(tok,str)(tok, line, &argc, &argv);
+	argc = FUN(el,parse)(el, argc, argv);
+	FUN(tok,end)(tok);
 	return (argc);
 }
 
@@ -93,25 +93,25 @@ parse_line(EditLine *el, const char *lin
  *	Command dispatcher
  */
 public int
-el_parse(EditLine *el, int argc, const char *argv[])
+FUN(el,parse)(EditLine *el, int argc, const Char *argv[])
 {
-	const char *ptr;
+	const Char *ptr;
 	int i;
 
 	if (argc < 1)
 		return (-1);
-	ptr = strchr(argv[0], ':');
+	ptr = Strchr(argv[0], ':');
 	if (ptr != NULL) {
-		char *tprog;
+		Char *tprog;
 		size_t l;
 
 		if (ptr == argv[0])
 			return (0);
 		l = ptr - argv[0] - 1;
-		tprog = (char *) el_malloc(l + 1);
+		tprog = el_malloc((l + 1) * sizeof(*tprog));
 		if (tprog == NULL)
 			return (0);
-		(void) strncpy(tprog, argv[0], l);
+		(void) Strncpy(tprog, argv[0], l);
 		tprog[l] = '\0';
 		ptr++;
 		l = el_match(el->el_prog, tprog);
@@ -122,7 +122,7 @@ el_parse(EditLine *el, int argc, const c
 		ptr = argv[0];
 
 	for (i = 0; cmds[i].name != NULL; i++)
-		if (strcmp(cmds[i].name, ptr) == 0) {
+		if (Strcmp(cmds[i].name, ptr) == 0) {
 			i = (*cmds[i].func) (el, argc, argv);
 			return (-i);
 		}
@@ -131,14 +131,14 @@ el_parse(EditLine *el, int argc, const c
 
 
 /* parse__escape():
- *	Parse a string of the form ^<char> \<odigit> \<char> and return
+ *	Parse a string of the form ^<char> \<odigit> \<char> \U+xxxx and return
  *	the appropriate character or -1 if the escape is not valid
  */
 protected int
-parse__escape(const char **ptr)
+parse__escape(const Char **ptr)
 {
-	const char *p;
-	int c;
+	const Char *p;
+	Int c;
 
 	p = *ptr;
 
@@ -172,6 +172,28 @@ parse__escape(const char **ptr)
 		case 'e':
 			c = '\033';	/* Escape */
 			break;
+                case 'U':               /* Unicode \U+xxxx or \U+xxxxx format */
+                {
+                        int i;
+                        const Char hex[] = STR("0123456789ABCDEF");
+                        const Char *h;
+                        ++p;
+                        if (*p++ != '+')
+                                return (-1);
+			c = 0;
+                        for (i = 0; i < 5; ++i) {
+                                h = Strchr(hex, *p++);
+                                if (!h && i < 4)
+                                        return (-1);
+                                else if (h)
+                                        c = (c << 4) | ((int)(h - hex));
+                                else
+                                        --p;
+                        }
+                        if (c > 0x10FFFF) /* outside valid character range */
+                                return -1;
+                        break;
+                }
 		case '0':
 		case '1':
 		case '2':
@@ -212,10 +234,10 @@ parse__escape(const char **ptr)
 /* parse__string():
  *	Parse the escapes from in and put the raw string out
  */
-protected char *
-parse__string(char *out, const char *in)
+protected Char *
+parse__string(Char *out, const Char *in)
 {
-	char *rv = out;
+	Char *rv = out;
 	int n;
 
 	for (;;)
@@ -251,12 +273,12 @@ parse__string(char *out, const char *in)
  *	or -1 if one is not found
  */
 protected int
-parse_cmd(EditLine *el, const char *cmd)
+parse_cmd(EditLine *el, const Char *cmd)
 {
 	el_bindings_t *b;
 
 	for (b = el->el_map.help; b->name != NULL; b++)
-		if (strcmp(b->name, cmd) == 0)
+		if (Strcmp(b->name, cmd) == 0)
 			return (b->func);
 	return (-1);
 }

=== modified file 'cmd-line-utils/libedit/parse.h'
--- a/cmd-line-utils/libedit/parse.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/parse.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.h,v 1.6 2005/05/29 04:58:15 lukem Exp $	*/
+/*	$NetBSD: parse.h,v 1.7 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,9 +40,9 @@
 #ifndef _h_el_parse
 #define	_h_el_parse
 
-protected int	 parse_line(EditLine *, const char *);
-protected int	 parse__escape(const char **);
-protected char	*parse__string(char *, const char *);
-protected int	 parse_cmd(EditLine *, const char *);
+protected int	 parse_line(EditLine *, const Char *);
+protected int	 parse__escape(const Char **);
+protected Char	*parse__string(Char *, const Char *);
+protected int	 parse_cmd(EditLine *, const Char *);
 
 #endif /* _h_el_parse */

=== modified file 'cmd-line-utils/libedit/prompt.c'
--- a/cmd-line-utils/libedit/prompt.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/prompt.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: prompt.c,v 1.11 2003/08/07 16:44:32 agc Exp $	*/
+/*	$NetBSD: prompt.c,v 1.18 2009/12/31 15:58:26 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -46,17 +46,17 @@ static char sccsid[] = "@(#)prompt.c	8.1
 #include <stdio.h>
 #include "el.h"
 
-private char	*prompt_default(EditLine *);
-private char	*prompt_default_r(EditLine *);
+private Char	*prompt_default(EditLine *);
+private Char	*prompt_default_r(EditLine *);
 
 /* prompt_default():
  *	Just a default prompt, in case the user did not provide one
  */
-private char *
+private Char *
 /*ARGSUSED*/
 prompt_default(EditLine *el __attribute__((__unused__)))
 {
-	static char a[3] = {'?', ' ', '\0'};
+	static Char a[3] = {'?', ' ', '\0'};
 
 	return (a);
 }
@@ -65,11 +65,11 @@ prompt_default(EditLine *el __attribute_
 /* prompt_default_r():
  *	Just a default rprompt, in case the user did not provide one
  */
-private char *
+private Char *
 /*ARGSUSED*/
 prompt_default_r(EditLine *el __attribute__((__unused__)))
 {
-	static char a[1] = {'\0'};
+	static Char a[1] = {'\0'};
 
 	return (a);
 }
@@ -77,23 +77,35 @@ prompt_default_r(EditLine *el __attribut
 
 /* prompt_print():
  *	Print the prompt and update the prompt position.
- *	We use an array of integers in case we want to pass
- * 	literal escape sequences in the prompt and we want a
- *	bit to flag them
  */
 protected void
 prompt_print(EditLine *el, int op)
 {
 	el_prompt_t *elp;
-	char *p;
+	Char *p;
+	int ignore = 0;
 
 	if (op == EL_PROMPT)
 		elp = &el->el_prompt;
 	else
 		elp = &el->el_rprompt;
-	p = (elp->p_func) (el);
-	while (*p)
-		re_putc(el, *p++, 1);
+
+	if (elp->p_wide)
+		p = (*elp->p_func)(el);
+	else
+		p = ct_decode_string((char *)(void *)(*elp->p_func)(el),
+		    &el->el_scratch);
+
+	for (; *p; p++) {
+		if (elp->p_ignore == *p) {
+			ignore = !ignore;
+			continue;
+		}
+		if (ignore)
+			term__putc(el, *p);
+		else
+			re_putc(el, *p, 1);
+	}
 
 	elp->p_pos.v = el->el_refresh.r_cursor.v;
 	elp->p_pos.h = el->el_refresh.r_cursor.h;
@@ -110,10 +122,12 @@ prompt_init(EditLine *el)
 	el->el_prompt.p_func = prompt_default;
 	el->el_prompt.p_pos.v = 0;
 	el->el_prompt.p_pos.h = 0;
+	el->el_prompt.p_ignore = '\0';
 	el->el_rprompt.p_func = prompt_default_r;
 	el->el_rprompt.p_pos.v = 0;
 	el->el_rprompt.p_pos.h = 0;
-	return (0);
+	el->el_rprompt.p_ignore = '\0';
+	return 0;
 }
 
 
@@ -131,24 +145,31 @@ prompt_end(EditLine *el __attribute__((_
  *	Install a prompt printing function
  */
 protected int
-prompt_set(EditLine *el, el_pfunc_t prf, int op)
+prompt_set(EditLine *el, el_pfunc_t prf, Char c, int op, int wide)
 {
 	el_prompt_t *p;
 
-	if (op == EL_PROMPT)
+	if (op == EL_PROMPT || op == EL_PROMPT_ESC)
 		p = &el->el_prompt;
 	else
 		p = &el->el_rprompt;
+
 	if (prf == NULL) {
-		if (op == EL_PROMPT)
+		if (op == EL_PROMPT || op == EL_PROMPT_ESC)
 			p->p_func = prompt_default;
 		else
 			p->p_func = prompt_default_r;
-	} else
+	} else {
 		p->p_func = prf;
+	}
+
+	p->p_ignore = c;
+
 	p->p_pos.v = 0;
 	p->p_pos.h = 0;
-	return (0);
+	p->p_wide = wide;
+
+	return 0;
 }
 
 
@@ -156,14 +177,22 @@ prompt_set(EditLine *el, el_pfunc_t prf,
  *	Retrieve the prompt printing function
  */
 protected int
-prompt_get(EditLine *el, el_pfunc_t *prf, int op)
+prompt_get(EditLine *el, el_pfunc_t *prf, Char *c, int op)
 {
+	el_prompt_t *p;
 
 	if (prf == NULL)
-		return (-1);
+		return -1;
+
 	if (op == EL_PROMPT)
-		*prf = el->el_prompt.p_func;
+		p = &el->el_prompt;
 	else
-		*prf = el->el_rprompt.p_func;
-	return (0);
+		p = &el->el_rprompt;
+
+	if (prf)
+		*prf = p->p_func;
+	if (c)
+		*c = p->p_ignore;
+
+	return 0;
 }

=== modified file 'cmd-line-utils/libedit/prompt.h'
--- a/cmd-line-utils/libedit/prompt.h	2005-04-21 10:06:46 +0000
+++ b/cmd-line-utils/libedit/prompt.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: prompt.h,v 1.6 2003/08/07 16:44:32 agc Exp $	*/
+/*	$NetBSD: prompt.h,v 1.10 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -42,16 +42,18 @@
 
 #include "histedit.h"
 
-typedef char * (*el_pfunc_t)(EditLine*);
+typedef Char    *(*el_pfunc_t)(EditLine *);
 
 typedef struct el_prompt_t {
-	el_pfunc_t	p_func;	/* Function to return the prompt	*/
-	coord_t		p_pos;	/* position in the line after prompt	*/
+	el_pfunc_t	p_func;		/* Function to return the prompt */
+	coord_t		p_pos;		/* position in the line after prompt */
+	Char		p_ignore;	/* character to start/end literal */
+	int		p_wide;	
 } el_prompt_t;
 
 protected void	prompt_print(EditLine *, int);
-protected int	prompt_set(EditLine *, el_pfunc_t, int);
-protected int	prompt_get(EditLine *, el_pfunc_t *, int);
+protected int	prompt_set(EditLine *, el_pfunc_t, Char, int, int);
+protected int	prompt_get(EditLine *, el_pfunc_t *, Char *, int);
 protected int	prompt_init(EditLine *);
 protected void	prompt_end(EditLine *);
 

=== modified file 'cmd-line-utils/libedit/read.c'
--- a/cmd-line-utils/libedit/read.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/read.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: read.c,v 1.43 2009/02/05 19:15:44 christos Exp $	*/
+/*	$NetBSD: read.c,v 1.58 2011/02/18 20:53:05 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -48,14 +48,15 @@ static char sccsid[] = "@(#)read.c	8.1 (
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <limits.h>
 #include "el.h"
 
-#define	OKCMD	-1
+#define	OKCMD	-1	/* must be -1! */
 
 private int	read__fixio(int, int);
 private int	read_preread(EditLine *);
-private int	read_char(EditLine *, char *);
-private int	read_getcmd(EditLine *, el_action_t *, char *);
+private int	read_char(EditLine *, Char *);
+private int	read_getcmd(EditLine *, el_action_t *, Char *);
 private void	read_pop(c_macro_t *);
 
 /* read_init():
@@ -190,6 +191,9 @@ read_preread(EditLine *el)
 	if (el->el_tty.t_mode == ED_IO)
 		return (0);
 
+#ifndef WIDECHAR
+/* FIONREAD attempts to buffer up multiple bytes, and to make that work
+ * properly with partial wide/UTF-8 characters would need some careful work. */
 #ifdef FIONREAD
 	(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs);
 	if (chrs > 0) {
@@ -203,7 +207,7 @@ read_preread(EditLine *el)
 		}
 	}
 #endif /* FIONREAD */
-
+#endif
 	return (chrs > 0);
 }
 
@@ -212,13 +216,13 @@ read_preread(EditLine *el)
  *	Push a macro
  */
 public void
-el_push(EditLine *el, const char *str)
+FUN(el,push)(EditLine *el, const Char *str)
 {
 	c_macro_t *ma = &el->el_chared.c_macro;
 
 	if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
 		ma->level++;
-		if ((ma->macro[ma->level] = el_strdup(str)) != NULL)
+		if ((ma->macro[ma->level] = Strdup(str)) != NULL)
 			return;
 		ma->level--;
 	}
@@ -229,16 +233,20 @@ el_push(EditLine *el, const char *str)
 
 /* read_getcmd():
  *	Return next command from the input stream.
+ *	Character values > 255 are not looked up in the map, but inserted.
  */
 private int
-read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
+read_getcmd(EditLine *el, el_action_t *cmdnum, Char *ch)
 {
 	el_action_t cmd;
 	int num;
 
+	el->el_errno = 0;
 	do {
-		if ((num = el_getc(el, ch)) != 1)	/* if EOF or error */
+		if ((num = FUN(el,getc)(el, ch)) != 1) {/* if EOF or error */
+			el->el_errno = num == 0 ? 0 : errno;
 			return (num);
+		}
 
 #ifdef	KANJI
 		if ((*ch & 0200)) {
@@ -252,7 +260,12 @@ read_getcmd(EditLine *el, el_action_t *c
 			el->el_state.metanext = 0;
 			*ch |= 0200;
 		}
-		cmd = el->el_map.current[(unsigned char) *ch];
+#ifdef WIDECHAR
+                if (*ch >= N_KEYS)
+                        cmd = ED_INSERT;
+		else
+#endif
+                        cmd = el->el_map.current[(unsigned char) *ch];
 		if (cmd == ED_SEQUENCE_LEAD_IN) {
 			key_value_t val;
 			switch (key_get(el, ch, &val)) {
@@ -260,7 +273,7 @@ read_getcmd(EditLine *el, el_action_t *c
 				cmd = val.cmd;
 				break;
 			case XK_STR:
-				el_push(el, val.str);
+				FUN(el,push)(el, val.str);
 				break;
 #ifdef notyet
 			case XK_EXE:
@@ -280,25 +293,74 @@ read_getcmd(EditLine *el, el_action_t *c
 	return (OKCMD);
 }
 
+#ifdef WIDECHAR
+/* utf8_islead():
+ *      Test whether a byte is a leading byte of a UTF-8 sequence.
+ */
+private int
+utf8_islead(unsigned char c)
+{
+        return (c < 0x80) ||             /* single byte char */
+               (c >= 0xc2 && c <= 0xf4); /* start of multibyte sequence */
+}
+#endif
 
 /* read_char():
  *	Read a character from the tty.
  */
 private int
-read_char(EditLine *el, char *cp)
+read_char(EditLine *el, Char *cp)
 {
-	int num_read;
+	ssize_t num_read;
 	int tried = 0;
-
-	while ((num_read = read(el->el_infd, cp, 1)) == -1)
+        char cbuf[MB_LEN_MAX];
+        int cbp = 0;
+        int bytes = 0;
+
+ again:
+	el->el_signal->sig_no = 0;
+	while ((num_read = read(el->el_infd, cbuf + cbp, 1)) == -1) {
+		switch (el->el_signal->sig_no) {
+		case SIGCONT:
+			el_set(el, EL_REFRESH);
+			/*FALLTHROUGH*/
+		case SIGWINCH:
+			sig_set(el);
+			goto again;
+		default:
+			break;
+		}
 		if (!tried && read__fixio(el->el_infd, errno) == 0)
 			tried = 1;
 		else {
 			*cp = '\0';
 			return (-1);
 		}
+	}
 
-	return (num_read);
+#ifdef WIDECHAR
+	if (el->el_flags & CHARSET_IS_UTF8) {
+		if (!utf8_islead((unsigned char)cbuf[0]))
+			goto again; /* discard the byte we read and try again */
+		++cbp;
+		if ((bytes = ct_mbtowc(cp, cbuf, cbp)) == -1) {
+			ct_mbtowc_reset;
+			if (cbp >= MB_LEN_MAX) { /* "shouldn't happen" */
+				*cp = '\0';
+				return (-1);
+			}
+			goto again;
+		}
+	} else  /* we don't support other multibyte charsets */
+#endif
+		*cp = (unsigned char)cbuf[0];
+
+	if ((el->el_flags & IGNORE_EXTCHARS) && bytes > 1) {
+		cbp = 0; /* skip this character */
+		goto again;
+	}
+
+	return (int)num_read;
 }
 
 /* read_pop():
@@ -310,8 +372,9 @@ read_pop(c_macro_t *ma)
 	int i;
 
 	el_free(ma->macro[0]);
-	for (i = ma->level--; i > 0; i--)
-		ma->macro[i - 1] = ma->macro[i];
+	for (i = 0; i < ma->level; i++)
+		ma->macro[i] = ma->macro[i + 1];
+	ma->level--;
 	ma->offset = 0;
 }
 
@@ -319,7 +382,7 @@ read_pop(c_macro_t *ma)
  *	Read a character
  */
 public int
-el_getc(EditLine *el, char *cp)
+FUN(el,getc)(EditLine *el, Char *cp)
 {
 	int num_read;
 	c_macro_t *ma = &el->el_chared.c_macro;
@@ -339,7 +402,7 @@ el_getc(EditLine *el, char *cp)
 			continue;
 		}
 
-		*cp = ma->macro[0][ma->offset++] & 0377;
+		*cp = ma->macro[0][ma->offset++];
 
 		if (ma->macro[0][ma->offset] == '\0') {
 			/* Needed for QuoteMode On */
@@ -359,6 +422,10 @@ el_getc(EditLine *el, char *cp)
 	(void) fprintf(el->el_errfile, "Reading a character\n");
 #endif /* DEBUG_READ */
 	num_read = (*el->el_read.read_char)(el, cp);
+#ifdef WIDECHAR
+	if (el->el_flags & NARROW_READ)
+		*cp = *(char *)(void *)cp;
+#endif
 #ifdef DEBUG_READ
 	(void) fprintf(el->el_errfile, "Got it %c\n", *cp);
 #endif /* DEBUG_READ */
@@ -395,23 +462,28 @@ read_finish(EditLine *el)
 		sig_clr(el);
 }
 
-public const char *
-el_gets(EditLine *el, int *nread)
+public const Char *
+FUN(el,gets)(EditLine *el, int *nread)
 {
 	int retval;
 	el_action_t cmdnum = 0;
 	int num;		/* how many chars we have read at NL */
-	char ch;
+	Char ch, *cp;
 	int crlf = 0;
+	int nrb;
 #ifdef FIONREAD
 	c_macro_t *ma = &el->el_chared.c_macro;
 #endif /* FIONREAD */
 
+	if (nread == NULL)
+		nread = &nrb;
+	*nread = 0;
+
 	if (el->el_flags & NO_TTY) {
-		char *cp = el->el_line.buffer;
 		size_t idx;
 
-		while ((*el->el_read.read_char)(el, cp) == 1) {
+		cp = el->el_line.buffer;
+		while ((num = (*el->el_read.read_char)(el, cp)) == 1) {
 			/* make sure there is space for next character */
 			if (cp + 1 >= el->el_line.limit) {
 				idx = (cp - el->el_line.buffer);
@@ -425,12 +497,13 @@ el_gets(EditLine *el, int *nread)
 			if (cp[-1] == '\r' || cp[-1] == '\n')
 				break;
 		}
+		if (num == -1) {
+			if (errno == EINTR)
+				cp = el->el_line.buffer;
+			el->el_errno = errno;
+		}
 
-		el->el_line.cursor = el->el_line.lastchar = cp;
-		*cp = '\0';
-		if (nread)
-			*nread = el->el_line.cursor - el->el_line.buffer;
-		return (el->el_line.buffer);
+		goto noedit;
 	}
 
 
@@ -441,8 +514,8 @@ el_gets(EditLine *el, int *nread)
 		(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs);
 		if (chrs == 0) {
 			if (tty_rawmode(el) < 0) {
-				if (nread)
-					*nread = 0;
+				errno = 0;
+				*nread = 0;
 				return (NULL);
 			}
 		}
@@ -453,8 +526,8 @@ el_gets(EditLine *el, int *nread)
 		read_prepare(el);
 
 	if (el->el_flags & EDIT_DISABLED) {
-		char *cp;
 		size_t idx;
+
 		if ((el->el_flags & UNBUFFERED) == 0)
 			cp = el->el_line.buffer;
 		else
@@ -462,7 +535,7 @@ el_gets(EditLine *el, int *nread)
 
 		term__flush(el);
 
-		while ((*el->el_read.read_char)(el, cp) == 1) {
+		while ((num = (*el->el_read.read_char)(el, cp)) == 1) {
 			/* make sure there is space next character */
 			if (cp + 1 >= el->el_line.limit) {
 				idx = (cp - el->el_line.buffer);
@@ -470,8 +543,6 @@ el_gets(EditLine *el, int *nread)
 					break;
 				cp = &el->el_line.buffer[idx];
 			}
-			if (*cp == 4)	/* ought to be stty eof */
-				break;
 			cp++;
 			crlf = cp[-1] == '\r' || cp[-1] == '\n';
 			if (el->el_flags & UNBUFFERED)
@@ -480,11 +551,13 @@ el_gets(EditLine *el, int *nread)
 				break;
 		}
 
-		el->el_line.cursor = el->el_line.lastchar = cp;
-		*cp = '\0';
-		if (nread)
-			*nread = el->el_line.cursor - el->el_line.buffer;
-		return (el->el_line.buffer);
+		if (num == -1) {
+			if (errno == EINTR)
+				cp = el->el_line.buffer;
+			el->el_errno = errno;
+		}
+
+		goto noedit;
 	}
 
 	for (num = OKCMD; num == OKCMD;) {	/* while still editing this
@@ -500,6 +573,12 @@ el_gets(EditLine *el, int *nread)
 #endif /* DEBUG_READ */
 			break;
 		}
+		if (el->el_errno == EINTR) {
+			el->el_line.buffer[0] = '\0';
+			el->el_line.lastchar =
+			    el->el_line.cursor = el->el_line.buffer;
+			break;
+		}
 		if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) {	/* BUG CHECK command */
 #ifdef DEBUG_EDIT
 			(void) fprintf(el->el_errfile,
@@ -530,7 +609,7 @@ el_gets(EditLine *el, int *nread)
 		    el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) {
 			if (cmdnum == VI_DELETE_PREV_CHAR &&
 			    el->el_chared.c_redo.pos != el->el_chared.c_redo.buf
-			    && el_isprint((unsigned char)el->el_chared.c_redo.pos[-1]))
+			    && Isprint(el->el_chared.c_redo.pos[-1]))
 				el->el_chared.c_redo.pos--;
 			else
 				*el->el_chared.c_redo.pos++ = ch;
@@ -582,7 +661,7 @@ el_gets(EditLine *el, int *nread)
 			break;
 
 		case CC_NEWLINE:	/* normal end of line */
-			num = el->el_line.lastchar - el->el_line.buffer;
+			num = (int)(el->el_line.lastchar - el->el_line.buffer);
 			break;
 
 		case CC_FATAL:	/* fatal error, reset to known state */
@@ -617,11 +696,22 @@ el_gets(EditLine *el, int *nread)
 	/* make sure the tty is set up correctly */
 	if ((el->el_flags & UNBUFFERED) == 0) {
 		read_finish(el);
-		if (nread)
-			*nread = num;
+		*nread = num != -1 ? num : 0;
 	} else {
-		if (nread)
-			*nread = el->el_line.lastchar - el->el_line.buffer;
+		*nread = (int)(el->el_line.lastchar - el->el_line.buffer);
 	}
-	return (num ? el->el_line.buffer : NULL);
+	goto done;
+noedit:
+	el->el_line.cursor = el->el_line.lastchar = cp;
+	*cp = '\0';
+	*nread = (int)(el->el_line.cursor - el->el_line.buffer);
+done:
+	if (*nread == 0) {
+		if (num == -1) {
+			*nread = -1;
+			errno = el->el_errno;
+		}
+		return NULL;
+	} else
+		return el->el_line.buffer;
 }

=== modified file 'cmd-line-utils/libedit/read.h'
--- a/cmd-line-utils/libedit/read.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/read.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: read.h,v 1.6 2008/04/29 06:53:01 martin Exp $	*/
+/*	$NetBSD: read.h,v 1.7 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 #ifndef	_h_el_read
 #define	_h_el_read
 
-typedef int (*el_rfunc_t)(EditLine *, char *);
+typedef int (*el_rfunc_t)(EditLine *, Char *);
 
 typedef struct el_read_t {
 	el_rfunc_t	read_char;	/* Function to read a character */

=== modified file 'cmd-line-utils/libedit/readline.c'
--- a/cmd-line-utils/libedit/readline.c	2010-10-19 22:51:34 +0000
+++ b/cmd-line-utils/libedit/readline.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: readline.c,v 1.78 2009/02/05 19:15:26 christos Exp $	*/
+/*	$NetBSD: readline.c,v 1.92 2010/09/16 20:08:51 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -69,6 +69,7 @@ void rl_deprep_terminal(void);
 /* readline compatibility stuff - look at readline sources/documentation */
 /* to see what these variables mean */
 const char *rl_library_version = "EditLine wrapper";
+int rl_readline_version = RL_READLINE_VERSION;
 static char empty[] = { '\0' };
 static char expand_chars[] = { ' ', '\t', '\n', '=', '(', '\0' };
 static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
@@ -117,6 +118,7 @@ Function *rl_startup_hook = NULL;
 VFunction *rl_completion_display_matches_hook = NULL;
 VFunction *rl_prep_term_function = (VFunction *)rl_prep_terminal;
 VFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal;
+KEYMAP_ENTRY_ARRAY emacs_meta_keymap;
 
 /*
  * The current prompt string.
@@ -213,6 +215,33 @@ _getc_function(EditLine *el __attribute_
 	return 1;
 }
 
+static void
+_resize_fun(EditLine *el, void *a)
+{
+	const LineInfo *li;
+	char **ap = a;
+
+	li = el_line(el);
+	/* a cheesy way to get rid of const cast. */
+	*ap = memchr(li->buffer, *li->buffer, 1);
+}
+
+static const char _dothistory[] = "/.history";
+
+static const char *
+_default_history_file(void)
+{
+	struct passwd *p;
+	static char path[PATH_MAX];
+
+	if (*path)
+		return path;
+	if ((p = getpwuid(getuid())) == NULL)
+		return NULL;
+	strlcpy(path, p->pw_dir, PATH_MAX);
+	strlcat(path, _dothistory, PATH_MAX);
+	return path;
+}
 
 /*
  * READLINE compatibility stuff
@@ -224,6 +253,8 @@ _getc_function(EditLine *el __attribute_
 int
 rl_set_prompt(const char *prompt)
 {
+	char *p;
+
 	if (!prompt)
 		prompt = "";
 	if (rl_prompt != NULL && strcmp(rl_prompt, prompt) == 0) 
@@ -231,7 +262,13 @@ rl_set_prompt(const char *prompt)
 	if (rl_prompt)
 		free(rl_prompt);
 	rl_prompt = strdup(prompt);
-	return rl_prompt == NULL ? -1 : 0;
+	if (rl_prompt == NULL)
+		return -1;
+
+	while ((p = strchr(rl_prompt, RL_PROMPT_END_IGNORE)) != NULL)
+		*p = RL_PROMPT_START_IGNORE;
+
+	return 0;
 }
 
 /*
@@ -241,7 +278,6 @@ int
 rl_initialize(void)
 {
 	HistEvent ev;
-	const LineInfo *li;
 	int editmode = 1;
 	struct termios t;
 
@@ -275,6 +311,9 @@ rl_initialize(void)
 	max_input_history = INT_MAX;
 	el_set(e, EL_HIST, history, h);
 
+	/* Setup resize function */
+	el_set(e, EL_RESIZE, _resize_fun, &rl_line_buffer);
+
 	/* setup getc function if valid */
 	if (rl_getc_function)
 		el_set(e, EL_GETCFN, _getc_function);
@@ -285,7 +324,7 @@ rl_initialize(void)
 		el_end(e);
 		return -1;
 	}
-	el_set(e, EL_PROMPT, _get_prompt);
+	el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);
 	el_set(e, EL_SIGNAL, rl_catch_signals);
 
 	/* set default mode to "emacs"-style and read setting afterwards */
@@ -320,9 +359,7 @@ rl_initialize(void)
 	 * Unfortunately, some applications really do use rl_point
 	 * and rl_line_buffer directly.
 	 */
-	li = el_line(e);
-	/* a cheesy way to get rid of const cast. */
-	rl_line_buffer = memchr(li->buffer, *li->buffer, 1);
+	_resize_fun(e, &rl_line_buffer);
 	_rl_update_pos();
 
 	if (rl_startup_hook)
@@ -478,7 +515,7 @@ get_history_event(const char *cmd, int *
 		if (history(h, &ev, H_FIRST) != 0)
 			return(NULL);
 		*cindex = cmd[idx]? (idx + 1):idx;
-		return(ev.str);
+		return ev.str;
 	}
 	sign = 0;
 	if (cmd[idx] == '-') {
@@ -639,9 +676,11 @@ _history_expand_command(const char *comm
 		return(-1);
 
 	if (!has_mods) {
-		*result = strdup(aptr? aptr : ptr);
+		*result = strdup(aptr ? aptr : ptr);
 		if (aptr)
 			free(aptr);
+		if (*result == NULL)
+			return -1;
 		return(1);
 	}
 
@@ -968,38 +1007,37 @@ char *
 history_arg_extract(int start, int end, const char *str)
 {
 	size_t  i, len, max;
-	char	**arr, *result;
+	char	**arr, *result = NULL;
 
 	arr = history_tokenize(str);
 	if (!arr)
-		return(NULL);
-	if (arr && *arr == NULL) {
-		free(arr);
-		return(NULL);
-	}
+		return NULL;
+	if (arr && *arr == NULL)
+		goto out;
 
 	for (max = 0; arr[max]; max++)
 		continue;
 	max--;
 
 	if (start == '$')
-		start = max;
+		start = (int)max;
 	if (end == '$')
-		end = max;
+		end = (int)max;
 	if (end < 0)
-		end = max + end + 1;
+		end = (int)max + end + 1;
 	if (start < 0)
 		start = end;
 
-	if (start < 0 || end < 0 || (size_t)start > max || (size_t)end > max || start > end)
-		return(NULL);
+	if (start < 0 || end < 0 || (size_t)start > max ||
+	    (size_t)end > max || start > end)
+		goto out;
 
 	for (i = start, len = 0; i <= (size_t)end; i++)
 		len += strlen(arr[i]) + 1;
 	len++;
 	result = malloc(len);
 	if (result == NULL)
-		return NULL;
+		goto out;
 
 	for (i = start, len = 0; i <= (size_t)end; i++) {
 		(void)strcpy(result + len, arr[i]);
@@ -1009,11 +1047,12 @@ history_arg_extract(int start, int end, 
 	}
 	result[len] = '\0';
 
+out:
 	for (i = 0; arr[i]; i++)
 		free(arr[i]);
 	free(arr);
 
-	return(result);
+	return result;
 }
 
 /*
@@ -1116,6 +1155,142 @@ history_is_stifled(void)
 	return (max_input_history != INT_MAX);
 }
 
+static const char _history_tmp_template[] = "/tmp/.historyXXXXXX";
+
+int
+history_truncate_file (const char *filename, int nlines)
+{
+	int ret = 0;
+	FILE *fp, *tp;
+	char template[sizeof(_history_tmp_template)];
+	char buf[4096];
+	int fd;
+	char *cp;
+	off_t off;
+	int count = 0;
+	ssize_t left = 0;
+
+	if (filename == NULL && (filename = _default_history_file()) == NULL)
+		return errno;
+	if ((fp = fopen(filename, "r+")) == NULL)
+		return errno;
+	strcpy(template, _history_tmp_template);
+	if ((fd = mkstemp(template)) == -1) {
+		ret = errno;
+		goto out1;
+	}
+
+	if ((tp = fdopen(fd, "r+")) == NULL) {
+		close(fd);
+		ret = errno;
+		goto out2;
+	}
+
+	for(;;) {
+		if (fread(buf, sizeof(buf), 1, fp) != 1) {
+			if (ferror(fp)) {
+				ret = errno;
+				break;
+			}
+			if (fseeko(fp, (off_t)sizeof(buf) * count, SEEK_SET) ==
+			    (off_t)-1) {
+				ret = errno;
+				break;
+			}
+			left = fread(buf, 1, sizeof(buf), fp);
+			if (ferror(fp)) {
+				ret = errno;
+				break;
+			}
+			if (left == 0) {
+				count--;
+				left = sizeof(buf);
+			} else if (fwrite(buf, (size_t)left, 1, tp) != 1) {
+				ret = errno;
+				break;
+			}
+			fflush(tp);
+			break;
+		}
+		if (fwrite(buf, sizeof(buf), 1, tp) != 1) {
+			ret = errno;
+			break;
+		}
+		count++;
+	}
+	if (ret)
+		goto out3;
+	cp = buf + left - 1;
+	if(*cp != '\n')
+		cp++;
+	for(;;) {
+		while (--cp >= buf) {
+			if (*cp == '\n') {
+				if (--nlines == 0) {
+					if (++cp >= buf + sizeof(buf)) {
+						count++;
+						cp = buf;
+					}
+					break;
+				}
+			}
+		}
+		if (nlines <= 0 || count == 0)
+			break;
+		count--;
+		if (fseeko(tp, (off_t)sizeof(buf) * count, SEEK_SET) < 0) {
+			ret = errno;
+			break;
+		}
+		if (fread(buf, sizeof(buf), 1, tp) != 1) {
+			if (ferror(tp)) {
+				ret = errno;
+				break;
+			}
+			ret = EAGAIN;
+			break;
+		}
+		cp = buf + sizeof(buf);
+	}
+
+	if (ret || nlines > 0)
+		goto out3;
+
+	if (fseeko(fp, 0, SEEK_SET) == (off_t)-1) {
+		ret = errno;
+		goto out3;
+	}
+
+	if (fseeko(tp, (off_t)sizeof(buf) * count + (cp - buf), SEEK_SET) ==
+	    (off_t)-1) {
+		ret = errno;
+		goto out3;
+	}
+
+	for(;;) {
+		if ((left = fread(buf, 1, sizeof(buf), tp)) == 0) {
+			if (ferror(fp))
+				ret = errno;
+			break;
+		}
+		if (fwrite(buf, (size_t)left, 1, fp) != 1) {
+			ret = errno;
+			break;
+		}
+	}
+	fflush(fp);
+	if((off = ftello(fp)) > 0)
+		(void)ftruncate(fileno(fp), off);
+out3:
+	fclose(tp);
+out2:
+	unlink(template);
+out1:
+	fclose(fp);
+
+	return ret;
+}
+
 
 /*
  * read history from a file given
@@ -1127,7 +1302,10 @@ read_history(const char *filename)
 
 	if (h == NULL || e == NULL)
 		rl_initialize();
-	return (history(h, &ev, H_LOAD, filename) == -1);
+	if (filename == NULL && (filename = _default_history_file()) == NULL)
+		return errno;
+	return (history(h, &ev, H_LOAD, filename) == -1 ?
+	    (errno ? errno : EINVAL) : 0);
 }
 
 
@@ -1141,7 +1319,10 @@ write_history(const char *filename)
 
 	if (h == NULL || e == NULL)
 		rl_initialize();
-	return (history(h, &ev, H_SAVE, filename) == -1);
+	if (filename == NULL && (filename = _default_history_file()) == NULL)
+		return errno;
+	return (history(h, &ev, H_SAVE, filename) == -1 ?
+	    (errno ? errno : EINVAL) : 0);
 }
 
 
@@ -1165,16 +1346,15 @@ history_get(int num)
 		return (NULL);
 	curr_num = ev.num;
 
-	/* start from most recent */
-	if (history(h, &ev, H_FIRST) != 0)
+	/* start from the oldest */
+	if (history(h, &ev, H_LAST) != 0)
 		return (NULL);	/* error */
 
-	/* look backwards for event matching specified offset */
-	if (history(h, &ev, H_NEXT_EVENT, num + 1))
+	/* look forwards for event matching specified offset */
+	if (history(h, &ev, H_NEXT_EVDATA, num, &she.data))
 		return (NULL);
 
 	she.line = ev.str;
-	she.data = NULL;
 
 	/* restore pointer to where it was */
 	(void)history(h, &ev, H_SET, curr_num);
@@ -1208,26 +1388,75 @@ add_history(const char *line)
 HIST_ENTRY *
 remove_history(int num)
 {
-	HIST_ENTRY *she;
+	HIST_ENTRY *he;
 	HistEvent ev;
 
 	if (h == NULL || e == NULL)
 		rl_initialize();
 
-	if (history(h, &ev, H_DEL, num) != 0)
+	if ((he = malloc(sizeof(*he))) == NULL)
 		return NULL;
 
-	if ((she = malloc(sizeof(*she))) == NULL)
+	if (history(h, &ev, H_DELDATA, num, &he->data) != 0) {
+		free(he);
 		return NULL;
+	}
 
-	she->line = ev.str;
-	she->data = NULL;
+	he->line = ev.str;
+	if (history(h, &ev, H_GETSIZE) == 0)
+		history_length = ev.num;
 
-	return she;
+	return he;
 }
 
 
 /*
+ * replace the line and data of the num-th entry
+ */
+HIST_ENTRY *
+replace_history_entry(int num, const char *line, histdata_t data)
+{
+	HIST_ENTRY *he;
+	HistEvent ev;
+	int curr_num;
+
+	if (h == NULL || e == NULL)
+		rl_initialize();
+
+	/* save current position */
+	if (history(h, &ev, H_CURR) != 0)
+		return NULL;
+	curr_num = ev.num;
+
+	/* start from the oldest */
+	if (history(h, &ev, H_LAST) != 0)
+		return NULL;	/* error */
+
+	if ((he = malloc(sizeof(*he))) == NULL)
+		return NULL;
+
+	/* look forwards for event matching specified offset */
+	if (history(h, &ev, H_NEXT_EVDATA, num, &he->data))
+		goto out;
+
+	he->line = strdup(ev.str);
+	if (he->line == NULL)
+		goto out;
+
+	if (history(h, &ev, H_REPLACE, line, data))
+		goto out;
+
+	/* restore pointer to where it was */
+	if (history(h, &ev, H_SET, curr_num))
+		goto out;
+
+	return he;
+out:
+	free(he);
+	return NULL;
+}
+
+/*
  * clear the history list - delete all entries
  */
 void
@@ -1235,7 +1464,8 @@ clear_history(void)
 {
 	HistEvent ev;
 
-	history(h, &ev, H_CLEAR);
+	(void)history(h, &ev, H_CLEAR);
+	history_length = 0;
 }
 
 
@@ -1252,7 +1482,7 @@ where_history(void)
 		return (0);
 	curr_num = ev.num;
 
-	history(h, &ev, H_FIRST);
+	(void)history(h, &ev, H_FIRST);
 	off = 1;
 	while (ev.num != curr_num && history(h, &ev, H_NEXT) == 0)
 		off++;
@@ -1279,22 +1509,23 @@ int
 history_total_bytes(void)
 {
 	HistEvent ev;
-	int curr_num, size;
+	int curr_num;
+	size_t size;
 
 	if (history(h, &ev, H_CURR) != 0)
 		return (-1);
 	curr_num = ev.num;
 
-	history(h, &ev, H_FIRST);
+	(void)history(h, &ev, H_FIRST);
 	size = 0;
 	do
-		size += strlen(ev.str);
+		size += strlen(ev.str) * sizeof(*ev.str);
 	while (history(h, &ev, H_NEXT) == 0);
 
 	/* get to the same position as before */
 	history(h, &ev, H_PREV_EVENT, curr_num);
 
-	return (size);
+	return (int)(size);
 }
 
 
@@ -1307,14 +1538,18 @@ history_set_pos(int pos)
 	HistEvent ev;
 	int curr_num;
 
-	if (pos > history_length || pos < 0)
+	if (pos >= history_length || pos < 0)
 		return (-1);
 
-	history(h, &ev, H_CURR);
+	(void)history(h, &ev, H_CURR);
 	curr_num = ev.num;
 
-	if (history(h, &ev, H_SET, pos)) {
-		history(h, &ev, H_SET, curr_num);
+	/*
+	 * use H_DELDATA to set to nth history (without delete) by passing
+	 * (void **)-1
+	 */
+	if (history(h, &ev, H_DELDATA, pos, (void **)-1)) {
+		(void)history(h, &ev, H_SET, curr_num);
 		return(-1);
 	}
 	return (0);
@@ -1363,7 +1598,7 @@ history_search(const char *str, int dire
 		if (history(h, &ev, direction < 0 ? H_NEXT:H_PREV) != 0)
 			break;
 	}
-	history(h, &ev, H_SET, curr_num);
+	(void)history(h, &ev, H_SET, curr_num);
 	return (-1);
 }
 
@@ -1376,7 +1611,8 @@ history_search_prefix(const char *str, i
 {
 	HistEvent ev;
 
-	return (history(h, &ev, direction < 0? H_PREV_STR:H_NEXT_STR, str));
+	return (history(h, &ev, direction < 0 ?
+	    H_PREV_STR : H_NEXT_STR, str));
 }
 
 
@@ -1402,7 +1638,6 @@ history_search_pos(const char *str,
 	if (history_set_pos(off) != 0 || history(h, &ev, H_CURR) != 0)
 		return (-1);
 
-
 	for (;;) {
 		if (strstr(ev.str, str))
 			return (off);
@@ -1411,7 +1646,8 @@ history_search_pos(const char *str,
 	}
 
 	/* set "current" pointer back to previous state */
-	history(h, &ev, (pos < 0) ? H_NEXT_EVENT : H_PREV_EVENT, curr_num);
+	(void)history(h, &ev,
+	    pos < 0 ? H_NEXT_EVENT : H_PREV_EVENT, curr_num);
 
 	return (-1);
 }
@@ -1442,7 +1678,10 @@ filename_completion_function(const char 
 char *
 username_completion_function(const char *text, int state)
 {
+
+        /* XXXMYSQL : warning: unused variable ‘pwbuf’ & 'pwres'. */
 	struct passwd *pwd;
+	//char pwbuf[1024];
 
 	if (text[0] == '\0')
 		return (NULL);
@@ -1459,9 +1698,9 @@ username_completion_function(const char 
 
 	if (pwd == NULL) {
 		endpwent();
-		return (NULL);
+		return NULL;
 	}
-	return (strdup(pwd->pw_name));
+	return strdup(pwd->pw_name);
 }
 
 
@@ -1485,7 +1724,7 @@ void
 rl_display_match_list(char **matches, int len, int max)
 {
 
-	fn_display_match_list(e, matches, len, max);
+	fn_display_match_list(e, matches, (size_t)len, (size_t)max);
 }
 
 static const char *
@@ -1507,6 +1746,10 @@ _rl_completion_append_character_function
 int
 rl_complete(int ignore __attribute__((__unused__)), int invoking_key)
 {
+#ifdef WIDECHAR
+	static ct_buffer_t wbreak_conv, sprefix_conv;
+#endif
+
 	if (h == NULL || e == NULL)
 		rl_initialize();
 
@@ -1522,10 +1765,14 @@ rl_complete(int ignore __attribute__((__
 	return fn_complete(e,
 	    (CPFunction *)rl_completion_entry_function,
 	    rl_attempted_completion_function,
-	    rl_basic_word_break_characters, rl_special_prefixes,
-	    _rl_completion_append_character_function, rl_completion_query_items,
+	    ct_decode_string(rl_basic_word_break_characters, &wbreak_conv),
+	    ct_decode_string(rl_special_prefixes, &sprefix_conv),
+	    _rl_completion_append_character_function,
+	    (size_t)rl_completion_query_items,
 	    &rl_completion_type, &rl_attempted_completion_over,
 	    &rl_point, &rl_end);
+
+
 }
 
 
@@ -1544,7 +1791,7 @@ _el_rl_complete(EditLine *el __attribute
  * bind key c to readline-type function func
  */
 int
-rl_bind_key(int c, int func(int, int))
+rl_bind_key(int c, rl_command_func_t *func)
 {
 	int retval = -1;
 
@@ -1611,6 +1858,20 @@ rl_insert(int count, int c)
 	return (0);
 }
 
+int
+rl_insert_text(const char *text)
+{
+	if (!text || *text == 0)
+		return (0);
+
+	if (h == NULL || e == NULL)
+		rl_initialize();
+
+	if (el_insertstr(e, text) < 0)
+		return (0);
+	return (int)strlen(text);
+}
+
 /*ARGSUSED*/
 int
 rl_newline(int count __attribute__((__unused__)),
@@ -1675,7 +1936,7 @@ rl_callback_read_char()
 		} else
 			wbuf = NULL;
 		(*(void (*)(const char *))rl_linefunc)(wbuf);
-		el_set(e, EL_UNBUFFERED, 1);
+		//el_set(e, EL_UNBUFFERED, 1);
 	}
 }
 
@@ -1773,7 +2034,8 @@ rl_stuff_char(int c)
 static int
 _rl_event_read_char(EditLine *el, char *cp)
 {
-	int	n, num_read = 0;
+	int	n;
+	ssize_t num_read = 0;
 
 	*cp = '\0';
 	while (rl_event_hook) {
@@ -1809,7 +2071,7 @@ _rl_event_read_char(EditLine *el, char *
 	}
 	if (!rl_event_hook)
 		el_set(el, EL_GETCFN, EL_BUILTIN_GETCFN);
-	return(num_read);
+	return (int)num_read;
 }
 
 static void
@@ -1817,8 +2079,8 @@ _rl_update_pos(void)
 {
 	const LineInfo *li = el_line(e);
 
-	rl_point = li->cursor - li->buffer;
-	rl_end = li->lastchar - li->buffer;
+	rl_point = (int)(li->cursor - li->buffer);
+	rl_end = (int)(li->lastchar - li->buffer);
 }
 
 void
@@ -1852,6 +2114,7 @@ rl_completion_matches(const char *str, r
 		return NULL;
 
 	while ((match = (*fun)(str, (int)(len - 1))) != NULL) {
+		list[len++] = match;
 		if (len == max) {
 			char **nl;
 			max += 10;
@@ -1859,7 +2122,6 @@ rl_completion_matches(const char *str, r
 				goto out;
 			list = nl;
 		}
-		list[len++] = match;
 	}
 	if (len == 1)
 		goto out;
@@ -1921,6 +2183,17 @@ _rl_qsort_string_compare(char **s1, char
 	return strcoll(*s1, *s2);
 }
 
+HISTORY_STATE *
+history_get_history_state(void)
+{
+	HISTORY_STATE *hs;
+
+	if ((hs = malloc(sizeof(HISTORY_STATE))) == NULL)
+		return (NULL);
+	hs->length = history_length;
+	return (hs);
+}
+
 int
 /*ARGSUSED*/
 rl_kill_text(int from __attribute__((__unused__)),
@@ -1960,8 +2233,20 @@ rl_generic_bind(int type __attribute__((
 int
 /*ARGSUSED*/
 rl_bind_key_in_map(int key __attribute__((__unused__)),
-		   Function *fun __attribute__((__unused__)),
+		   rl_command_func_t *fun __attribute__((__unused__)),
 		   Keymap k __attribute__((__unused__)))
 {
 	return 0;
 }
+
+/* unsupported, but needed by python */
+void
+rl_cleanup_after_signal(void)
+{
+}
+
+int
+rl_on_new_line(void)
+{
+	return 0;
+}

=== modified file 'cmd-line-utils/libedit/readline/readline.h'
--- a/cmd-line-utils/libedit/readline/readline.h	2009-08-04 11:25:19 +0000
+++ b/cmd-line-utils/libedit/readline/readline.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: readline.h,v 1.24 2009/02/05 19:15:26 christos Exp $	*/
+/*	$NetBSD: readline.h,v 1.32 2010/09/16 20:08:52 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -32,6 +32,7 @@
 #define _READLINE_H_
 
 #include <sys/types.h>
+#include <stdio.h>
 
 /* list of readline stuff supported by editline library's readline wrapper */
 
@@ -42,10 +43,18 @@ typedef void	  VCPFunction(char *);
 typedef char	 *CPFunction(const char *, int);
 typedef char	**CPPFunction(const char *, int, int);
 typedef char     *rl_compentry_func_t(const char *, int);
+typedef int	  rl_command_func_t(int, int);
+
+/* only supports length */
+typedef struct {
+	int length;
+} HISTORY_STATE;
+
+typedef void *histdata_t;
 
 typedef struct _hist_entry {
 	const char	*line;
-	const char	*data;
+	histdata_t 	 data;
 } HIST_ENTRY;
 
 typedef struct _keymap_entry {
@@ -79,12 +88,16 @@ typedef KEYMAP_ENTRY *Keymap;
 
 #define RUBOUT		0x7f
 #define ABORT_CHAR	CTRL('G')
+#define RL_READLINE_VERSION 	0x0402
+#define RL_PROMPT_START_IGNORE	'\1'
+#define RL_PROMPT_END_IGNORE	'\2'
 
 /* global variables used by readline enabled applications */
 #ifdef __cplusplus
 extern "C" {
 #endif
 extern const char	*rl_library_version;
+extern int 		rl_readline_version; 
 extern char		*rl_readline_name;
 extern FILE		*rl_instream;
 extern FILE		*rl_outstream;
@@ -138,6 +151,7 @@ int		 where_history(void);
 HIST_ENTRY	*current_history(void);
 HIST_ENTRY	*history_get(int);
 HIST_ENTRY	*remove_history(int);
+HIST_ENTRY	*replace_history_entry(int, const char *, histdata_t);
 int		 history_total_bytes(void);
 int		 history_set_pos(int);
 HIST_ENTRY	*previous_history(void);
@@ -147,6 +161,7 @@ int		 history_search_prefix(const char *
 int		 history_search_pos(const char *, int, int);
 int		 read_history(const char *);
 int		 write_history(const char *);
+int		 history_truncate_file (const char *, int);
 int		 history_expand(char *, char **);
 char	       **history_tokenize(const char *);
 const char	*get_history_event(const char *, int *, int);
@@ -161,8 +176,9 @@ char	       **completion_matches(const c
 void		 rl_display_match_list(char **, int, int);
 
 int		 rl_insert(int, int);
+int		 rl_insert_text(const char *);
 void		 rl_reset_terminal(const char *);
-int		 rl_bind_key(int, int (*)(int, int));
+int		 rl_bind_key(int, rl_command_func_t *);
 int		 rl_newline(int, int);
 void		 rl_callback_read_char(void);
 void		 rl_callback_handler_install(const char *, VCPFunction *);
@@ -176,6 +192,7 @@ int		 rl_parse_and_bind(const char *);
 int		 rl_variable_bind(const char *, const char *);
 void		 rl_stuff_char(int);
 int		 rl_add_defun(const char *, Function *, int);
+HISTORY_STATE	*history_get_history_state(void);
 void		 rl_get_screen_size(int *, int *);
 void		 rl_set_screen_size(int, int);
 char 		*rl_filename_completion_function (const char *, int);
@@ -184,6 +201,7 @@ int		 _rl_qsort_string_compare(char **, 
 char 	       **rl_completion_matches(const char *, rl_compentry_func_t *);
 void		 rl_forced_update_display(void);
 int		 rl_set_prompt(const char *);
+int		 rl_on_new_line(void);
 
 /*
  * The following are not implemented
@@ -193,7 +211,9 @@ Keymap		 rl_get_keymap(void);
 void		 rl_set_keymap(Keymap);
 Keymap		 rl_make_bare_keymap(void);
 int		 rl_generic_bind(int, const char *, const char *, Keymap);
-int		 rl_bind_key_in_map(int, Function *, Keymap);
+int		 rl_bind_key_in_map(int, rl_command_func_t *, Keymap);
+void		 rl_cleanup_after_signal(void);
+void		 rl_free_line_state(void);
 #ifdef __cplusplus
 }
 #endif

=== modified file 'cmd-line-utils/libedit/refresh.c'
--- a/cmd-line-utils/libedit/refresh.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/refresh.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: refresh.c,v 1.28 2008/09/10 15:45:37 christos Exp $	*/
+/*	$NetBSD: refresh.c,v 1.35 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,6 +40,8 @@ static char sccsid[] = "@(#)refresh.c	8.
 #endif
 #endif /* not lint && not SCCSID */
 
+#include "chartype.c"                           /* XXXMYSQL  */
+
 /*
  * refresh.c: Lower level screen refreshing functions
  */
@@ -50,14 +52,15 @@ static char sccsid[] = "@(#)refresh.c	8.
 
 #include "el.h"
 
-private void	re_addc(EditLine *, int);
-private void	re_update_line(EditLine *, char *, char *, int);
-private void	re_insert (EditLine *, char *, int, int, char *, int);
-private void	re_delete(EditLine *, char *, int, int, int);
-private void	re_fastputc(EditLine *, int);
+private void	re_nextline(EditLine *);
+private void	re_addc(EditLine *, Int);
+private void	re_update_line(EditLine *, Char *, Char *, int);
+private void	re_insert (EditLine *, Char *, int, int, Char *, int);
+private void	re_delete(EditLine *, Char *, int, int, int);
+private void	re_fastputc(EditLine *, Int);
 private void	re_clear_eol(EditLine *, int, int, int);
-private void	re__strncopy(char *, char *, size_t);
-private void	re__copy_and_pad(char *, const char *, size_t);
+private void	re__strncopy(Char *, Char *, size_t);
+private void	re__copy_and_pad(Char *, const Char *, size_t);
 
 #ifdef DEBUG_REFRESH
 private void	re_printstr(EditLine *, const char *, char *, char *);
@@ -87,45 +90,70 @@ re_printstr(EditLine *el, const char *st
 #define	ELRE_DEBUG(a, b)
 #endif
 
+/* re_nextline():
+ *	Move to the next line or scroll
+ */
+private void
+re_nextline(EditLine *el)
+{
+	el->el_refresh.r_cursor.h = 0;	/* reset it. */
+
+	/*
+	 * If we would overflow (input is longer than terminal size),
+	 * emulate scroll by dropping first line and shuffling the rest.
+	 * We do this via pointer shuffling - it's safe in this case
+	 * and we avoid memcpy().
+	 */
+	if (el->el_refresh.r_cursor.v + 1 >= el->el_term.t_size.v) {
+		int i, lins = el->el_term.t_size.v;
+		Char *firstline = el->el_vdisplay[0];
+
+		for(i = 1; i < lins; i++)
+			el->el_vdisplay[i - 1] = el->el_vdisplay[i];
+
+		firstline[0] = '\0';		/* empty the string */	
+		el->el_vdisplay[i - 1] = firstline;
+	} else
+		el->el_refresh.r_cursor.v++;
+
+	ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_term.t_size.v,
+	    (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n",
+	    el->el_refresh.r_cursor.v, el->el_term.t_size.v),
+	    abort());
+}
 
 /* re_addc():
  *	Draw c, expanding tabs, control chars etc.
  */
 private void
-re_addc(EditLine *el, int c)
+re_addc(EditLine *el, Int c)
 {
-
-	if (el_isprint(c)) {
-		re_putc(el, c, 1);
-		return;
-	}
-	if (c == '\n') {				/* expand the newline */
-		int oldv = el->el_refresh.r_cursor.v;
-		re_putc(el, '\0', 0);			/* assure end of line */
-		if (oldv == el->el_refresh.r_cursor.v) { /* XXX */
-			el->el_refresh.r_cursor.h = 0;	/* reset cursor pos */
-			el->el_refresh.r_cursor.v++;
-		}
-		return;
-	}
-	if (c == '\t') {				/* expand the tab */
+	switch (ct_chr_class((Char)c)) {
+	case CHTYPE_TAB:        /* expand the tab */
 		for (;;) {
 			re_putc(el, ' ', 1);
 			if ((el->el_refresh.r_cursor.h & 07) == 0)
 				break;			/* go until tab stop */
 		}
-	} else if (iscntrl(c)) {
-		re_putc(el, '^', 1);
-		if (c == '\177')
-			re_putc(el, '?', 1);
-		else
-		    /* uncontrolify it; works only for iso8859-1 like sets */
-			re_putc(el, (c | 0100), 1);
-	} else {
-		re_putc(el, '\\', 1);
-		re_putc(el, (int) ((((unsigned int) c >> 6) & 07) + '0'), 1);
-		re_putc(el, (int) ((((unsigned int) c >> 3) & 07) + '0'), 1);
-		re_putc(el, (c & 07) + '0', 1);
+		break;
+	case CHTYPE_NL: {
+		int oldv = el->el_refresh.r_cursor.v;
+		re_putc(el, '\0', 0);			/* assure end of line */
+		if (oldv == el->el_refresh.r_cursor.v)	/* XXX */
+			re_nextline(el);
+		break;
+	}
+	case CHTYPE_PRINT:
+		re_putc(el, c, 1);
+		break;
+	default: {
+		Char visbuf[VISUAL_WIDTH_MAX];
+		ssize_t i, n =
+		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
+		for (i = 0; n-- > 0; ++i)
+		    re_putc(el, visbuf[i], 1);
+		break;
+	}
 	}
 }
 
@@ -134,43 +162,31 @@ re_addc(EditLine *el, int c)
  *	Draw the character given
  */
 protected void
-re_putc(EditLine *el, int c, int shift)
+re_putc(EditLine *el, Int c, int shift)
 {
+	int i, w = Width(c);
+	ELRE_DEBUG(1, (__F, "printing %5x '%c'\r\n", c, c));
+
+	while (shift && (el->el_refresh.r_cursor.h + w > el->el_term.t_size.h))
+	    re_putc(el, ' ', 1);
 
-	ELRE_DEBUG(1, (__F, "printing %3.3o '%c'\r\n", c, c));
+	el->el_vdisplay[el->el_refresh.r_cursor.v]
+	    [el->el_refresh.r_cursor.h] = c;
+	/* assumes !shift is only used for single-column chars */
+	i = w;
+	while (--i > 0)
+		el->el_vdisplay[el->el_refresh.r_cursor.v]
+		    [el->el_refresh.r_cursor.h + i] = MB_FILL_CHAR;
 
-	el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_refresh.r_cursor.h] = c;
 	if (!shift)
 		return;
 
-	el->el_refresh.r_cursor.h++;	/* advance to next place */
+	el->el_refresh.r_cursor.h += w;	/* advance to next place */
 	if (el->el_refresh.r_cursor.h >= el->el_term.t_size.h) {
-		el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_term.t_size.h] = '\0';
 		/* assure end of line */
-		el->el_refresh.r_cursor.h = 0;	/* reset it. */
-
-		/*
-		 * If we would overflow (input is longer than terminal size),
-		 * emulate scroll by dropping first line and shuffling the rest.
-		 * We do this via pointer shuffling - it's safe in this case
-		 * and we avoid memcpy().
-		 */
-		if (el->el_refresh.r_cursor.v + 1 >= el->el_term.t_size.v) {
-			int i, lins = el->el_term.t_size.v;
-			char *firstline = el->el_vdisplay[0];
-
-			for(i=1; i < lins; i++)
-				el->el_vdisplay[i-1] = el->el_vdisplay[i];
-
-			firstline[0] = '\0';		/* empty the string */	
-			el->el_vdisplay[i-1] = firstline;
-		} else
-			el->el_refresh.r_cursor.v++;
-
-		ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_term.t_size.v,
-		    (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n",
-		    el->el_refresh.r_cursor.v, el->el_term.t_size.v),
-		    abort());
+		el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_term.t_size.h]
+		    = '\0';
+		re_nextline(el);
 	}
 }
 
@@ -185,7 +201,7 @@ protected void
 re_refresh(EditLine *el)
 {
 	int i, rhdiff;
-	char *cp, *st;
+	Char *cp, *st;
 	coord_t cur;
 #ifdef notyet
 	size_t termsz;
@@ -237,11 +253,18 @@ re_refresh(EditLine *el)
 
 	for (cp = st; cp < el->el_line.lastchar; cp++) {
 		if (cp == el->el_line.cursor) {
+                        int w = Width(*cp);
 			/* save for later */
 			cur.h = el->el_refresh.r_cursor.h;
 			cur.v = el->el_refresh.r_cursor.v;
+                        /* handle being at a linebroken doublewidth char */
+                        if (w > 1 && el->el_refresh.r_cursor.h + w >
+			    el->el_term.t_size.h) {
+				cur.h = 0;
+				cur.v++;
+                        }
 		}
-		re_addc(el, (unsigned char) *cp);
+		re_addc(el, *cp);
 	}
 
 	if (cur.h == -1) {	/* if I haven't been set yet, I'm at the end */
@@ -272,7 +295,7 @@ re_refresh(EditLine *el)
 	ELRE_DEBUG(1, (__F,
 		"term.h=%d vcur.h=%d vcur.v=%d vdisplay[0]=\r\n:%80.80s:\r\n",
 		el->el_term.t_size.h, el->el_refresh.r_cursor.h,
-		el->el_refresh.r_cursor.v, el->el_vdisplay[0]));
+		el->el_refresh.r_cursor.v, ct_encode_string(el->el_vdisplay[0])));
 
 	ELRE_DEBUG(1, (__F, "updating %d lines.\r\n", el->el_refresh.r_newcv));
 	for (i = 0; i <= el->el_refresh.r_newcv; i++) {
@@ -297,9 +320,10 @@ re_refresh(EditLine *el)
 		for (; i <= el->el_refresh.r_oldcv; i++) {
 			term_move_to_line(el, i);
 			term_move_to_char(el, 0);
-			term_clear_EOL(el, (int) strlen(el->el_display[i]));
+                        /* This Strlen should be safe even with MB_FILL_CHARs */
+			term_clear_EOL(el, (int) Strlen(el->el_display[i]));
 #ifdef DEBUG_REFRESH
-			term_overwrite(el, "C\b", 2);
+			term_overwrite(el, "C\b", (size_t)2);
 #endif /* DEBUG_REFRESH */
 			el->el_display[i][0] = '\0';
 		}
@@ -335,9 +359,9 @@ re_goto_bottom(EditLine *el)
 private void
 /*ARGSUSED*/
 re_insert(EditLine *el __attribute__((__unused__)),
-    char *d, int dat, int dlen, char *s, int num)
+    Char *d, int dat, int dlen, Char *s, int num)
 {
-	char *a, *b;
+	Char *a, *b;
 
 	if (num <= 0)
 		return;
@@ -346,8 +370,8 @@ re_insert(EditLine *el __attribute__((__
 
 	ELRE_DEBUG(1,
 	    (__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n",
-	    num, dat, dlen, d));
-	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
+	    num, dat, dlen, ct_encode_string(d)));
+	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s)));
 
 	/* open up the space for num chars */
 	if (num > 0) {
@@ -357,19 +381,24 @@ re_insert(EditLine *el __attribute__((__
 			*b-- = *a--;
 		d[dlen] = '\0';	/* just in case */
 	}
+
 	ELRE_DEBUG(1, (__F,
 		"re_insert() after insert: %d at %d max %d, d == \"%s\"\n",
-		num, dat, dlen, d));
-	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
+		num, dat, dlen, ct_encode_string(d)));
+	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s)));
 
 	/* copy the characters */
 	for (a = d + dat; (a < d + dlen) && (num > 0); num--)
 		*a++ = *s++;
 
+#ifdef notyet
+        /* ct_encode_string() uses a static buffer, so we can't conveniently
+         * encode both d & s here */
 	ELRE_DEBUG(1,
 	    (__F, "re_insert() after copy: %d at %d max %d, %s == \"%s\"\n",
 	    num, dat, dlen, d, s));
 	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
+#endif
 }
 
 
@@ -379,9 +408,9 @@ re_insert(EditLine *el __attribute__((__
 private void
 /*ARGSUSED*/
 re_delete(EditLine *el __attribute__((__unused__)),
-    char *d, int dat, int dlen, int num)
+    Char *d, int dat, int dlen, int num)
 {
-	char *a, *b;
+	Char *a, *b;
 
 	if (num <= 0)
 		return;
@@ -391,7 +420,7 @@ re_delete(EditLine *el __attribute__((__
 	}
 	ELRE_DEBUG(1,
 	    (__F, "re_delete() starting: %d at %d max %d, d == \"%s\"\n",
-	    num, dat, dlen, d));
+	    num, dat, dlen, ct_encode_string(d)));
 
 	/* open up the space for num chars */
 	if (num > 0) {
@@ -403,7 +432,7 @@ re_delete(EditLine *el __attribute__((__
 	}
 	ELRE_DEBUG(1,
 	    (__F, "re_delete() after delete: %d at %d max %d, d == \"%s\"\n",
-	    num, dat, dlen, d));
+	    num, dat, dlen, ct_encode_string(d)));
 }
 
 
@@ -411,7 +440,7 @@ re_delete(EditLine *el __attribute__((__
  *	Like strncpy without padding.
  */
 private void
-re__strncopy(char *a, char *b, size_t n)
+re__strncopy(Char *a, Char *b, size_t n)
 {
 
 	while (n-- && *b)
@@ -422,7 +451,7 @@ re__strncopy(char *a, char *b, size_t n)
  *	Find the number of characters we need to clear till the end of line
  *	in order to make sure that we have cleared the previous contents of
  *	the line. fx and sx is the number of characters inserted or deleted
- *	int the first or second diff, diff is the difference between the
+ *	in the first or second diff, diff is the difference between the
  * 	number of characters between the new and old line.
  */
 private void
@@ -470,12 +499,13 @@ new:	eddie> Oh, my little buggy says to 
 #define	MIN_END_KEEP	4
 
 private void
-re_update_line(EditLine *el, char *old, char *new, int i)
+re_update_line(EditLine *el, Char *old, Char *new, int i)
 {
-	char *o, *n, *p, c;
-	char *ofd, *ols, *oe, *nfd, *nls, *ne;
-	char *osb, *ose, *nsb, *nse;
+	Char *o, *n, *p, c;
+	Char *ofd, *ols, *oe, *nfd, *nls, *ne;
+	Char *osb, *ose, *nsb, *nse;
 	int fx, sx;
+	size_t len;
 
 	/*
          * find first diff
@@ -602,12 +632,12 @@ re_update_line(EditLine *el, char *old, 
          * fx is the number of characters we need to insert/delete: in the
          * beginning to bring the two same begins together
          */
-	fx = (nsb - nfd) - (osb - ofd);
+	fx = (int)((nsb - nfd) - (osb - ofd));
 	/*
          * sx is the number of characters we need to insert/delete: in the
          * end to bring the two same last parts together
          */
-	sx = (nls - nse) - (ols - ose);
+	sx = (int)((nls - nse) - (ols - ose));
 
 	if (!EL_CAN_INSERT) {
 		if (fx > 0) {
@@ -656,8 +686,8 @@ re_update_line(EditLine *el, char *old, 
 	/*
          * Now that we are done with pragmatics we recompute fx, sx
          */
-	fx = (nsb - nfd) - (osb - ofd);
-	sx = (nls - nse) - (ols - ose);
+	fx = (int)((nsb - nfd) - (osb - ofd));
+	sx = (int)((nls - nse) - (ols - ose));
 
 	ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx));
 	ELRE_DEBUG(1, (__F, "ofd %d, osb %d, ose %d, ols %d, oe %d\n",
@@ -740,7 +770,7 @@ re_update_line(EditLine *el, char *old, 
 		/*
 		 * Move to the first char to insert, where the first diff is.
 		 */
-		term_move_to_char(el, nfd - new);
+		term_move_to_char(el, (int)(nfd - new));
 		/*
 		 * Check if we have stuff to keep at end
 		 */
@@ -753,20 +783,21 @@ re_update_line(EditLine *el, char *old, 
 				ELRE_DEBUG(!EL_CAN_INSERT, (__F,
 				"ERROR: cannot insert in early first diff\n"));
 				term_insertwrite(el, nfd, fx);
-				re_insert(el, old, ofd - old,
+				re_insert(el, old, (int)(ofd - old),
 				    el->el_term.t_size.h, nfd, fx);
 			}
 			/*
 		         * write (nsb-nfd) - fx chars of new starting at
 		         * (nfd + fx)
 			 */
-			term_overwrite(el, nfd + fx, (nsb - nfd) - fx);
-			re__strncopy(ofd + fx, nfd + fx,
-			    (size_t) ((nsb - nfd) - fx));
+			len = (size_t) ((nsb - nfd) - fx);
+			term_overwrite(el, (nfd + fx), len);
+			re__strncopy(ofd + fx, nfd + fx, len);
 		} else {
 			ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
-			term_overwrite(el, nfd, (nsb - nfd));
-			re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+			len = (size_t)(nsb - nfd);
+			term_overwrite(el, nfd, len);
+			re__strncopy(ofd, nfd, len);
 			/*
 		         * Done
 		         */
@@ -778,7 +809,7 @@ re_update_line(EditLine *el, char *old, 
 		/*
 		 * move to the first char to delete where the first diff is
 		 */
-		term_move_to_char(el, ofd - old);
+		term_move_to_char(el, (int)(ofd - old));
 		/*
 		 * Check if we have stuff to save
 		 */
@@ -792,14 +823,15 @@ re_update_line(EditLine *el, char *old, 
 				ELRE_DEBUG(!EL_CAN_DELETE, (__F,
 				    "ERROR: cannot delete in first diff\n"));
 				term_deletechars(el, -fx);
-				re_delete(el, old, ofd - old,
+				re_delete(el, old, (int)(ofd - old),
 				    el->el_term.t_size.h, -fx);
 			}
 			/*
 		         * write (nsb-nfd) chars of new starting at nfd
 		         */
-			term_overwrite(el, nfd, (nsb - nfd));
-			re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+			len = (size_t) (nsb - nfd);
+			term_overwrite(el, nfd, len);
+			re__strncopy(ofd, nfd, len);
 
 		} else {
 			ELRE_DEBUG(1, (__F,
@@ -807,8 +839,9 @@ re_update_line(EditLine *el, char *old, 
 			/*
 		         * write (nsb-nfd) chars of new starting at nfd
 		         */
-			term_overwrite(el, nfd, (nsb - nfd));
-			re_clear_eol(el, fx, sx, (oe - old) - (ne - new));
+			term_overwrite(el, nfd, (size_t)(nsb - nfd));
+			re_clear_eol(el, fx, sx,
+			    (int)((oe - old) - (ne - new)));
 			/*
 		         * Done
 		         */
@@ -827,7 +860,7 @@ re_update_line(EditLine *el, char *old, 
 		 * fx is the number of characters inserted (+) or deleted (-)
 		 */
 
-		term_move_to_char(el, (ose - old) + fx);
+		term_move_to_char(el, (int)((ose - old) + fx));
 		/*
 		 * Check if we have stuff to save
 		 */
@@ -844,12 +877,13 @@ re_update_line(EditLine *el, char *old, 
 			/*
 		         * write (nls-nse) chars of new starting at nse
 		         */
-			term_overwrite(el, nse, (nls - nse));
+			term_overwrite(el, nse, (size_t)(nls - nse));
 		} else {
 			ELRE_DEBUG(1, (__F,
 			    "but with nothing left to save\r\n"));
-			term_overwrite(el, nse, (nls - nse));
-			re_clear_eol(el, fx, sx, (oe - old) - (ne - new));
+			term_overwrite(el, nse, (size_t)(nls - nse));
+			re_clear_eol(el, fx, sx,
+			    (int)((oe - old) - (ne - new)));
 		}
 	}
 	/*
@@ -859,7 +893,7 @@ re_update_line(EditLine *el, char *old, 
 		ELRE_DEBUG(1, (__F, "late first diff insert at %d...\r\n",
 		    nfd - new));
 
-		term_move_to_char(el, nfd - new);
+		term_move_to_char(el, (int)(nfd - new));
 		/*
 		 * Check if we have stuff to keep at the end
 		 */
@@ -870,7 +904,7 @@ re_update_line(EditLine *el, char *old, 
 		         * to zero above as a flag saying that we hadn't done
 		         * an early first insert.
 		         */
-			fx = (nsb - nfd) - (osb - ofd);
+			fx = (int)((nsb - nfd) - (osb - ofd));
 			if (fx > 0) {
 				/*
 				 * insert fx chars of new starting at nfd
@@ -878,20 +912,21 @@ re_update_line(EditLine *el, char *old, 
 				ELRE_DEBUG(!EL_CAN_INSERT, (__F,
 				 "ERROR: cannot insert in late first diff\n"));
 				term_insertwrite(el, nfd, fx);
-				re_insert(el, old, ofd - old,
+				re_insert(el, old, (int)(ofd - old),
 				    el->el_term.t_size.h, nfd, fx);
 			}
 			/*
 		         * write (nsb-nfd) - fx chars of new starting at
 		         * (nfd + fx)
 			 */
-			term_overwrite(el, nfd + fx, (nsb - nfd) - fx);
-			re__strncopy(ofd + fx, nfd + fx,
-			    (size_t) ((nsb - nfd) - fx));
+			len = (size_t) ((nsb - nfd) - fx);
+			term_overwrite(el, (nfd + fx), len);
+			re__strncopy(ofd + fx, nfd + fx, len);
 		} else {
 			ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
-			term_overwrite(el, nfd, (nsb - nfd));
-			re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+			len = (size_t) (nsb - nfd);
+			term_overwrite(el, nfd, len);
+			re__strncopy(ofd, nfd, len);
 		}
 	}
 	/*
@@ -899,8 +934,8 @@ re_update_line(EditLine *el, char *old, 
          */
 	if (sx >= 0) {
 		ELRE_DEBUG(1, (__F,
-		    "second diff insert at %d...\r\n", nse - new));
-		term_move_to_char(el, nse - new);
+		    "second diff insert at %d...\r\n", (int)(nse - new)));
+		term_move_to_char(el, (int)(nse - new));
 		if (ols != oe) {
 			ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n"));
 			if (sx > 0) {
@@ -913,10 +948,11 @@ re_update_line(EditLine *el, char *old, 
 		         * write (nls-nse) - sx chars of new starting at
 			 * (nse + sx)
 		         */
-			term_overwrite(el, nse + sx, (nls - nse) - sx);
+			term_overwrite(el, (nse + sx),
+			    (size_t)((nls - nse) - sx));
 		} else {
 			ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
-			term_overwrite(el, nse, (nls - nse));
+			term_overwrite(el, nse, (size_t)(nls - nse));
 
 			/*
 	                 * No need to do a clear-to-end here because we were
@@ -933,7 +969,7 @@ re_update_line(EditLine *el, char *old, 
  *	Copy string and pad with spaces
  */
 private void
-re__copy_and_pad(char *dst, const char *src, size_t width)
+re__copy_and_pad(Char *dst, const Char *src, size_t width)
 {
 	size_t i;
 
@@ -956,8 +992,8 @@ re__copy_and_pad(char *dst, const char *
 protected void
 re_refresh_cursor(EditLine *el)
 {
-	char *cp, c;
-	int h, v, th;
+	Char *cp;
+	int h, v, th, w;
 
 	if (el->el_line.cursor >= el->el_line.lastchar) {
 		if (el->el_map.current == el->el_map.alt
@@ -974,38 +1010,37 @@ re_refresh_cursor(EditLine *el)
 
 	/* do input buffer to el->el_line.cursor */
 	for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) {
-		c = *cp;
-		h++;		/* all chars at least this long */
-
-		if (c == '\n') {/* handle newline in data part too */
+                switch (ct_chr_class(*cp)) {
+		case CHTYPE_NL:  /* handle newline in data part too */
 			h = 0;
 			v++;
-		} else {
-			if (c == '\t') {	/* if a tab, to next tab stop */
-				while (h & 07) {
-					h++;
-				}
-			} else if (iscntrl((unsigned char) c)) {
-						/* if control char */
-				h++;
-				if (h > th) {	/* if overflow, compensate */
-					h = 1;
-					v++;
-				}
-			} else if (!el_isprint((unsigned char) c)) {
-				h += 3;
-				if (h > th) {	/* if overflow, compensate */
-					h = h - th;
-					v++;
-				}
+			break;
+		case CHTYPE_TAB: /* if a tab, to next tab stop */
+			while (++h & 07)
+				continue;
+			break;
+		default:
+			w = Width(*cp);
+			if (w > 1 && h + w > th) { /* won't fit on line */
+				h = 0;
+				v++;
 			}
-		}
+			h += ct_visual_width(*cp);
+			break;
+                }
 
 		if (h >= th) {	/* check, extra long tabs picked up here also */
-			h = 0;
+			h -= th;
 			v++;
 		}
 	}
+        /* if we have a next character, and it's a doublewidth one, we need to
+         * check whether we need to linebreak for it to fit */
+        if (cp < el->el_line.lastchar && (w = Width(*cp)) > 1)
+                if (h + w > th) {
+                    h = 0;
+                    v++;
+                }
 
 	/* now go there */
 	term_move_to_line(el, v);
@@ -1018,11 +1053,18 @@ re_refresh_cursor(EditLine *el)
  *	Add a character fast.
  */
 private void
-re_fastputc(EditLine *el, int c)
+re_fastputc(EditLine *el, Int c)
 {
+	int w = Width((Char)c);
+	while (w > 1 && el->el_cursor.h + w > el->el_term.t_size.h)
+	    re_fastputc(el, ' ');
 
 	term__putc(el, c);
 	el->el_display[el->el_cursor.v][el->el_cursor.h++] = c;
+	while (--w > 0)
+		el->el_display[el->el_cursor.v][el->el_cursor.h++]
+			= MB_FILL_CHAR;
+
 	if (el->el_cursor.h >= el->el_term.t_size.h) {
 		/* if we must overflow */
 		el->el_cursor.h = 0;
@@ -1035,13 +1077,13 @@ re_fastputc(EditLine *el, int c)
 		 */
 		if (el->el_cursor.v + 1 >= el->el_term.t_size.v) {
 			int i, lins = el->el_term.t_size.v;
-			char *firstline = el->el_display[0];
+			Char *firstline = el->el_display[0];
 	
-			for(i=1; i < lins; i++)
-				el->el_display[i-1] = el->el_display[i];
+			for(i = 1; i < lins; i++)
+				el->el_display[i - 1] = el->el_display[i];
 
-			re__copy_and_pad(firstline, "", 0);
-			el->el_display[i-1] = firstline;
+			re__copy_and_pad(firstline, STR(""), 0);
+			el->el_display[i - 1] = firstline;
 		} else {
 			el->el_cursor.v++;
 			el->el_refresh.r_oldcv++;
@@ -1066,7 +1108,7 @@ re_fastputc(EditLine *el, int c)
 protected void
 re_fastaddc(EditLine *el)
 {
-	char c;
+	Char c;
 	int rhdiff;
 
 	c = el->el_line.cursor[-1];
@@ -1081,17 +1123,22 @@ re_fastaddc(EditLine *el)
 		re_refresh(el);	/* clear out rprompt if less than 1 char gap */
 		return;
 	}			/* else (only do at end of line, no TAB) */
-	if (iscntrl((unsigned char) c)) {	/* if control char, do caret */
-		char mc = (c == '\177') ? '?' : (c | 0100);
-		re_fastputc(el, '^');
-		re_fastputc(el, mc);
-	} else if (el_isprint((unsigned char) c)) {	/* normal char */
+	switch (ct_chr_class(c)) {
+	case CHTYPE_TAB: /* already handled, should never happen here */
+		break;
+	case CHTYPE_NL:
+	case CHTYPE_PRINT:
 		re_fastputc(el, c);
-	} else {
-		re_fastputc(el, '\\');
-		re_fastputc(el, (int)(((((unsigned int)c) >> 6) & 3) + '0'));
-		re_fastputc(el, (int)(((((unsigned int)c) >> 3) & 7) + '0'));
-		re_fastputc(el, (c & 7) + '0');
+		break;
+	case CHTYPE_ASCIICTL:
+	case CHTYPE_NONPRINT: {
+		Char visbuf[VISUAL_WIDTH_MAX];
+		ssize_t i, n =
+		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
+		for (i = 0; n-- > 0; ++i)
+			re_fastputc(el, visbuf[i]);
+		break;
+	}
 	}
 	term__flush(el);
 }
@@ -1122,13 +1169,12 @@ re_clear_lines(EditLine *el)
 
 	if (EL_CAN_CEOL) {
 		int i;
-		term_move_to_char(el, 0);
-		for (i = 0; i <= el->el_refresh.r_oldcv; i++) {
+		for (i = el->el_refresh.r_oldcv; i >= 0; i--) {
 			/* for each line on the screen */
 			term_move_to_line(el, i);
+			term_move_to_char(el, 0);
 			term_clear_EOL(el, el->el_term.t_size.h);
 		}
-		term_move_to_line(el, 0);
 	} else {
 		term_move_to_line(el, el->el_refresh.r_oldcv);
 					/* go to last line */

=== modified file 'cmd-line-utils/libedit/refresh.h'
--- a/cmd-line-utils/libedit/refresh.h	2005-04-21 10:06:46 +0000
+++ b/cmd-line-utils/libedit/refresh.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: refresh.h,v 1.5 2003/08/07 16:44:33 agc Exp $	*/
+/*	$NetBSD: refresh.h,v 1.6 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -48,7 +48,7 @@ typedef struct {
 	int	r_newcv;
 } el_refresh_t;
 
-protected void	re_putc(EditLine *, int, int);
+protected void	re_putc(EditLine *, Int, int);
 protected void	re_clear_lines(EditLine *);
 protected void	re_clear_display(EditLine *);
 protected void	re_refresh(EditLine *);

=== modified file 'cmd-line-utils/libedit/search.c'
--- a/cmd-line-utils/libedit/search.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/search.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: search.c,v 1.20 2004/11/04 01:16:03 christos Exp $	*/
+/*	$NetBSD: search.c,v 1.24 2010/04/15 00:57:33 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -65,7 +65,8 @@ protected int
 search_init(EditLine *el)
 {
 
-	el->el_search.patbuf = (char *) el_malloc(EL_BUFSIZ);
+	el->el_search.patbuf = el_malloc(EL_BUFSIZ *
+	    sizeof(*el->el_search.patbuf));
 	if (el->el_search.patbuf == NULL)
 		return (-1);
 	el->el_search.patlen = 0;
@@ -105,8 +106,11 @@ regerror(const char *msg)
  *	Return if string matches pattern
  */
 protected int
-el_match(const char *str, const char *pat)
+el_match(const Char *str, const Char *pat)
 {
+#ifdef WIDECHAR
+	static ct_buffer_t conv;
+#endif
 #if defined (REGEX)
 	regex_t re;
 	int rv;
@@ -118,30 +122,30 @@ el_match(const char *str, const char *pa
 	extern int	 re_exec(const char *);
 #endif
 
-	if (strstr(str, pat) != NULL)
+	if (Strstr(str, pat) != 0)
 		return (1);
 
 #if defined(REGEX)
-	if (regcomp(&re, pat, 0) == 0) {
-		rv = regexec(&re, str, 0, NULL, 0) == 0;
+	if (regcomp(&re, ct_encode_string(pat, &conv), 0) == 0) {
+		rv = regexec(&re, ct_encode_string(str, &conv), 0, NULL, 0) == 0;
 		regfree(&re);
 	} else {
 		rv = 0;
 	}
 	return (rv);
 #elif defined(REGEXP)
-	if ((re = regcomp(pat)) != NULL) {
-		rv = regexec(re, str);
+	if ((re = regcomp(ct_encode_string(pat, &conv))) != NULL) {
+		rv = regexec(re, ct_encode_string(str, &conv));
 		free((ptr_t) re);
 	} else {
 		rv = 0;
 	}
 	return (rv);
 #else
-	if (re_comp(pat) != NULL)
+	if (re_comp(ct_encode_string(pat, &conv)) != NULL)
 		return (0);
 	else
-		return (re_exec(str) == 1);
+		return (re_exec(ct_encode_string(str, &conv)) == 1);
 #endif
 }
 
@@ -150,7 +154,7 @@ el_match(const char *str, const char *pa
  *	 return True if the pattern matches the prefix
  */
 protected int
-c_hmatch(EditLine *el, const char *str)
+c_hmatch(EditLine *el, const Char *str)
 {
 #ifdef SDEBUG
 	(void) fprintf(el->el_errfile, "match `%s' with `%s'\n",
@@ -173,11 +177,11 @@ c_setpat(EditLine *el)
 		if (el->el_search.patlen >= EL_BUFSIZ)
 			el->el_search.patlen = EL_BUFSIZ - 1;
 		if (el->el_search.patlen != 0) {
-			(void) strncpy(el->el_search.patbuf, el->el_line.buffer,
+			(void) Strncpy(el->el_search.patbuf, el->el_line.buffer,
 			    el->el_search.patlen);
 			el->el_search.patbuf[el->el_search.patlen] = '\0';
 		} else
-			el->el_search.patlen = strlen(el->el_search.patbuf);
+			el->el_search.patlen = Strlen(el->el_search.patbuf);
 	}
 #ifdef SDEBUG
 	(void) fprintf(el->el_errfile, "\neventno = %d\n",
@@ -198,21 +202,22 @@ c_setpat(EditLine *el)
 protected el_action_t
 ce_inc_search(EditLine *el, int dir)
 {
-	static const char STRfwd[] = {'f', 'w', 'd', '\0'},
+	static const Char STRfwd[] = {'f', 'w', 'd', '\0'},
 	     STRbck[] = {'b', 'c', 'k', '\0'};
-	static char pchar = ':';/* ':' = normal, '?' = failed */
-	static char endcmd[2] = {'\0', '\0'};
-	char ch, *ocursor = el->el_line.cursor, oldpchar = pchar;
-	const char *cp;
+	static Char pchar = ':';/* ':' = normal, '?' = failed */
+	static Char endcmd[2] = {'\0', '\0'};
+	Char ch, *ocursor = el->el_line.cursor, oldpchar = pchar;
+	const Char *cp;
 
 	el_action_t ret = CC_NORM;
 
 	int ohisteventno = el->el_history.eventno;
-	int oldpatlen = el->el_search.patlen;
+	size_t oldpatlen = el->el_search.patlen;
 	int newdir = dir;
 	int done, redo;
 
-	if (el->el_line.lastchar + sizeof(STRfwd) / sizeof(char) + 2 +
+	if (el->el_line.lastchar + sizeof(STRfwd) /
+	    sizeof(*el->el_line.lastchar) + 2 +
 	    el->el_search.patlen >= el->el_line.limit)
 		return (CC_ERROR);
 
@@ -241,7 +246,7 @@ ce_inc_search(EditLine *el, int dir)
 		*el->el_line.lastchar = '\0';
 		re_refresh(el);
 
-		if (el_getc(el, &ch) != 1)
+		if (FUN(el,getc)(el, &ch) != 1)
 			return (ed_end_of_file(el, 0));
 
 		switch (el->el_map.current[(unsigned char) ch]) {
@@ -317,7 +322,7 @@ ce_inc_search(EditLine *el, int dir)
 
 			default:	/* Terminate and execute cmd */
 				endcmd[0] = ch;
-				el_push(el, endcmd);
+				FUN(el,push)(el, endcmd);
 				/* FALLTHROUGH */
 
 			case 0033:	/* ESC: Terminate */
@@ -444,8 +449,8 @@ ce_inc_search(EditLine *el, int dir)
 protected el_action_t
 cv_search(EditLine *el, int dir)
 {
-	char ch;
-	char tmpbuf[EL_BUFSIZ];
+	Char ch;
+	Char tmpbuf[EL_BUFSIZ];
 	int tmplen;
 
 #ifdef ANCHOR
@@ -457,7 +462,7 @@ cv_search(EditLine *el, int dir)
 	el->el_search.patdir = dir;
 
 	tmplen = c_gets(el, &tmpbuf[LEN],
-		dir == ED_SEARCH_PREV_HISTORY ? "\n/" : "\n?" );
+		dir == ED_SEARCH_PREV_HISTORY ? STR("\n/") : STR("\n?") );
 	if (tmplen == -1)
 		return CC_REFRESH;
 
@@ -476,11 +481,11 @@ cv_search(EditLine *el, int dir)
 #ifdef ANCHOR
 		if (el->el_search.patbuf[0] != '.' &&
 		    el->el_search.patbuf[0] != '*') {
-			(void) strncpy(tmpbuf, el->el_search.patbuf,
-			    sizeof(tmpbuf) - 1);
+			(void) Strncpy(tmpbuf, el->el_search.patbuf,
+			    sizeof(tmpbuf) / sizeof(*tmpbuf) - 1);
 			el->el_search.patbuf[0] = '.';
 			el->el_search.patbuf[1] = '*';
-			(void) strncpy(&el->el_search.patbuf[2], tmpbuf,
+			(void) Strncpy(&el->el_search.patbuf[2], tmpbuf,
 			    EL_BUFSIZ - 3);
 			el->el_search.patlen++;
 			el->el_search.patbuf[el->el_search.patlen++] = '.';
@@ -494,7 +499,7 @@ cv_search(EditLine *el, int dir)
 		tmpbuf[tmplen++] = '*';
 #endif
 		tmpbuf[tmplen] = '\0';
-		(void) strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);
+		(void) Strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);
 		el->el_search.patlen = tmplen;
 	}
 	el->el_state.lastcmd = (el_action_t) dir;	/* avoid c_setpat */
@@ -518,9 +523,9 @@ cv_search(EditLine *el, int dir)
 protected el_action_t
 ce_search_line(EditLine *el, int dir)
 {
-	char *cp = el->el_line.cursor;
-	char *pattern = el->el_search.patbuf;
-	char oc, *ocp;
+	Char *cp = el->el_line.cursor;
+	Char *pattern = el->el_search.patbuf;
+	Char oc, *ocp;
 #ifdef ANCHOR
 	ocp = &pattern[1];
 	oc = *ocp;
@@ -558,12 +563,12 @@ ce_search_line(EditLine *el, int dir)
  *	Vi repeat search
  */
 protected el_action_t
-cv_repeat_srch(EditLine *el, int c)
+cv_repeat_srch(EditLine *el, Int c)
 {
 
 #ifdef SDEBUG
 	(void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n",
-	    c, el->el_search.patlen, el->el_search.patbuf);
+	    c, el->el_search.patlen, ct_encode_string(el->el_search.patbuf));
 #endif
 
 	el->el_state.lastcmd = (el_action_t) c;	/* Hack to stop c_setpat */
@@ -584,16 +589,16 @@ cv_repeat_srch(EditLine *el, int c)
  *	Vi character search
  */
 protected el_action_t
-cv_csearch(EditLine *el, int direction, int ch, int count, int tflag)
+cv_csearch(EditLine *el, int direction, Int ch, int count, int tflag)
 {
-	char *cp;
+	Char *cp;
 
 	if (ch == 0)
 		return CC_ERROR;
 
 	if (ch == -1) {
-		char c;
-		if (el_getc(el, &c) != 1)
+		Char c;
+		if (FUN(el,getc)(el, &c) != 1)
 			return ed_end_of_file(el, 0);
 		ch = c;
 	}

=== modified file 'cmd-line-utils/libedit/search.h'
--- a/cmd-line-utils/libedit/search.h	2005-04-21 10:06:46 +0000
+++ b/cmd-line-utils/libedit/search.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: search.h,v 1.8 2003/10/18 23:27:36 christos Exp $	*/
+/*	$NetBSD: search.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -43,24 +43,24 @@
 #include "histedit.h"
 
 typedef struct el_search_t {
-	char	*patbuf;		/* The pattern buffer		*/
+	Char	*patbuf;		/* The pattern buffer		*/
 	size_t	 patlen;		/* Length of the pattern buffer	*/
 	int	 patdir;		/* Direction of the last search	*/
 	int	 chadir;		/* Character search direction	*/
-	char	 chacha;		/* Character we are looking for	*/
+	Char	 chacha;		/* Character we are looking for	*/
 	char	 chatflg;		/* 0 if f, 1 if t */
 } el_search_t;
 
 
-protected int		el_match(const char *, const char *);
+protected int		el_match(const Char *, const Char *);
 protected int		search_init(EditLine *);
 protected void		search_end(EditLine *);
-protected int		c_hmatch(EditLine *, const char *);
+protected int		c_hmatch(EditLine *, const Char *);
 protected void		c_setpat(EditLine *);
 protected el_action_t	ce_inc_search(EditLine *, int);
 protected el_action_t	cv_search(EditLine *, int);
 protected el_action_t	ce_search_line(EditLine *, int);
-protected el_action_t	cv_repeat_srch(EditLine *, int);
-protected el_action_t	cv_csearch(EditLine *, int, int, int, int);
+protected el_action_t	cv_repeat_srch(EditLine *, Int);
+protected el_action_t	cv_csearch(EditLine *, int, Int, int, int);
 
 #endif /* _h_el_search */

=== modified file 'cmd-line-utils/libedit/sig.c'
--- a/cmd-line-utils/libedit/sig.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/sig.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sig.c,v 1.12 2008/09/10 15:45:37 christos Exp $	*/
+/*	$NetBSD: sig.c,v 1.15 2009/02/19 15:20:22 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -74,6 +74,8 @@ el_sig_handler(int signo)
 	(void) sigaddset(&nset, signo);
 	(void) sigprocmask(SIG_BLOCK, &nset, &oset);
 
+	sel->el_signal->sig_no = signo;
+
 	switch (signo) {
 	case SIGCONT:
 		tty_rawmode(sel);
@@ -95,7 +97,10 @@ el_sig_handler(int signo)
 		if (signo == sighdl[i])
 			break;
 
-	(void) signal(signo, sel->el_signal[i]);
+	(void) sigaction(signo, &sel->el_signal->sig_action[i], NULL);
+	sel->el_signal->sig_action[i].sa_handler = SIG_ERR;
+	sel->el_signal->sig_action[i].sa_flags = 0;
+	sigemptyset(&sel->el_signal->sig_action[i].sa_mask);
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
 	(void) kill(0, signo);
 }
@@ -107,26 +112,29 @@ el_sig_handler(int signo)
 protected int
 sig_init(EditLine *el)
 {
-	int i;
-	sigset_t nset, oset;
+	size_t i;
+	sigset_t *nset, oset;
 
-	(void) sigemptyset(&nset);
-#define	_DO(a) (void) sigaddset(&nset, a);
+	el->el_signal = el_malloc(sizeof(*el->el_signal));
+	if (el->el_signal == NULL)
+		return -1;
+
+	nset = &el->el_signal->sig_set;
+	(void) sigemptyset(nset);
+#define	_DO(a) (void) sigaddset(nset, a);
 	ALLSIGS
 #undef	_DO
-	    (void) sigprocmask(SIG_BLOCK, &nset, &oset);
+	(void) sigprocmask(SIG_BLOCK, nset, &oset);
 
-#define	SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(el_signalhandler_t))
-
-	el->el_signal = (el_signalhandler_t *) el_malloc(SIGSIZE);
-	if (el->el_signal == NULL)
-		return (-1);
-	for (i = 0; sighdl[i] != -1; i++)
-		el->el_signal[i] = SIG_ERR;
+	for (i = 0; sighdl[i] != -1; i++) {
+		el->el_signal->sig_action[i].sa_handler = SIG_ERR;
+		el->el_signal->sig_action[i].sa_flags = 0;
+		sigemptyset(&el->el_signal->sig_action[i].sa_mask);
+	}
 
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
 
-	return (0);
+	return 0;
 }
 
 
@@ -148,20 +156,21 @@ sig_end(EditLine *el)
 protected void
 sig_set(EditLine *el)
 {
-	int i;
-	sigset_t nset, oset;
+	size_t i;
+	sigset_t oset;
+	struct sigaction osa, nsa;
+
+	nsa.sa_handler = el_sig_handler;
+	nsa.sa_flags = 0;
+	sigemptyset(&nsa.sa_mask);
 
-	(void) sigemptyset(&nset);
-#define	_DO(a) (void) sigaddset(&nset, a);
-	ALLSIGS
-#undef	_DO
-	    (void) sigprocmask(SIG_BLOCK, &nset, &oset);
+	(void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
 
 	for (i = 0; sighdl[i] != -1; i++) {
-		el_signalhandler_t s;
 		/* This could happen if we get interrupted */
-		if ((s = signal(sighdl[i], el_sig_handler)) != el_sig_handler)
-			el->el_signal[i] = s;
+		if (sigaction(sighdl[i], &nsa, &osa) != -1 &&
+		    osa.sa_handler != el_sig_handler)
+			el->el_signal->sig_action[i] = osa;
 	}
 	sel = el;
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
@@ -174,20 +183,17 @@ sig_set(EditLine *el)
 protected void
 sig_clr(EditLine *el)
 {
-	int i;
-	sigset_t nset, oset;
+	size_t i;
+	sigset_t oset;
 
-	(void) sigemptyset(&nset);
-#define	_DO(a) (void) sigaddset(&nset, a);
-	ALLSIGS
-#undef	_DO
-	    (void) sigprocmask(SIG_BLOCK, &nset, &oset);
+	(void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
 
 	for (i = 0; sighdl[i] != -1; i++)
-		if (el->el_signal[i] != SIG_ERR)
-			(void) signal(sighdl[i], el->el_signal[i]);
+		if (el->el_signal->sig_action[i].sa_handler != SIG_ERR)
+			(void)sigaction(sighdl[i],
+			    &el->el_signal->sig_action[i], NULL);
 
 	sel = NULL;		/* we are going to die if the handler is
 				 * called */
-	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
+	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
 }

=== modified file 'cmd-line-utils/libedit/sig.h'
--- a/cmd-line-utils/libedit/sig.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/sig.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sig.h,v 1.6 2008/07/12 15:27:14 christos Exp $	*/
+/*	$NetBSD: sig.h,v 1.8 2009/02/19 15:20:22 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -56,9 +56,13 @@
 	_DO(SIGTERM)	\
 	_DO(SIGCONT)	\
 	_DO(SIGWINCH)
+#define ALLSIGSNO	7
 
-typedef void (*el_signalhandler_t)(int);
-typedef el_signalhandler_t *el_signal_t;
+typedef struct {
+	struct sigaction sig_action[ALLSIGSNO];
+	sigset_t sig_set;
+	volatile sig_atomic_t sig_no;
+} *el_signal_t;
 
 protected void	sig_end(EditLine*);
 protected int	sig_init(EditLine*);

=== modified file 'cmd-line-utils/libedit/sys.h'
--- a/cmd-line-utils/libedit/sys.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/sys.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys.h,v 1.9 2004/01/17 17:57:40 christos Exp $	*/
+/*	$NetBSD: sys.h,v 1.13 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -79,6 +79,10 @@
 			/* When we want to hide everything	*/
 #endif
 
+#ifndef __arraycount
+# define __arraycount(a) (sizeof(a) / sizeof(*(a)))
+#endif
+
 #ifndef HAVE_U_INT32_T
 typedef unsigned int  u_int32_t;
 #endif
@@ -113,7 +117,7 @@ char	*fgetln(FILE *fp, size_t *len);
 #define	REGEX		/* Use POSIX.2 regular expression functions */
 #undef	REGEXP		/* Use UNIX V8 regular expression functions */
 
-#ifdef __SunOS
+#if defined(__sun)
 extern int tgetent(char *, const char *);
 extern int tgetflag(char *);
 extern int tgetnum(char *);

=== modified file 'cmd-line-utils/libedit/term.c'
--- a/cmd-line-utils/libedit/term.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/term.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: term.c,v 1.48 2009/02/06 20:08:13 sketch Exp $	*/
+/*	$NetBSD: term.c,v 1.57 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -50,6 +50,7 @@ static char sccsid[] = "@(#)term.c	8.2 (
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <limits.h>
 #if 0 /* TODO: do we need this */
 #ifdef HAVE_TERMCAP_H
 #include <termcap.h>
@@ -57,12 +58,12 @@ static char sccsid[] = "@(#)term.c	8.2 (
 #endif
 #ifdef HAVE_CURSES_H
 #include <curses.h>
-#endif
-#ifdef HAVE_NCURSES_H
+#elif HAVE_NCURSES_H
 #include <ncurses.h>
 #endif
-/* Don't use Solaris's term.h. */
-#if (defined(HAVE_TERM_H) && !defined(__SunOS))
+/* Solaris's term.h does horrid things. */
+
+#if defined(HAVE_TERM_H) && !defined(__sun)
 #include <term.h>
 #endif
 #include <sys/types.h>
@@ -76,7 +77,7 @@ static char sccsid[] = "@(#)term.c	8.2 (
 
 /*
  * IMPORTANT NOTE: these routines are allowed to look at the current screen
- * and the current possition assuming that it is correct.  If this is not
+ * and the current position assuming that it is correct.  If this is not
  * true, then the update will be WRONG!  This is (should be) a valid
  * assumption...
  */
@@ -389,7 +390,7 @@ private void
 term_alloc(EditLine *el, const struct termcapstr *t, const char *cap)
 {
 	char termbuf[TC_BUFSIZE];
-	int tlen, clen;
+	size_t tlen, clen;
 	char **tlist = el->el_term.t_str;
 	char **tmp, **str = &tlist[t - tstr];
 
@@ -416,7 +417,7 @@ term_alloc(EditLine *el, const struct te
 						/* XXX strcpy is safe */
 		(void) strcpy(*str = &el->el_term.t_buf[el->el_term.t_loc],
 		    cap);
-		el->el_term.t_loc += clen + 1;	/* one for \0 */
+		el->el_term.t_loc += (int)clen + 1;	/* one for \0 */
 		return;
 	}
 	/*
@@ -433,7 +434,7 @@ term_alloc(EditLine *el, const struct te
 			termbuf[tlen++] = '\0';
 		}
 	memcpy(el->el_term.t_buf, termbuf, TC_BUFSIZE);
-	el->el_term.t_loc = tlen;
+	el->el_term.t_loc = (int)tlen;
 	if (el->el_term.t_loc + 3 >= TC_BUFSIZE) {
 		(void) fprintf(el->el_errfile,
 		    "Out of termcap string space.\n");
@@ -441,7 +442,7 @@ term_alloc(EditLine *el, const struct te
 	}
 					/* XXX strcpy is safe */
 	(void) strcpy(*str = &el->el_term.t_buf[el->el_term.t_loc], cap);
-	el->el_term.t_loc += clen + 1;	/* one for \0 */
+	el->el_term.t_loc += (int)clen + 1;	/* one for \0 */
 	return;
 }
 
@@ -472,14 +473,14 @@ private int
 term_alloc_display(EditLine *el)
 {
 	int i;
-	char **b;
+	Char **b;
 	coord_t *c = &el->el_term.t_size;
 
-	b = (char **) el_malloc((size_t) (sizeof(char *) * (c->v + 1)));
+	b =  el_malloc(sizeof(*b) * (c->v + 1));
 	if (b == NULL)
 		return (-1);
 	for (i = 0; i < c->v; i++) {
-		b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1)));
+		b[i] = el_malloc(sizeof(**b) * (c->h + 1));
 		if (b[i] == NULL) {
 			while (--i >= 0)
 				el_free((ptr_t) b[i]);
@@ -490,11 +491,11 @@ term_alloc_display(EditLine *el)
 	b[c->v] = NULL;
 	el->el_display = b;
 
-	b = (char **) el_malloc((size_t) (sizeof(char *) * (c->v + 1)));
+	b = el_malloc(sizeof(*b) * (c->v + 1));
 	if (b == NULL)
 		return (-1);
 	for (i = 0; i < c->v; i++) {
-		b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1)));
+		b[i] = el_malloc(sizeof(**b) * (c->h + 1));
 		if (b[i] == NULL) {
 			while (--i >= 0)
 				el_free((ptr_t) b[i]);
@@ -514,21 +515,21 @@ term_alloc_display(EditLine *el)
 private void
 term_free_display(EditLine *el)
 {
-	char **b;
-	char **bufp;
+	Char **b;
+	Char **bufp;
 
 	b = el->el_display;
 	el->el_display = NULL;
 	if (b != NULL) {
 		for (bufp = b; *bufp != NULL; bufp++)
-			el_free((ptr_t) * bufp);
+			el_free((ptr_t) *bufp);
 		el_free((ptr_t) b);
 	}
 	b = el->el_vdisplay;
 	el->el_vdisplay = NULL;
 	if (b != NULL) {
 		for (bufp = b; *bufp != NULL; bufp++)
-			el_free((ptr_t) * bufp);
+			el_free((ptr_t) *bufp);
 		el_free((ptr_t) b);
 	}
 }
@@ -557,11 +558,20 @@ term_move_to_line(EditLine *el, int wher
 		while (del > 0) {
 			if (EL_HAS_AUTO_MARGINS &&
 			    el->el_display[el->el_cursor.v][0] != '\0') {
+                                size_t h = el->el_term.t_size.h - 1;
+#ifdef WIDECHAR
+                                for (; h > 0 &&
+                                         el->el_display[el->el_cursor.v][h] ==
+                                                 MB_FILL_CHAR;
+                                         h--)
+                                                continue;
+#endif
 				/* move without newline */
-				term_move_to_char(el, el->el_term.t_size.h - 1);
-				term_overwrite(el,
-				    &el->el_display[el->el_cursor.v][el->el_cursor.h],
-				    1);
+				term_move_to_char(el, (int)h);
+				term_overwrite(el, &el->el_display
+				    [el->el_cursor.v][el->el_cursor.h],
+				    (size_t)(el->el_term.t_size.h -
+				    el->el_cursor.h));
 				/* updates Cursor */
 				del--;
 			} else {
@@ -627,15 +637,21 @@ mc_again:
 					/* if I can do tabs, use them */
 				if (EL_CAN_TAB) {
 					if ((el->el_cursor.h & 0370) !=
-					    (where & 0370)) {
+					    (where & ~0x7)
+#ifdef WIDECHAR
+					    && (el->el_display[
+					    el->el_cursor.v][where & 0370] !=
+					    MB_FILL_CHAR)
+#endif
+					    ) {
 						/* if not within tab stop */
 						for (i =
 						    (el->el_cursor.h & 0370);
-						    i < (where & 0370);
+						    i < (where & ~0x7);
 						    i += 8)
 							term__putc(el, '\t');	
 							/* then tab over */
-						el->el_cursor.h = where & 0370;
+						el->el_cursor.h = where & ~0x7;
 					}
 				}
 				/*
@@ -646,9 +662,9 @@ mc_again:
 				 * NOTE THAT term_overwrite() WILL CHANGE
 				 * el->el_cursor.h!!!
 				 */
-				term_overwrite(el,
-				    &el->el_display[el->el_cursor.v][el->el_cursor.h],
-				    where - el->el_cursor.h);
+				term_overwrite(el, &el->el_display[
+				    el->el_cursor.v][el->el_cursor.h],
+				    (size_t)(where - el->el_cursor.h));
 
 			}
 		} else {	/* del < 0 := moving backward */
@@ -680,24 +696,27 @@ mc_again:
 
 /* term_overwrite():
  *	Overstrike num characters
+ *	Assumes MB_FILL_CHARs are present to keep the column count correct
  */
 protected void
-term_overwrite(EditLine *el, const char *cp, int n)
+term_overwrite(EditLine *el, const Char *cp, size_t n)
 {
-	if (n <= 0)
-		return;		/* catch bugs */
+	if (n == 0)
+		return;
 
-	if (n > el->el_term.t_size.h) {
+	if (n > (size_t)el->el_term.t_size.h) {
 #ifdef DEBUG_SCREEN
 		(void) fprintf(el->el_errfile,
 		    "term_overwrite: n is riduculous: %d\r\n", n);
 #endif /* DEBUG_SCREEN */
 		return;
 	}
-	do {
-		term__putc(el, *cp++);
-		el->el_cursor.h++;
-	} while (--n);
+
+        do {
+                /* term__putc() ignores any MB_FILL_CHARs */
+                term__putc(el, *cp++);
+                el->el_cursor.h++;
+        } while (--n);
 
 	if (el->el_cursor.h >= el->el_term.t_size.h) {	/* wrap? */
 		if (EL_HAS_AUTO_MARGINS) {	/* yes */
@@ -706,16 +725,22 @@ term_overwrite(EditLine *el, const char 
 			if (EL_HAS_MAGIC_MARGINS) {
 				/* force the wrap to avoid the "magic"
 				 * situation */
-				char c;
-				if ((c = el->el_display[el->el_cursor.v][el->el_cursor.h])
-				    != '\0')
+				Char c;
+				if ((c = el->el_display[el->el_cursor.v]
+				    [el->el_cursor.h]) != '\0') {
 					term_overwrite(el, &c, 1);
-				else
+#ifdef WIDECHAR
+					while (el->el_display[el->el_cursor.v]
+					    [el->el_cursor.h] == MB_FILL_CHAR)
+						el->el_cursor.h++;
+#endif
+				} else {
 					term__putc(el, ' ');
-				el->el_cursor.h = 1;
+					el->el_cursor.h = 1;
+				}
 			}
 		} else		/* no wrap, but cursor stays on screen */
-			el->el_cursor.h = el->el_term.t_size.h;
+			el->el_cursor.h = el->el_term.t_size.h - 1;
 	}
 }
 
@@ -763,9 +788,10 @@ term_deletechars(EditLine *el, int num)
 /* term_insertwrite():
  *	Puts terminal in insert character mode or inserts num
  *	characters in the line
+ *      Assumes MB_FILL_CHARs are present to keep column count correct
  */
 protected void
-term_insertwrite(EditLine *el, char *cp, int num)
+term_insertwrite(EditLine *el, Char *cp, int num)
 {
 	if (num <= 0)
 		return;
@@ -786,7 +812,7 @@ term_insertwrite(EditLine *el, char *cp,
 		if ((num > 1) || !GoodStr(T_ic)) {
 				/* if ic would be more expensive */
 			term_tputs(el, tgoto(Str(T_IC), num, num), num);
-			term_overwrite(el, cp, num);
+			term_overwrite(el, cp, (size_t)num);
 				/* this updates el_cursor.h */
 			return;
 		}
@@ -1047,32 +1073,32 @@ term_init_arrow(EditLine *el)
 {
 	fkey_t *arrow = el->el_term.t_fkey;
 
-	arrow[A_K_DN].name = "down";
+	arrow[A_K_DN].name = STR("down");
 	arrow[A_K_DN].key = T_kd;
 	arrow[A_K_DN].fun.cmd = ED_NEXT_HISTORY;
 	arrow[A_K_DN].type = XK_CMD;
 
-	arrow[A_K_UP].name = "up";
+	arrow[A_K_UP].name = STR("up");
 	arrow[A_K_UP].key = T_ku;
 	arrow[A_K_UP].fun.cmd = ED_PREV_HISTORY;
 	arrow[A_K_UP].type = XK_CMD;
 
-	arrow[A_K_LT].name = "left";
+	arrow[A_K_LT].name = STR("left");
 	arrow[A_K_LT].key = T_kl;
 	arrow[A_K_LT].fun.cmd = ED_PREV_CHAR;
 	arrow[A_K_LT].type = XK_CMD;
 
-	arrow[A_K_RT].name = "right";
+	arrow[A_K_RT].name = STR("right");
 	arrow[A_K_RT].key = T_kr;
 	arrow[A_K_RT].fun.cmd = ED_NEXT_CHAR;
 	arrow[A_K_RT].type = XK_CMD;
 
-	arrow[A_K_HO].name = "home";
+	arrow[A_K_HO].name = STR("home");
 	arrow[A_K_HO].key = T_kh;
 	arrow[A_K_HO].fun.cmd = ED_MOVE_TO_BEG;
 	arrow[A_K_HO].type = XK_CMD;
 
-	arrow[A_K_EN].name = "end";
+	arrow[A_K_EN].name = STR("end");
 	arrow[A_K_EN].key = T_at7;
 	arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END;
 	arrow[A_K_EN].type = XK_CMD;
@@ -1086,18 +1112,18 @@ private void
 term_reset_arrow(EditLine *el)
 {
 	fkey_t *arrow = el->el_term.t_fkey;
-	static const char strA[] = {033, '[', 'A', '\0'};
-	static const char strB[] = {033, '[', 'B', '\0'};
-	static const char strC[] = {033, '[', 'C', '\0'};
-	static const char strD[] = {033, '[', 'D', '\0'};
-	static const char strH[] = {033, '[', 'H', '\0'};
-	static const char strF[] = {033, '[', 'F', '\0'};
-	static const char stOA[] = {033, 'O', 'A', '\0'};
-	static const char stOB[] = {033, 'O', 'B', '\0'};
-	static const char stOC[] = {033, 'O', 'C', '\0'};
-	static const char stOD[] = {033, 'O', 'D', '\0'};
-	static const char stOH[] = {033, 'O', 'H', '\0'};
-	static const char stOF[] = {033, 'O', 'F', '\0'};
+	static const Char strA[] = {033, '[', 'A', '\0'};
+	static const Char strB[] = {033, '[', 'B', '\0'};
+	static const Char strC[] = {033, '[', 'C', '\0'};
+	static const Char strD[] = {033, '[', 'D', '\0'};
+	static const Char strH[] = {033, '[', 'H', '\0'};
+	static const Char strF[] = {033, '[', 'F', '\0'};
+	static const Char stOA[] = {033, 'O', 'A', '\0'};
+	static const Char stOB[] = {033, 'O', 'B', '\0'};
+	static const Char stOC[] = {033, 'O', 'C', '\0'};
+	static const Char stOD[] = {033, 'O', 'D', '\0'};
+	static const Char stOH[] = {033, 'O', 'H', '\0'};
+	static const Char stOF[] = {033, 'O', 'F', '\0'};
 
 	key_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
 	key_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
@@ -1133,13 +1159,13 @@ term_reset_arrow(EditLine *el)
  *	Set an arrow key binding
  */
 protected int
-term_set_arrow(EditLine *el, const char *name, key_value_t *fun, int type)
+term_set_arrow(EditLine *el, const Char *name, key_value_t *fun, int type)
 {
 	fkey_t *arrow = el->el_term.t_fkey;
 	int i;
 
 	for (i = 0; i < A_K_NKEYS; i++)
-		if (strcmp(name, arrow[i].name) == 0) {
+		if (Strcmp(name, arrow[i].name) == 0) {
 			arrow[i].fun = *fun;
 			arrow[i].type = type;
 			return (0);
@@ -1152,13 +1178,13 @@ term_set_arrow(EditLine *el, const char 
  *	Clear an arrow key binding
  */
 protected int
-term_clear_arrow(EditLine *el, const char *name)
+term_clear_arrow(EditLine *el, const Char *name)
 {
 	fkey_t *arrow = el->el_term.t_fkey;
 	int i;
 
 	for (i = 0; i < A_K_NKEYS; i++)
-		if (strcmp(name, arrow[i].name) == 0) {
+		if (Strcmp(name, arrow[i].name) == 0) {
 			arrow[i].type = XK_NOD;
 			return (0);
 		}
@@ -1170,13 +1196,13 @@ term_clear_arrow(EditLine *el, const cha
  *	Print the arrow key bindings
  */
 protected void
-term_print_arrow(EditLine *el, const char *name)
+term_print_arrow(EditLine *el, const Char *name)
 {
 	int i;
 	fkey_t *arrow = el->el_term.t_fkey;
 
 	for (i = 0; i < A_K_NKEYS; i++)
-		if (*name == '\0' || strcmp(name, arrow[i].name) == 0)
+		if (*name == '\0' || Strcmp(name, arrow[i].name) == 0)
 			if (arrow[i].type != XK_NOD)
 				key_kprint(el, arrow[i].name, &arrow[i].fun,
 				    arrow[i].type);
@@ -1205,35 +1231,44 @@ term_bind_arrow(EditLine *el)
 	term_reset_arrow(el);
 
 	for (i = 0; i < A_K_NKEYS; i++) {
+		Char wt_str[VISUAL_WIDTH_MAX];
+		Char *px;
+		size_t n;
+
 		p = el->el_term.t_str[arrow[i].key];
-		if (p && *p) {
-			j = (unsigned char) *p;
-			/*
-		         * Assign the arrow keys only if:
-		         *
-		         * 1. They are multi-character arrow keys and the user
-		         *    has not re-assigned the leading character, or
-		         *    has re-assigned the leading character to be
-		         *	  ED_SEQUENCE_LEAD_IN
-		         * 2. They are single arrow keys pointing to an
-			 *    unassigned key.
-		         */
-			if (arrow[i].type == XK_NOD)
-				key_clear(el, map, p);
-			else {
-				if (p[1] && (dmap[j] == map[j] ||
-					map[j] == ED_SEQUENCE_LEAD_IN)) {
-					key_add(el, p, &arrow[i].fun,
+		if (!p || !*p)
+			continue;
+		for (n = 0; n < VISUAL_WIDTH_MAX && p[n]; ++n)
+			wt_str[n] = p[n];
+		while (n < VISUAL_WIDTH_MAX)
+			wt_str[n++] = '\0';
+		px = wt_str;
+		j = (unsigned char) *p;
+		/*
+		 * Assign the arrow keys only if:
+		 *
+		 * 1. They are multi-character arrow keys and the user
+		 *    has not re-assigned the leading character, or
+		 *    has re-assigned the leading character to be
+		 *	  ED_SEQUENCE_LEAD_IN
+		 * 2. They are single arrow keys pointing to an
+		 *    unassigned key.
+		 */
+		if (arrow[i].type == XK_NOD)
+			key_clear(el, map, px);
+		else {
+			if (p[1] && (dmap[j] == map[j] ||
+				map[j] == ED_SEQUENCE_LEAD_IN)) {
+				key_add(el, px, &arrow[i].fun,
+				    arrow[i].type);
+				map[j] = ED_SEQUENCE_LEAD_IN;
+			} else if (map[j] == ED_UNASSIGNED) {
+				key_clear(el, map, px);
+				if (arrow[i].type == XK_CMD)
+					map[j] = arrow[i].fun.cmd;
+				else
+					key_add(el, px, &arrow[i].fun,
 					    arrow[i].type);
-					map[j] = ED_SEQUENCE_LEAD_IN;
-				} else if (map[j] == ED_UNASSIGNED) {
-					key_clear(el, map, p);
-					if (arrow[i].type == XK_CMD)
-						map[j] = arrow[i].fun.cmd;
-					else
-						key_add(el, p, &arrow[i].fun,
-						    arrow[i].type);
-				}
 			}
 		}
 	}
@@ -1245,7 +1280,6 @@ term_bind_arrow(EditLine *el)
 private int
 term_putc(int c)
 {
-
 	if (term_outfile == NULL)
 		return -1;
 	return fputc(c, term_outfile);
@@ -1268,10 +1302,17 @@ term_tputs(EditLine *el, const char *cap
  *	Add a character
  */
 protected int
-term__putc(EditLine *el, int c)
+term__putc(EditLine *el, Int c)
 {
-
-	return fputc(c, el->el_outfile);
+	char buf[MB_LEN_MAX +1];
+	ssize_t i;
+	if (c == MB_FILL_CHAR)
+		return 0;
+	i = ct_encode_char(buf, MB_LEN_MAX, c);
+	if (i <= 0)
+		return (int)i;
+	buf[i] = '\0';
+	return fputs(buf, el->el_outfile);
 }
 
 /* term__flush():
@@ -1288,12 +1329,12 @@ term__flush(EditLine *el)
  *	Write the given character out, in a human readable form
  */
 protected void
-term_writec(EditLine *el, int c)
+term_writec(EditLine *el, Int c)
 {
-	char buf[8];
-	int cnt = key__decode_char(buf, sizeof(buf), 0, c);
-	buf[cnt] = '\0';
-	term_overwrite(el, buf, cnt);
+	Char visbuf[VISUAL_WIDTH_MAX +1];
+	ssize_t vcnt = ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c);
+	visbuf[vcnt] = '\0';
+	term_overwrite(el, visbuf, (size_t)vcnt);
 	term__flush(el);
 }
 
@@ -1304,11 +1345,10 @@ term_writec(EditLine *el, int c)
 protected int
 /*ARGSUSED*/
 term_telltc(EditLine *el, int argc __attribute__((__unused__)), 
-    const char **argv __attribute__((__unused__)))
+    const Char **argv __attribute__((__unused__)))
 {
 	const struct termcapstr *t;
 	char **ts;
-	char upbuf[EL_BUFSIZ];
 
 	(void) fprintf(el->el_outfile, "\n\tYour terminal has the\n");
 	(void) fprintf(el->el_outfile, "\tfollowing characteristics:\n\n");
@@ -1327,10 +1367,11 @@ term_telltc(EditLine *el, int argc __att
 	for (t = tstr, ts = el->el_term.t_str; t->name != NULL; t++, ts++) {
 		const char *ub;
 		if (*ts && **ts) {
-		    (void) key__decode_str(*ts, upbuf, sizeof(upbuf), "");
-		    ub = upbuf;
+			ub = ct_encode_string(ct_visual_string(
+			    ct_decode_string(*ts, &el->el_scratch)),
+			    &el->el_scratch);
 		} else {
-		    ub = "(empty)";
+			ub = "(empty)";
 		}
 		(void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n",
 		    t->long_name, t->name, ub);
@@ -1346,17 +1387,19 @@ term_telltc(EditLine *el, int argc __att
 protected int
 /*ARGSUSED*/
 term_settc(EditLine *el, int argc __attribute__((__unused__)),
-    const char **argv)
+    const Char **argv)
 {
 	const struct termcapstr *ts;
 	const struct termcapval *tv;
-	const char *what, *how;
+	char what[8], how[8];
 
 	if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
 		return -1;
 
-	what = argv[1];
-	how = argv[2];
+	strncpy(what, ct_encode_string(argv[1], &el->el_scratch), sizeof(what));
+	what[sizeof(what) - 1] = '\0';
+	strncpy(how,  ct_encode_string(argv[2], &el->el_scratch), sizeof(how));
+	how[sizeof(how) - 1] = '\0';
 
 	/*
          * Do the strings first
@@ -1388,7 +1431,7 @@ term_settc(EditLine *el, int argc __attr
 			el->el_term.t_val[tv - tval] = 0;
 		else {
 			(void) fprintf(el->el_errfile,
-			    "%s: Bad value `%s'.\n", argv[0], how);
+			    "" FSTR ": Bad value `%s'.\n", argv[0], how);
 			return -1;
 		}
 		term_setflags(el);
@@ -1402,7 +1445,7 @@ term_settc(EditLine *el, int argc __attr
 		i = strtol(how, &ep, 10);
 		if (*ep != '\0') {
 			(void) fprintf(el->el_errfile,
-			    "%s: Bad value `%s'.\n", argv[0], how);
+			    "" FSTR ": Bad value `%s'.\n", argv[0], how);
 			return -1;
 		}
 		el->el_term.t_val[tv - tval] = (int) i;
@@ -1477,9 +1520,10 @@ term_gettc(EditLine *el, int argc __attr
 protected int
 /*ARGSUSED*/
 term_echotc(EditLine *el, int argc __attribute__((__unused__)),
-    const char **argv)
+    const Char **argv)
 {
-	char *cap, *scap, *ep;
+	char *cap, *scap;
+	Char *ep;
 	int arg_need, arg_cols, arg_rows;
 	int verbose = 0, silent = 0;
 	char *area;
@@ -1510,21 +1554,21 @@ term_echotc(EditLine *el, int argc __att
 	}
 	if (!*argv || *argv[0] == '\0')
 		return (0);
-	if (strcmp(*argv, "tabs") == 0) {
+	if (Strcmp(*argv, STR("tabs")) == 0) {
 		(void) fprintf(el->el_outfile, fmts, EL_CAN_TAB ? "yes" : "no");
 		return (0);
-	} else if (strcmp(*argv, "meta") == 0) {
+	} else if (Strcmp(*argv, STR("meta")) == 0) {
 		(void) fprintf(el->el_outfile, fmts, Val(T_km) ? "yes" : "no");
 		return (0);
-	} else if (strcmp(*argv, "xn") == 0) {
+	} else if (Strcmp(*argv, STR("xn")) == 0) {
 		(void) fprintf(el->el_outfile, fmts, EL_HAS_MAGIC_MARGINS ?
 		    "yes" : "no");
 		return (0);
-	} else if (strcmp(*argv, "am") == 0) {
+	} else if (Strcmp(*argv, STR("am")) == 0) {
 		(void) fprintf(el->el_outfile, fmts, EL_HAS_AUTO_MARGINS ?
 		    "yes" : "no");
 		return (0);
-	} else if (strcmp(*argv, "baud") == 0) {
+	} else if (Strcmp(*argv, STR("baud")) == 0) {
 #ifdef notdef
 		int i;
 
@@ -1539,10 +1583,11 @@ term_echotc(EditLine *el, int argc __att
 		(void) fprintf(el->el_outfile, fmtd, (int)el->el_tty.t_speed);
 #endif
 		return (0);
-	} else if (strcmp(*argv, "rows") == 0 || strcmp(*argv, "lines") == 0) {
+	} else if (Strcmp(*argv, STR("rows")) == 0 ||
+                   Strcmp(*argv, STR("lines")) == 0) {
 		(void) fprintf(el->el_outfile, fmtd, Val(T_li));
 		return (0);
-	} else if (strcmp(*argv, "cols") == 0) {
+	} else if (Strcmp(*argv, STR("cols")) == 0) {
 		(void) fprintf(el->el_outfile, fmtd, Val(T_co));
 		return (0);
 	}
@@ -1551,18 +1596,19 @@ term_echotc(EditLine *el, int argc __att
          */
 	scap = NULL;
 	for (t = tstr; t->name != NULL; t++)
-		if (strcmp(t->name, *argv) == 0) {
+		if (strcmp(t->name,
+		    ct_encode_string(*argv, &el->el_scratch)) == 0) {
 			scap = el->el_term.t_str[t - tstr];
 			break;
 		}
 	if (t->name == NULL) {
 		/* XXX: some systems' tgetstr needs non const */
-		scap = tgetstr(strchr(*argv, **argv), &area);
+                scap = tgetstr(ct_encode_string(*argv, &el->el_scratch), &area);
 	}
 	if (!scap || scap[0] == '\0') {
 		if (!silent)
 			(void) fprintf(el->el_errfile,
-			    "echotc: Termcap parameter `%s' not found.\n",
+			    "echotc: Termcap parameter `" FSTR "' not found.\n",
 			    *argv);
 		return (-1);
 	}
@@ -1605,7 +1651,7 @@ term_echotc(EditLine *el, int argc __att
 		if (*argv && *argv[0]) {
 			if (!silent)
 				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Extra argument `%s'.\n",
+				    "echotc: Warning: Extra argument `" FSTR "'.\n",
 				    *argv);
 			return (-1);
 		}
@@ -1620,11 +1666,11 @@ term_echotc(EditLine *el, int argc __att
 			return (-1);
 		}
 		arg_cols = 0;
-		i = strtol(*argv, &ep, 10);
+		i = Strtol(*argv, &ep, 10);
 		if (*ep != '\0' || i < 0) {
 			if (!silent)
 				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s' for rows.\n",
+				    "echotc: Bad value `" FSTR "' for rows.\n",
 				    *argv);
 			return (-1);
 		}
@@ -1633,7 +1679,7 @@ term_echotc(EditLine *el, int argc __att
 		if (*argv && *argv[0]) {
 			if (!silent)
 				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Extra argument `%s'.\n",
+				    "echotc: Warning: Extra argument `" FSTR "'.\n",
 				    *argv);
 			return (-1);
 		}
@@ -1654,11 +1700,11 @@ term_echotc(EditLine *el, int argc __att
 				    "echotc: Warning: Missing argument.\n");
 			return (-1);
 		}
-		i = strtol(*argv, &ep, 10);
+		i = Strtol(*argv, &ep, 10);
 		if (*ep != '\0' || i < 0) {
 			if (!silent)
 				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s' for cols.\n",
+				    "echotc: Bad value `" FSTR "' for cols.\n",
 				    *argv);
 			return (-1);
 		}
@@ -1670,11 +1716,11 @@ term_echotc(EditLine *el, int argc __att
 				    "echotc: Warning: Missing argument.\n");
 			return (-1);
 		}
-		i = strtol(*argv, &ep, 10);
+		i = Strtol(*argv, &ep, 10);
 		if (*ep != '\0' || i < 0) {
 			if (!silent)
 				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s' for rows.\n",
+				    "echotc: Bad value `" FSTR "' for rows.\n",
 				    *argv);
 			return (-1);
 		}
@@ -1682,14 +1728,14 @@ term_echotc(EditLine *el, int argc __att
 		if (*ep != '\0') {
 			if (!silent)
 				(void) fprintf(el->el_errfile,
-				    "echotc: Bad value `%s'.\n", *argv);
+				    "echotc: Bad value `" FSTR "'.\n", *argv);
 			return (-1);
 		}
 		argv++;
 		if (*argv && *argv[0]) {
 			if (!silent)
 				(void) fprintf(el->el_errfile,
-				    "echotc: Warning: Extra argument `%s'.\n",
+				    "echotc: Warning: Extra argument `" FSTR "'.\n",
 				    *argv);
 			return (-1);
 		}

=== modified file 'cmd-line-utils/libedit/tokenizer.c'
--- a/cmd-line-utils/libedit/tokenizer.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/tokenizer.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: tokenizer.c,v 1.14 2003/12/05 13:37:48 lukem Exp $	*/
+/*	$NetBSD: tokenizer.c,v 1.18 2010/01/03 18:27:10 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,51 +40,53 @@ static char sccsid[] = "@(#)tokenizer.c	
 #endif
 #endif /* not lint && not SCCSID */
 
+/* We build this file twice, once as NARROW, once as WIDE. */
 /*
  * tokenize.c: Bourne shell like tokenizer
  */
 #include <string.h>
 #include <stdlib.h>
 #include "histedit.h"
+#include "chartype.h"
 
 typedef enum {
 	Q_none, Q_single, Q_double, Q_one, Q_doubleone
 } quote_t;
 
-#define	IFS		"\t \n"
-
 #define	TOK_KEEP	1
 #define	TOK_EAT		2
 
 #define	WINCR		20
 #define	AINCR		10
 
-#define	tok_strdup(a)		strdup(a)
+#define	IFS		STR("\t \n")
+
 #define	tok_malloc(a)		malloc(a)
 #define	tok_free(a)		free(a)
 #define	tok_realloc(a, b)	realloc(a, b)
+#define	tok_strdup(a)		Strdup(a)
 
 
-struct tokenizer {
-	char	*ifs;		/* In field separator			 */
+struct TYPE(tokenizer) {
+	Char	*ifs;		/* In field separator			 */
 	int	 argc, amax;	/* Current and maximum number of args	 */
-	char   **argv;		/* Argument list			 */
-	char	*wptr, *wmax;	/* Space and limit on the word buffer	 */
-	char	*wstart;	/* Beginning of next word		 */
-	char	*wspace;	/* Space of word buffer			 */
+	Char   **argv;		/* Argument list			 */
+	Char	*wptr, *wmax;	/* Space and limit on the word buffer	 */
+	Char	*wstart;	/* Beginning of next word		 */
+	Char	*wspace;	/* Space of word buffer			 */
 	quote_t	 quote;		/* Quoting state			 */
 	int	 flags;		/* flags;				 */
 };
 
 
-private void tok_finish(Tokenizer *);
+private void FUN(tok,finish)(TYPE(Tokenizer) *);
 
 
-/* tok_finish():
+/* FUN(tok,finish)():
  *	Finish a word in the tokenizer.
  */
 private void
-tok_finish(Tokenizer *tok)
+FUN(tok,finish)(TYPE(Tokenizer) *tok)
 {
 
 	*tok->wptr = '\0';
@@ -97,13 +99,13 @@ tok_finish(Tokenizer *tok)
 }
 
 
-/* tok_init():
+/* FUN(tok,init)():
  *	Initialize the tokenizer
  */
-public Tokenizer *
-tok_init(const char *ifs)
+public TYPE(Tokenizer) *
+FUN(tok,init)(const Char *ifs)
 {
-	Tokenizer *tok = (Tokenizer *) tok_malloc(sizeof(Tokenizer));
+	TYPE(Tokenizer) *tok = tok_malloc(sizeof(TYPE(Tokenizer)));
 
 	if (tok == NULL)
 		return NULL;
@@ -114,14 +116,14 @@ tok_init(const char *ifs)
 	}
 	tok->argc = 0;
 	tok->amax = AINCR;
-	tok->argv = (char **) tok_malloc(sizeof(char *) * tok->amax);
+	tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax);
 	if (tok->argv == NULL) {
 		tok_free((ptr_t)tok->ifs);
 		tok_free((ptr_t)tok);
 		return NULL;
 	}
 	tok->argv[0] = NULL;
-	tok->wspace = (char *) tok_malloc(WINCR);
+	tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace));
 	if (tok->wspace == NULL) {
 		tok_free((ptr_t)tok->argv);
 		tok_free((ptr_t)tok->ifs);
@@ -138,11 +140,11 @@ tok_init(const char *ifs)
 }
 
 
-/* tok_reset():
+/* FUN(tok,reset)():
  *	Reset the tokenizer
  */
 public void
-tok_reset(Tokenizer *tok)
+FUN(tok,reset)(TYPE(Tokenizer) *tok)
 {
 
 	tok->argc = 0;
@@ -153,11 +155,11 @@ tok_reset(Tokenizer *tok)
 }
 
 
-/* tok_end():
+/* FUN(tok,end)():
  *	Clean up
  */
 public void
-tok_end(Tokenizer *tok)
+FUN(tok,end)(TYPE(Tokenizer) *tok)
 {
 
 	tok_free((ptr_t) tok->ifs);
@@ -168,10 +170,10 @@ tok_end(Tokenizer *tok)
 
 
 
-/* tok_line():
+/* FUN(tok,line)():
  *	Bourne shell (sh(1)) like tokenizing
  *	Arguments:
- *		tok	current tokenizer state (setup with tok_init())
+ *		tok	current tokenizer state (setup with FUN(tok,init)())
  *		line	line to parse
  *	Returns:
  *		-1	Internal error
@@ -186,20 +188,20 @@ tok_end(Tokenizer *tok)
  *		cursorv	if !NULL, offset in argv[cursorc] of cursor
  */
 public int
-tok_line(Tokenizer *tok, const LineInfo *line,
-    int *argc, const char ***argv, int *cursorc, int *cursoro)
+FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line,
+    int *argc, const Char ***argv, int *cursorc, int *cursoro)
 {
-	const char *ptr;
+	const Char *ptr;
 	int cc, co;
 
 	cc = co = -1;
 	ptr = line->buffer;
 	for (ptr = line->buffer; ;ptr++) {
 		if (ptr >= line->lastchar)
-			ptr = "";
+			ptr = STR("");
 		if (ptr == line->cursor) {
 			cc = tok->argc;
-			co = tok->wptr - tok->wstart;
+			co = (int)(tok->wptr - tok->wstart);
 		}
 		switch (*ptr) {
 		case '\'':
@@ -357,8 +359,8 @@ tok_line(Tokenizer *tok, const LineInfo 
 			tok->flags &= ~TOK_EAT;
 			switch (tok->quote) {
 			case Q_none:
-				if (strchr(tok->ifs, *ptr) != NULL)
-					tok_finish(tok);
+				if (Strchr(tok->ifs, *ptr) != NULL)
+					FUN(tok,finish)(tok);
 				else
 					*tok->wptr++ = *ptr;
 				break;
@@ -389,7 +391,8 @@ tok_line(Tokenizer *tok, const LineInfo 
 
 		if (tok->wptr >= tok->wmax - 4) {
 			size_t size = tok->wmax - tok->wspace + WINCR;
-			char *s = (char *) tok_realloc(tok->wspace, size);
+			Char *s = tok_realloc(tok->wspace,
+			    size * sizeof(*s));
 			if (s == NULL)
 				return (-1);
 
@@ -406,10 +409,9 @@ tok_line(Tokenizer *tok, const LineInfo 
 			tok->wmax = s + size;
 		}
 		if (tok->argc >= tok->amax - 4) {
-			char **p;
+			Char **p;
 			tok->amax += AINCR;
-			p = (char **) tok_realloc(tok->argv,
-			    tok->amax * sizeof(char *));
+			p = tok_realloc(tok->argv, tok->amax * sizeof(*p));
 			if (p == NULL)
 				return (-1);
 			tok->argv = p;
@@ -418,29 +420,30 @@ tok_line(Tokenizer *tok, const LineInfo 
  tok_line_outok:
 	if (cc == -1 && co == -1) {
 		cc = tok->argc;
-		co = tok->wptr - tok->wstart;
+		co = (int)(tok->wptr - tok->wstart);
 	}
 	if (cursorc != NULL)
 		*cursorc = cc;
 	if (cursoro != NULL)
 		*cursoro = co;
-	tok_finish(tok);
-	*argv = (const char **)tok->argv;
+	FUN(tok,finish)(tok);
+	*argv = (const Char **)tok->argv;
 	*argc = tok->argc;
 	return (0);
 }
 
-/* tok_str():
+/* FUN(tok,str)():
  *	Simpler version of tok_line, taking a NUL terminated line
  *	and splitting into words, ignoring cursor state.
  */
 public int
-tok_str(Tokenizer *tok, const char *line, int *argc, const char ***argv)
+FUN(tok,str)(TYPE(Tokenizer) *tok, const Char *line, int *argc,
+    const Char ***argv)
 {
-	LineInfo li;
+	TYPE(LineInfo) li;
 
 	memset(&li, 0, sizeof(li));
 	li.buffer = line;
-	li.cursor = li.lastchar = strchr(line, '\0');
-	return (tok_line(tok, &li, argc, argv, NULL, NULL));
+	li.cursor = li.lastchar = Strchr(line, '\0');
+	return (FUN(tok,line)(tok, &li, argc, argv, NULL, NULL));
 }

=== modified file 'cmd-line-utils/libedit/tty.c'
--- a/cmd-line-utils/libedit/tty.c	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/tty.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty.c,v 1.28 2009/02/06 19:53:23 sketch Exp $	*/
+/*	$NetBSD: tty.c,v 1.35 2011/01/28 03:41:52 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -45,8 +45,10 @@ static char sccsid[] = "@(#)tty.c	8.1 (B
  */
 #include <assert.h>
 #include <errno.h>
-#include "tty.h"
+#include <unistd.h>	/* for isatty */
+#include <strings.h>	/* for ffs */
 #include "el.h"
+#include "tty.h"
 
 typedef struct ttymodes_t {
 	const char *m_name;
@@ -55,7 +57,7 @@ typedef struct ttymodes_t {
 }          ttymodes_t;
 
 typedef struct ttymap_t {
-	int nch, och;		/* Internal and termio rep of chars */
+	Int nch, och;		/* Internal and termio rep of chars */
 	el_action_t bind[3];	/* emacs, vi, and vi-cmd */
 } ttymap_t;
 
@@ -494,6 +496,13 @@ tty_setup(EditLine *el)
 	if (el->el_flags & EDIT_DISABLED)
 		return (0);
 
+	if (!isatty(el->el_outfd)) {
+#ifdef DEBUG_TTY
+		(void) fprintf(el->el_errfile,
+		    "tty_setup: isatty: %s\n", strerror(errno));
+#endif /* DEBUG_TTY */
+		return (-1);
+	}
 	if (tty_getty(el, &el->el_tty.t_ed) == -1) {
 #ifdef DEBUG_TTY
 		(void) fprintf(el->el_errfile,
@@ -892,7 +901,7 @@ tty_bind_char(EditLine *el, int force)
 
 	unsigned char *t_n = el->el_tty.t_c[ED_IO];
 	unsigned char *t_o = el->el_tty.t_ed.c_cc;
-	unsigned char new[2], old[2];
+	Char new[2], old[2];
 	const ttymap_t *tp;
 	el_action_t *map, *alt;
 	const el_action_t *dmap, *dalt;
@@ -914,16 +923,16 @@ tty_bind_char(EditLine *el, int force)
 		if (new[0] == old[0] && !force)
 			continue;
 		/* Put the old default binding back, and set the new binding */
-		key_clear(el, map, (char *)old);
-		map[old[0]] = dmap[old[0]];
-		key_clear(el, map, (char *)new);
+		key_clear(el, map, old);
+		map[UC(old[0])] = dmap[UC(old[0])];
+		key_clear(el, map, new);
 		/* MAP_VI == 1, MAP_EMACS == 0... */
-		map[new[0]] = tp->bind[el->el_map.type];
+		map[UC(new[0])] = tp->bind[el->el_map.type];
 		if (dalt) {
-			key_clear(el, alt, (char *)old);
-			alt[old[0]] = dalt[old[0]];
-			key_clear(el, alt, (char *)new);
-			alt[new[0]] = tp->bind[el->el_map.type + 1];
+			key_clear(el, alt, old);
+			alt[UC(old[0])] = dalt[UC(old[0])];
+			key_clear(el, alt, new);
+			alt[UC(new[0])] = tp->bind[el->el_map.type + 1];
 		}
 	}
 }
@@ -951,7 +960,7 @@ tty_rawmode(EditLine *el)
 	}
 	/*
          * We always keep up with the eight bit setting and the speed of the
-         * tty. But only we only believe changes that are made to cooked mode!
+         * tty. But we only believe changes that are made to cooked mode!
          */
 	el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts);
 	el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts);
@@ -1171,19 +1180,20 @@ tty_noquotemode(EditLine *el)
  */
 protected int
 /*ARGSUSED*/
-tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
+tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv)
 {
 	const ttymodes_t *m;
 	char x;
 	int aflag = 0;
-	const char *s, *d;
-	const char *name;
+	const Char *s, *d;
+        char name[EL_BUFSIZ];
 	struct termios *tios = &el->el_tty.t_ex;
 	int z = EX_IO;
 
 	if (argv == NULL)
 		return (-1);
-	name = *argv++;
+	strncpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name));
+        name[sizeof(name) - 1] = '\0';
 
 	while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0')
 		switch (argv[0][1]) {
@@ -1215,7 +1225,7 @@ tty_stty(EditLine *el, int argc __attrib
 
 	if (!argv || !*argv) {
 		int i = -1;
-		int len = 0, st = 0, cu;
+		size_t len = 0, st = 0, cu;
 		for (m = ttymodes; m->m_name; m++) {
 			if (m->m_type != i) {
 				(void) fprintf(el->el_outfile, "%s%s",
@@ -1238,9 +1248,9 @@ tty_stty(EditLine *el, int argc __attrib
 
 				cu = strlen(m->m_name) + (x != '\0') + 1;
 
-				if (len + cu >= el->el_term.t_size.h) {
+				if (len + cu >= (size_t)el->el_term.t_size.h) {
 					(void) fprintf(el->el_outfile, "\n%*s",
-					    st, "");
+					    (int)st, "");
 					len = st + cu;
 				} else
 					len += cu;
@@ -1257,7 +1267,7 @@ tty_stty(EditLine *el, int argc __attrib
 		return (0);
 	}
 	while (argv && (s = *argv++)) {
-		const char *p;
+		const Char *p;
 		switch (*s) {
 		case '+':
 		case '-':
@@ -1268,23 +1278,24 @@ tty_stty(EditLine *el, int argc __attrib
 			break;
 		}
 		d = s;
-		p = strchr(s, '=');
+		p = Strchr(s, '=');
 		for (m = ttymodes; m->m_name; m++)
-			if ((p ? strncmp(m->m_name, d, (size_t)(p - d)) :
-			    strcmp(m->m_name, d)) == 0 &&
+			if ((p ? strncmp(m->m_name, ct_encode_string(d, &el->el_scratch), (size_t)(p - d)) :
+			    strcmp(m->m_name, ct_encode_string(d, &el->el_scratch))) == 0 &&
 			    (p == NULL || m->m_type == MD_CHAR))
 				break;
 
 		if (!m->m_name) {
 			(void) fprintf(el->el_errfile,
-			    "%s: Invalid argument `%s'.\n", name, d);
+			    "%s: Invalid argument `" FSTR "'.\n", name, d);
 			return (-1);
 		}
 		if (p) {
 			int c = ffs((int)m->m_value);
-			int v = *++p ? parse__escape((const char **) &p) :
+			int v = *++p ? parse__escape(&p) :
 			    el->el_tty.t_vdisable;
-			assert(c-- != 0);
+			assert(c != 0);
+			c--;
 			c = tty__getcharindex(c);
 			assert(c != -1);
 			tios->c_cc[c] = v;

=== modified file 'cmd-line-utils/libedit/tty.h'
--- a/cmd-line-utils/libedit/tty.h	2009-06-11 16:21:32 +0000
+++ b/cmd-line-utils/libedit/tty.h	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty.h,v 1.11 2005/06/01 11:37:52 lukem Exp $	*/
+/*	$NetBSD: tty.h,v 1.12 2009/12/30 22:37:40 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,6 +40,7 @@
 #ifndef _h_el_tty
 #define	_h_el_tty
 
+#include "sys.h"
 #include "histedit.h"
 #include <termios.h>
 #include <unistd.h>
@@ -458,7 +459,7 @@ typedef unsigned char ttychar_t[NN_IO][C
 
 protected int	tty_init(EditLine *);
 protected void	tty_end(EditLine *);
-protected int	tty_stty(EditLine *, int, const char **);
+protected int	tty_stty(EditLine *, int, const Char **);
 protected int	tty_rawmode(EditLine *);
 protected int	tty_cookedmode(EditLine *);
 protected int	tty_quotemode(EditLine *);

=== modified file 'cmd-line-utils/libedit/vi.c'
--- a/cmd-line-utils/libedit/vi.c	2010-10-19 22:51:34 +0000
+++ b/cmd-line-utils/libedit/vi.c	2011-04-17 13:40:20 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: vi.c,v 1.28 2009/02/06 13:14:37 sketch Exp $	*/
+/*	$NetBSD: vi.c,v 1.34 2011/02/22 05:45:08 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -35,6 +35,7 @@
 #include "config.h"
 #include <stdlib.h>
 #include <unistd.h>
+#include <limits.h>
 #include <sys/wait.h>
 
 #if !defined(lint) && !defined(SCCSID)
@@ -49,14 +50,14 @@ static char sccsid[] = "@(#)vi.c	8.1 (Be
  */
 #include "el.h"
 
-private el_action_t	cv_action(EditLine *, int);
-private el_action_t	cv_paste(EditLine *, int);
+private el_action_t	cv_action(EditLine *, Int);
+private el_action_t	cv_paste(EditLine *, Int);
 
 /* cv_action():
  *	Handle vi actions.
  */
 private el_action_t
-cv_action(EditLine *el, int c)
+cv_action(EditLine *el, Int c)
 {
 
 	if (el->el_chared.c_vcmd.action != NOP) {
@@ -67,7 +68,7 @@ cv_action(EditLine *el, int c)
 		if (!(c & YANK))
 			cv_undo(el);
 		cv_yank(el, el->el_line.buffer,
-			    el->el_line.lastchar - el->el_line.buffer);
+		    (int)(el->el_line.lastchar - el->el_line.buffer));
 		el->el_chared.c_vcmd.action = NOP;
 		el->el_chared.c_vcmd.pos = 0;
 		if (!(c & YANK)) {
@@ -88,15 +89,15 @@ cv_action(EditLine *el, int c)
  *	Paste previous deletion before or after the cursor
  */
 private el_action_t
-cv_paste(EditLine *el, int c)
+cv_paste(EditLine *el, Int c)
 {
 	c_kill_t *k = &el->el_chared.c_kill;
-	int len = k->last - k->buf;
+	size_t len = (size_t)(k->last - k->buf);
 
 	if (k->buf == NULL || len == 0)
 		return (CC_ERROR);
 #ifdef DEBUG_PASTE
-	(void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", len, k->buf);
+	(void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", (int)len, k->buf);
 #endif
 
 	cv_undo(el);
@@ -104,10 +105,11 @@ cv_paste(EditLine *el, int c)
 	if (!c && el->el_line.cursor < el->el_line.lastchar)
 		el->el_line.cursor++;
 
-	c_insert(el, len);
+	c_insert(el, (int)len);
 	if (el->el_line.cursor + len > el->el_line.lastchar)
 		return (CC_ERROR);
-	(void) memcpy(el->el_line.cursor, k->buf, len +0u);
+	(void) memcpy(el->el_line.cursor, k->buf, len *
+	    sizeof(*el->el_line.cursor));
 
 	return (CC_REFRESH);
 }
@@ -119,7 +121,7 @@ cv_paste(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_paste_next(EditLine *el, int c __attribute__((__unused__)))
+vi_paste_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return (cv_paste(el, 0));
@@ -132,7 +134,7 @@ vi_paste_next(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_paste_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_paste_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return (cv_paste(el, 1));
@@ -145,7 +147,7 @@ vi_paste_prev(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_prev_big_word(EditLine *el, int c __attribute__((__unused__)))
+vi_prev_big_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.buffer)
@@ -170,7 +172,7 @@ vi_prev_big_word(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_prev_word(EditLine *el, int c __attribute__((__unused__)))
+vi_prev_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.buffer)
@@ -195,7 +197,7 @@ vi_prev_word(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_next_big_word(EditLine *el, int c __attribute__((__unused__)))
+vi_next_big_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor >= el->el_line.lastchar - 1)
@@ -219,7 +221,7 @@ vi_next_big_word(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_next_word(EditLine *el, int c __attribute__((__unused__)))
+vi_next_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor >= el->el_line.lastchar - 1)
@@ -242,7 +244,7 @@ vi_next_word(EditLine *el, int c __attri
  *	[~]
  */
 protected el_action_t
-vi_change_case(EditLine *el, int c)
+vi_change_case(EditLine *el, Int c)
 {
 	int i;
 
@@ -251,11 +253,11 @@ vi_change_case(EditLine *el, int c)
 	cv_undo(el);
 	for (i = 0; i < el->el_state.argument; i++) {
 
-		c = *(unsigned char *)el->el_line.cursor;
-		if (isupper(c))
-			*el->el_line.cursor = tolower(c);
-		else if (islower(c))
-			*el->el_line.cursor = toupper(c);
+		c = *el->el_line.cursor;
+		if (Isupper(c))
+			*el->el_line.cursor = Tolower(c);
+		else if (Islower(c))
+			*el->el_line.cursor = Toupper(c);
 
 		if (++el->el_line.cursor >= el->el_line.lastchar) {
 			el->el_line.cursor--;
@@ -274,7 +276,7 @@ vi_change_case(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_change_meta(EditLine *el, int c __attribute__((__unused__)))
+vi_change_meta(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	/*
@@ -291,7 +293,7 @@ vi_change_meta(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_insert_at_bol(EditLine *el, int c __attribute__((__unused__)))
+vi_insert_at_bol(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
@@ -307,7 +309,7 @@ vi_insert_at_bol(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_replace_char(EditLine *el, int c __attribute__((__unused__)))
+vi_replace_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor >= el->el_line.lastchar)
@@ -326,7 +328,7 @@ vi_replace_char(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_replace_mode(EditLine *el, int c __attribute__((__unused__)))
+vi_replace_mode(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_map.current = el->el_map.key;
@@ -342,7 +344,7 @@ vi_replace_mode(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_substitute_char(EditLine *el, int c __attribute__((__unused__)))
+vi_substitute_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	c_delafter(el, el->el_state.argument);
@@ -357,12 +359,12 @@ vi_substitute_char(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_substitute_line(EditLine *el, int c __attribute__((__unused__)))
+vi_substitute_line(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_undo(el);
 	cv_yank(el, el->el_line.buffer,
-		    el->el_line.lastchar - el->el_line.buffer);
+	    (int)(el->el_line.lastchar - el->el_line.buffer));
 	(void) em_kill_line(el, 0);
 	el->el_map.current = el->el_map.key;
 	return (CC_REFRESH);
@@ -375,12 +377,12 @@ vi_substitute_line(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_change_to_eol(EditLine *el, int c __attribute__((__unused__)))
+vi_change_to_eol(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_undo(el);
 	cv_yank(el, el->el_line.cursor,
-		    el->el_line.lastchar - el->el_line.cursor);
+	    (int)(el->el_line.lastchar - el->el_line.cursor));
 	(void) ed_kill_line(el, 0);
 	el->el_map.current = el->el_map.key;
 	return (CC_REFRESH);
@@ -393,7 +395,7 @@ vi_change_to_eol(EditLine *el, int c __a
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_insert(EditLine *el, int c __attribute__((__unused__)))
+vi_insert(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_map.current = el->el_map.key;
@@ -408,7 +410,7 @@ vi_insert(EditLine *el, int c __attribut
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_add(EditLine *el, int c __attribute__((__unused__)))
+vi_add(EditLine *el, Int c __attribute__((__unused__)))
 {
 	int ret;
 
@@ -433,7 +435,7 @@ vi_add(EditLine *el, int c __attribute__
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_add_at_eol(EditLine *el, int c __attribute__((__unused__)))
+vi_add_at_eol(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_map.current = el->el_map.key;
@@ -449,7 +451,7 @@ vi_add_at_eol(EditLine *el, int c __attr
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_delete_meta(EditLine *el, int c __attribute__((__unused__)))
+vi_delete_meta(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return (cv_action(el, DELETE));
@@ -462,7 +464,7 @@ vi_delete_meta(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_end_big_word(EditLine *el, int c __attribute__((__unused__)))
+vi_end_big_word(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar)
@@ -486,7 +488,7 @@ vi_end_big_word(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_end_word(EditLine *el, int c __attribute__((__unused__)))
+vi_end_word(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar)
@@ -510,7 +512,7 @@ vi_end_word(EditLine *el, int c __attrib
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_undo(EditLine *el, int c __attribute__((__unused__)))
+vi_undo(EditLine *el, Int c __attribute__((__unused__)))
 {
 	c_undo_t un = el->el_chared.c_undo;
 
@@ -520,7 +522,8 @@ vi_undo(EditLine *el, int c __attribute_
 	/* switch line buffer and undo buffer */
 	el->el_chared.c_undo.buf = el->el_line.buffer;
 	el->el_chared.c_undo.len = el->el_line.lastchar - el->el_line.buffer;
-	el->el_chared.c_undo.cursor = el->el_line.cursor - el->el_line.buffer;
+	el->el_chared.c_undo.cursor =
+	    (int)(el->el_line.cursor - el->el_line.buffer);
 	el->el_line.limit = un.buf + (el->el_line.limit - el->el_line.buffer);
 	el->el_line.buffer = un.buf;
 	el->el_line.cursor = un.buf + un.cursor;
@@ -536,7 +539,7 @@ vi_undo(EditLine *el, int c __attribute_
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_command_mode(EditLine *el, int c __attribute__((__unused__)))
+vi_command_mode(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	/* [Esc] cancels pending action */
@@ -560,7 +563,7 @@ vi_command_mode(EditLine *el, int c __at
  *	[0]
  */
 protected el_action_t
-vi_zero(EditLine *el, int c)
+vi_zero(EditLine *el, Int c)
 {
 
 	if (el->el_state.doingarg)
@@ -581,7 +584,7 @@ vi_zero(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_delete_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_line.cursor <= el->el_line.buffer)
@@ -599,7 +602,7 @@ vi_delete_prev_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_list_or_eof(EditLine *el, int c)
+vi_list_or_eof(EditLine *el, Int c)
 {
 
 	if (el->el_line.cursor == el->el_line.lastchar) {
@@ -636,16 +639,16 @@ vi_list_or_eof(EditLine *el, int c)
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_kill_line_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_kill_line_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
-	char *kp, *cp;
+	Char *kp, *cp;
 
 	cp = el->el_line.buffer;
 	kp = el->el_chared.c_kill.buf;
 	while (cp < el->el_line.cursor)
 		*kp++ = *cp++;	/* copy it */
 	el->el_chared.c_kill.last = kp;
-	c_delbefore(el, el->el_line.cursor - el->el_line.buffer);
+	c_delbefore(el, (int)(el->el_line.cursor - el->el_line.buffer));
 	el->el_line.cursor = el->el_line.buffer;	/* zap! */
 	return (CC_REFRESH);
 }
@@ -657,7 +660,7 @@ vi_kill_line_prev(EditLine *el, int c __
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_search_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_search_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return (cv_search(el, ED_SEARCH_PREV_HISTORY));
@@ -670,7 +673,7 @@ vi_search_prev(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_search_next(EditLine *el, int c __attribute__((__unused__)))
+vi_search_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return (cv_search(el, ED_SEARCH_NEXT_HISTORY));
@@ -683,7 +686,7 @@ vi_search_next(EditLine *el, int c __att
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_repeat_search_next(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_search_next(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_search.patlen == 0)
@@ -699,7 +702,7 @@ vi_repeat_search_next(EditLine *el, int 
  */
 /*ARGSUSED*/
 protected el_action_t
-vi_repeat_search_prev(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_search_prev(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	if (el->el_search.patlen == 0)
@@ -717,7 +720,7 @@ vi_repeat_search_prev(EditLine *el, int 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_next_char(EditLine *el, int c __attribute__((__unused__)))
+vi_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 0);
 }
@@ -729,7 +732,7 @@ vi_next_char(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 0);
 }
@@ -741,7 +744,7 @@ vi_prev_char(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_next_char(EditLine *el, int c __attribute__((__unused__)))
+vi_to_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 1);
 }
@@ -753,7 +756,7 @@ vi_to_next_char(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_to_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 1);
 }
@@ -765,7 +768,7 @@ vi_to_prev_char(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_repeat_next_char(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_next_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return cv_csearch(el, el->el_search.chadir, el->el_search.chacha,
@@ -779,7 +782,7 @@ vi_repeat_next_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_repeat_prev_char(EditLine *el, int c __attribute__((__unused__)))
+vi_repeat_prev_char(EditLine *el, Int c __attribute__((__unused__)))
 {
 	el_action_t r;
 	int dir = el->el_search.chadir;
@@ -797,20 +800,20 @@ vi_repeat_prev_char(EditLine *el, int c 
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_match(EditLine *el, int c __attribute__((__unused__)))
+vi_match(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char match_chars[] = "()[]{}";
-	char *cp;
-	int delta, i, count;
-	char o_ch, c_ch;
+	const Char match_chars[] = STR("()[]{}");
+	Char *cp;
+	size_t delta, i, count;
+	Char o_ch, c_ch;
 
 	*el->el_line.lastchar = '\0';		/* just in case */
 
-	i = strcspn(el->el_line.cursor, match_chars);
+	i = Strcspn(el->el_line.cursor, match_chars);
 	o_ch = el->el_line.cursor[i];
 	if (o_ch == 0)
 		return CC_ERROR;
-	delta = strchr(match_chars, o_ch) - match_chars;
+	delta = Strchr(match_chars, o_ch) - match_chars;
 	c_ch = match_chars[delta ^ 1];
 	count = 1;
 	delta = 1 - (delta & 1) * 2;
@@ -844,7 +847,7 @@ vi_match(EditLine *el, int c __attribute
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_undo_line(EditLine *el, int c __attribute__((__unused__)))
+vi_undo_line(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_undo(el);
@@ -858,7 +861,7 @@ vi_undo_line(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_column(EditLine *el, int c __attribute__((__unused__)))
+vi_to_column(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
@@ -872,11 +875,11 @@ vi_to_column(EditLine *el, int c __attri
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_yank_end(EditLine *el, int c __attribute__((__unused__)))
+vi_yank_end(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	cv_yank(el, el->el_line.cursor,
-		el->el_line.lastchar - el->el_line.cursor);
+	    (int)(el->el_line.lastchar - el->el_line.cursor));
 	return CC_REFRESH;
 }
 
@@ -886,7 +889,7 @@ vi_yank_end(EditLine *el, int c __attrib
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_yank(EditLine *el, int c __attribute__((__unused__)))
+vi_yank(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	return cv_action(el, YANK);
@@ -898,7 +901,7 @@ vi_yank(EditLine *el, int c __attribute_
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_comment_out(EditLine *el, int c __attribute__((__unused__)))
+vi_comment_out(EditLine *el, Int c __attribute__((__unused__)))
 {
 
 	el->el_line.cursor = el->el_line.buffer;
@@ -915,18 +918,19 @@ vi_comment_out(EditLine *el, int c __att
  * this is against historical precedent...
  */
 #if defined(__weak_reference) && !defined(__FreeBSD__)
-extern char *get_alias_text(const char *) __weak_reference(get_alias_text);
+__weakref_visible char *my_get_alias_text(const char *)
+    __weak_reference(get_alias_text);
 #endif
 protected el_action_t
 /*ARGSUSED*/
 vi_alias(EditLine *el __attribute__((__unused__)),
-	 int c __attribute__((__unused__)))
+	 Int c __attribute__((__unused__)))
 {
 #if defined(__weak_reference) && !defined(__FreeBSD__)
 	char alias_name[3];
 	char *alias_text;
 
-	if (get_alias_text == 0) {
+	if (my_get_alias_text == 0) {
 		return CC_ERROR;
 	}
 
@@ -935,9 +939,9 @@ vi_alias(EditLine *el __attribute__((__u
 	if (el_getc(el, &alias_name[1]) != 1)
 		return CC_ERROR;
 
-	alias_text = get_alias_text(alias_name);
+	alias_text = my_get_alias_text(alias_name);
 	if (alias_text != NULL)
-		el_push(el, alias_text);
+		FUN(el,push)(el, ct_decode_string(alias_text, &el->el_scratch));
 	return CC_NORM;
 #else
 	return CC_ERROR;
@@ -950,14 +954,14 @@ vi_alias(EditLine *el __attribute__((__u
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_to_history_line(EditLine *el, int c __attribute__((__unused__)))
+vi_to_history_line(EditLine *el, Int c __attribute__((__unused__)))
 {
 	int sv_event_no = el->el_history.eventno;
 	el_action_t rval;
 
 
 	if (el->el_history.eventno == 0) {
-		 (void) strncpy(el->el_history.buf, el->el_line.buffer,
+		 (void) Strncpy(el->el_history.buf, el->el_line.buffer,
 		     EL_BUFSIZ);
 		 el->el_history.last = el->el_history.buf +
 			 (el->el_line.lastchar - el->el_line.buffer);
@@ -995,13 +999,16 @@ vi_to_history_line(EditLine *el, int c _
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_histedit(EditLine *el, int c __attribute__((__unused__)))
+vi_histedit(EditLine *el, Int c __attribute__((__unused__)))
 {
 	int fd;
 	pid_t pid;
-	int st;
+	ssize_t st;
+	int status;
 	char tempfile[] = "/tmp/histedit.XXXXXXXXXX";
 	char *cp;
+	size_t len;
+	Char *line;
 
 	if (el->el_state.doingarg) {
 		if (vi_to_history_line(el, 0) == CC_ERROR)
@@ -1011,14 +1018,33 @@ vi_histedit(EditLine *el, int c __attrib
 	fd = mkstemp(tempfile);
 	if (fd < 0)
 		return CC_ERROR;
-	cp = el->el_line.buffer;
-	write(fd, cp, el->el_line.lastchar - cp +0u);
+	len = (size_t)(el->el_line.lastchar - el->el_line.buffer);
+#define TMP_BUFSIZ (EL_BUFSIZ * MB_LEN_MAX)
+	cp = el_malloc(TMP_BUFSIZ);
+	if (cp == NULL) {
+		unlink(tempfile);
+		close(fd);
+		return CC_ERROR;
+	}
+	line = el_malloc(len * sizeof(*line));
+	if (line == NULL) {
+		el_free((ptr_t)cp);
+		return CC_ERROR;
+	}
+	Strncpy(line, el->el_line.buffer, len);
+	line[len] = '\0';
+	ct_wcstombs(cp, line, TMP_BUFSIZ - 1);
+	cp[TMP_BUFSIZ - 1] = '\0';
+	len = strlen(cp);
+	write(fd, cp, len);
 	write(fd, "\n", 1);
 	pid = fork();
 	switch (pid) {
 	case -1:
 		close(fd);
 		unlink(tempfile);
+		el_free(cp);
+                el_free(line);
 		return CC_ERROR;
 	case 0:
 		close(fd);
@@ -1026,14 +1052,23 @@ vi_histedit(EditLine *el, int c __attrib
 		exit(0);
 		/*NOTREACHED*/
 	default:
-		while (waitpid(pid, &st, 0) != pid)
+		while (waitpid(pid, &status, 0) != pid)
 			continue;
-		lseek(fd, 0ll, SEEK_SET);
-		st = read(fd, cp, el->el_line.limit - cp +0u);
-		if (st > 0 && cp[st - 1] == '\n')
-			st--;
-		el->el_line.cursor = cp;
-		el->el_line.lastchar = cp + st;
+		lseek(fd, (off_t)0, SEEK_SET);
+		st = read(fd, cp, TMP_BUFSIZ);
+		if (st > 0) {
+			len = (size_t)(el->el_line.lastchar -
+			    el->el_line.buffer);
+			len = ct_mbstowcs(el->el_line.buffer, cp, len);
+			if (len > 0 && el->el_line.buffer[len -1] == '\n')
+				--len;
+		}
+		else
+			len = 0;
+                el->el_line.cursor = el->el_line.buffer;
+                el->el_line.lastchar = el->el_line.buffer + len;
+		el_free(cp);
+                el_free(line);
 		break;
 	}
 
@@ -1051,34 +1086,35 @@ vi_histedit(EditLine *el, int c __attrib
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_history_word(EditLine *el, int c __attribute__((__unused__)))
+vi_history_word(EditLine *el, Int c __attribute__((__unused__)))
 {
-	const char *wp = HIST_FIRST(el);
-	const char *wep, *wsp;
+	const Char *wp = HIST_FIRST(el);
+	const Char *wep, *wsp;
 	int len;
-	char *cp;
-	const char *lim;
+	Char *cp;
+	const Char *lim;
 
 	if (wp == NULL)
 		return CC_ERROR;
 
 	wep = wsp = 0;
 	do {
-		while (isspace((unsigned char)*wp))
+		while (Isspace(*wp))
 			wp++;
 		if (*wp == 0)
 			break;
 		wsp = wp;
-		while (*wp && !isspace((unsigned char)*wp))
+		while (*wp && !Isspace(*wp))
 			wp++;
 		wep = wp;
-	} while ((!el->el_state.doingarg || --el->el_state.argument > 0) && *wp != 0);
+	} while ((!el->el_state.doingarg || --el->el_state.argument > 0)
+	    && *wp != 0);
 
 	if (wsp == 0 || (el->el_state.doingarg && el->el_state.argument != 0))
 		return CC_ERROR;
 
 	cv_undo(el);
-	len = wep - wsp;
+	len = (int)(wep - wsp);
 	if (el->el_line.cursor < el->el_line.lastchar)
 		el->el_line.cursor++;
 	c_insert(el, len + 1);
@@ -1100,7 +1136,7 @@ vi_history_word(EditLine *el, int c __at
  */
 protected el_action_t
 /*ARGSUSED*/
-vi_redo(EditLine *el, int c __attribute__((__unused__)))
+vi_redo(EditLine *el, Int c __attribute__((__unused__)))
 {
 	c_redo_t *r = &el->el_chared.c_redo;
 
@@ -1116,7 +1152,7 @@ vi_redo(EditLine *el, int c __attribute_
 			/* sanity */
 			r->pos = r->lim - 1;
 		r->pos[0] = 0;
-		el_push(el, r->buf);
+		FUN(el,push)(el, r->buf);
 	}
 
 	el->el_state.thiscmd = r->cmd;

=== modified file 'config.h.cmake'
--- a/config.h.cmake	2011-04-14 08:09:49 +0000
+++ b/config.h.cmake	2011-04-17 13:40:20 +0000
@@ -172,6 +172,10 @@
 #cmakedefine gmtime_r @gmtime_r@
 #cmakedefine HAVE_INITGROUPS 1
 #cmakedefine HAVE_ISSETUGID 1
+#cmakedefine HAVE_GETUID 1
+#cmakedefine HAVE_GETEUID 1
+#cmakedefine HAVE_GETGID 1
+#cmakedefine HAVE_GETEGID 1
 #cmakedefine HAVE_ISNAN 1
 #cmakedefine HAVE_ISINF 1
 #cmakedefine HAVE_LARGE_PAGE_OPTION 1

=== modified file 'configure.cmake'
--- a/configure.cmake	2011-04-13 19:16:45 +0000
+++ b/configure.cmake	2011-04-17 13:40:20 +0000
@@ -353,6 +353,10 @@ CHECK_FUNCTION_EXISTS (getwd HAVE_GETWD)
 CHECK_FUNCTION_EXISTS (gmtime_r HAVE_GMTIME_R)
 CHECK_FUNCTION_EXISTS (initgroups HAVE_INITGROUPS)
 CHECK_FUNCTION_EXISTS (issetugid HAVE_ISSETUGID)
+CHECK_FUNCTION_EXISTS (getuid HAVE_GETUID)
+CHECK_FUNCTION_EXISTS (geteuid HAVE_GETEUID)
+CHECK_FUNCTION_EXISTS (getgid HAVE_GETGID)
+CHECK_FUNCTION_EXISTS (getegid HAVE_GETEGID)
 CHECK_FUNCTION_EXISTS (ldiv HAVE_LDIV)
 CHECK_FUNCTION_EXISTS (localtime_r HAVE_LOCALTIME_R)
 CHECK_FUNCTION_EXISTS (longjmp HAVE_LONGJMP)

Attachment: [text/bzr-bundle] bzr/nirbhay.choubey@oracle.com-20110417134020-dxhhkw3nbvnyrp3y.bundle
Thread
bzr commit into mysql-trunk branch (nirbhay.choubey:3327) Bug#49967Nirbhay Choubey17 Apr
  • Re: bzr commit into mysql-trunk branch (nirbhay.choubey:3327) Bug#49967Nirbhay Choubey18 Apr