Module Name:    src
Committed By:   christos
Date:           Fri Jan  6 22:20:54 UTC 2012

Modified Files:
        src/lib/libcurses: getstr.c

Log Message:
PR/45791: Nat Sloss: getnstr erase character weirdness
Fix processing of backspace erase char and char left.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/lib/libcurses/getstr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libcurses/getstr.c
diff -u src/lib/libcurses/getstr.c:1.20 src/lib/libcurses/getstr.c:1.21
--- src/lib/libcurses/getstr.c:1.20	Mon May 28 11:01:55 2007
+++ src/lib/libcurses/getstr.c	Fri Jan  6 17:20:54 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: getstr.c,v 1.20 2007/05/28 15:01:55 blymn Exp $	*/
+/*	$NetBSD: getstr.c,v 1.21 2012/01/06 22:20:54 christos Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -35,10 +35,11 @@
 #if 0
 static char sccsid[] = "@(#)getstr.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: getstr.c,v 1.20 2007/05/28 15:01:55 blymn Exp $");
+__RCSID("$NetBSD: getstr.c,v 1.21 2012/01/06 22:20:54 christos Exp $");
 #endif
 #endif				/* not lint */
 
+#include <ctype.h>
 #include "curses.h"
 #include "curses_private.h"
 
@@ -161,12 +162,12 @@ int
 __wgetnstr(WINDOW *win, char *str, int n)
 {
 	char *ostr, ec, kc;
-	int c, oldx, remain;
+	int c, xpos, oldx, remain;
 
 	ostr = str;
 	ec = erasechar();
 	kc = killchar();
-	oldx = win->curx;
+	xpos = oldx = win->curx;
 	_DIAGASSERT(n == -1 || n > 1);
 	remain = n - 1;
 
@@ -182,17 +183,23 @@ __wgetnstr(WINDOW *win, char *str, int n
 			*str = '\0';
 			if (str != ostr) {
 				if ((char) c == ec) {
-					mvwaddch(win, win->cury, win->curx,
-					    ' ');
-					wmove(win, win->cury, win->curx - 1);
+					mvwaddch(win, win->cury, xpos, ' ');
+					if (xpos > oldx)
+						mvwaddch(win, win->cury,
+						    xpos - 1, ' ');
+					if (win->curx > xpos - 1)
+						wmove(win, win->cury, xpos - 1);
+					xpos--;
 				}
 				if (c == KEY_BACKSPACE || c == KEY_LEFT) {
 					/* getch() displays the key sequence */
-					mvwaddch(win, win->cury, win->curx - 1,
+					mvwaddch(win, win->cury, win->curx,
 					    ' ');
-					mvwaddch(win, win->cury, win->curx - 2,
+					mvwaddch(win, win->cury, win->curx - 1,
 					    ' ');
-					wmove(win, win->cury, win->curx - 1);
+					if (win->curx > xpos)
+						wmove(win, win->cury, xpos - 1);
+					xpos--;
 				}
 				str--;
 				if (n != -1) {
@@ -200,11 +207,12 @@ __wgetnstr(WINDOW *win, char *str, int n
 					remain++;
 				}
 			} else {        /* str == ostr */
-				if (c == KEY_BACKSPACE || c == KEY_LEFT)
-					/* getch() displays the other keys */
+				/* getch() displays the other keys */
+				if (win->curx > oldx)
 					mvwaddch(win, win->cury, win->curx - 1,
 					    ' ');
 				wmove(win, win->cury, oldx);
+				xpos = oldx;
 			}
 		} else if (c == kc) {
 			*str = '\0';
@@ -229,15 +237,20 @@ __wgetnstr(WINDOW *win, char *str, int n
 			wmove(win, win->cury, oldx);
 		} else if (c >= KEY_MIN && c <= KEY_MAX) {
 			/* getch() displays these characters */
-			mvwaddch(win, win->cury, win->curx - 1, ' ');
-			wmove(win, win->cury, win->curx - 1);
+			mvwaddch(win, win->cury, xpos, ' ');
+			wmove(win, win->cury, xpos);
 		} else {
 			if (remain) {
+				if (iscntrl((unsigned char)c)) {
+					mvwaddch(win, win->cury, xpos, ' ');
+					wmove(win, win->cury, xpos + 1);
+				}
 				str++;
+				xpos++;
 				remain--;
 			} else {
-				mvwaddch(win, win->cury, win->curx - 1, ' ');
-				wmove(win, win->cury, win->curx - 1);
+				mvwaddch(win, win->cury, xpos, ' ');
+				wmove(win, win->cury, xpos - 1);
 			}
 		}
 	}

Reply via email to