Module Name:    src
Committed By:   roy
Date:           Mon Jan 30 14:55:58 UTC 2017

Modified Files:
        src/lib/libcurses: curses.c curses_private.h get_wch.c getch.c
            ins_wch.c ins_wstr.c setterm.c

Log Message:
If either set_escdelay(3) or set_tabsize(3) are called, set _reentrant
to ensure we use the saved value for the sceen.

This effectively makes ESCDELAY and TABSIZE read-only when either
of these functions are called.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/lib/libcurses/curses.c
cvs rdiff -u -r1.60 -r1.61 src/lib/libcurses/curses_private.h
cvs rdiff -u -r1.12 -r1.13 src/lib/libcurses/get_wch.c
cvs rdiff -u -r1.62 -r1.63 src/lib/libcurses/getch.c
cvs rdiff -u -r1.9 -r1.10 src/lib/libcurses/ins_wch.c \
    src/lib/libcurses/ins_wstr.c
cvs rdiff -u -r1.61 -r1.62 src/lib/libcurses/setterm.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/curses.c
diff -u src/lib/libcurses/curses.c:1.26 src/lib/libcurses/curses.c:1.27
--- src/lib/libcurses/curses.c:1.26	Sat Oct 22 21:55:06 2016
+++ src/lib/libcurses/curses.c	Mon Jan 30 14:55:58 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: curses.c,v 1.26 2016/10/22 21:55:06 christos Exp $	*/
+/*	$NetBSD: curses.c,v 1.27 2017/01/30 14:55:58 roy Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -35,7 +35,7 @@
 #if 0
 static char sccsid[] = "@(#)curses.c	8.3 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: curses.c,v 1.26 2016/10/22 21:55:06 christos Exp $");
+__RCSID("$NetBSD: curses.c,v 1.27 2017/01/30 14:55:58 roy Exp $");
 #endif
 #endif				/* not lint */
 
@@ -64,6 +64,7 @@ WINDOW	*curscr;			/* Current screen. */
 WINDOW	*stdscr;			/* Standard screen. */
 WINDOW	*__virtscr;			/* Virtual screen (for doupdate()). */
 SCREEN  *_cursesi_screen;               /* the current screen we are using */
+volatile bool	 _reentrant;		/* If true, some global vars are ro. */
 int	 COLS;				/* Columns on the screen. */
 int	 LINES;				/* Lines on the screen. */
 int	 TABSIZE;			/* Size of a tab. */

Index: src/lib/libcurses/curses_private.h
diff -u src/lib/libcurses/curses_private.h:1.60 src/lib/libcurses/curses_private.h:1.61
--- src/lib/libcurses/curses_private.h:1.60	Tue Jan 24 17:27:30 2017
+++ src/lib/libcurses/curses_private.h	Mon Jan 30 14:55:58 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: curses_private.h,v 1.60 2017/01/24 17:27:30 roy Exp $	*/
+/*	$NetBSD: curses_private.h,v 1.61 2017/01/30 14:55:58 roy Exp $	*/
 
 /*-
  * Copyright (c) 1998-2000 Brett Lymn
@@ -314,6 +314,7 @@ extern char	 __UPPERCASE;		/* Terminal i
 extern int	 My_term;		/* Use Def_term regardless. */
 extern const char	*Def_term;	/* Default terminal type. */
 extern SCREEN   *_cursesi_screen;       /* The current screen in use */
+extern volatile bool	 _reentrant;	/* If true, some global vars are ro. */
 
 /* Debugging options/functions. */
 #ifdef DEBUG

Index: src/lib/libcurses/get_wch.c
diff -u src/lib/libcurses/get_wch.c:1.12 src/lib/libcurses/get_wch.c:1.13
--- src/lib/libcurses/get_wch.c:1.12	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/get_wch.c	Mon Jan 30 14:55:58 2017
@@ -1,4 +1,4 @@
-/*   $NetBSD: get_wch.c,v 1.12 2017/01/06 13:53:18 roy Exp $ */
+/*   $NetBSD: get_wch.c,v 1.13 2017/01/30 14:55:58 roy Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: get_wch.c,v 1.12 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: get_wch.c,v 1.13 2017/01/30 14:55:58 roy Exp $");
 #endif						  /* not lint */
 
 #include <string.h>
@@ -91,7 +91,8 @@ inkey(wchar_t *wc, int to, int delay)
 				*working = &_cursesi_screen->cbuf_cur,
 				*end = &_cursesi_screen->cbuf_tail;
 	char		*inbuf = &_cursesi_screen->cbuf[ 0 ];
-	int		escdelay = _cursesi_screen->ESCDELAY;
+	int		escdelay = _reentrant ?
+			    _cursesi_screen->ESCDELAY : ESCDELAY;
 
 #ifdef DEBUG
 	__CTRACE(__CTRACE_INPUT, "inkey (%p, %d, %d)\n", wc, to, delay);

Index: src/lib/libcurses/getch.c
diff -u src/lib/libcurses/getch.c:1.62 src/lib/libcurses/getch.c:1.63
--- src/lib/libcurses/getch.c:1.62	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/getch.c	Mon Jan 30 14:55:58 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: getch.c,v 1.62 2017/01/06 13:53:18 roy Exp $	*/
+/*	$NetBSD: getch.c,v 1.63 2017/01/30 14:55:58 roy Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)getch.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: getch.c,v 1.62 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: getch.c,v 1.63 2017/01/30 14:55:58 roy Exp $");
 #endif
 #endif					/* not lint */
 
@@ -550,7 +550,8 @@ inkey(int to, int delay)
 	int              c, mapping;
 	keymap_t	*current = _cursesi_screen->base_keymap;
 	FILE            *infd = _cursesi_screen->infd;
-	int		escdelay = _cursesi_screen->ESCDELAY;
+	int		escdelay = _reentrant ?
+			    _cursesi_screen->ESCDELAY : ESCDELAY;
 
 	k = 0;		/* XXX gcc -Wuninitialized */
 
@@ -988,6 +989,7 @@ set_escdelay(int escdelay)
 {
 
 	_cursesi_screen->ESCDELAY = escdelay;
+	_reentrant = true;
 	ESCDELAY = escdelay;
 	return OK;
 }

Index: src/lib/libcurses/ins_wch.c
diff -u src/lib/libcurses/ins_wch.c:1.9 src/lib/libcurses/ins_wch.c:1.10
--- src/lib/libcurses/ins_wch.c:1.9	Fri Jan  6 13:53:18 2017
+++ src/lib/libcurses/ins_wch.c	Mon Jan 30 14:55:58 2017
@@ -1,4 +1,4 @@
-/*   $NetBSD: ins_wch.c,v 1.9 2017/01/06 13:53:18 roy Exp $ */
+/*   $NetBSD: ins_wch.c,v 1.10 2017/01/30 14:55:58 roy Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ins_wch.c,v 1.9 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: ins_wch.c,v 1.10 2017/01/30 14:55:58 roy Exp $");
 #endif						  /* not lint */
 
 #include <string.h>
@@ -146,7 +146,7 @@ wins_wch(WINDOW *win, const cchar_t *wch
 			}
 			return OK;
 		case L'\t':
-			tabsize = win->screen->TABSIZE;
+			tabsize = _reentrant ? win->screen->TABSIZE : TABSIZE;
 			if (wins_nwstr(win, ws, min(win->maxx - x,
 			    tabsize - (x % tabsize))) == ERR)
 				return ERR;
Index: src/lib/libcurses/ins_wstr.c
diff -u src/lib/libcurses/ins_wstr.c:1.9 src/lib/libcurses/ins_wstr.c:1.10
--- src/lib/libcurses/ins_wstr.c:1.9	Mon Jan  2 10:28:34 2017
+++ src/lib/libcurses/ins_wstr.c	Mon Jan 30 14:55:58 2017
@@ -1,4 +1,4 @@
-/*   $NetBSD: ins_wstr.c,v 1.9 2017/01/02 10:28:34 roy Exp $ */
+/*   $NetBSD: ins_wstr.c,v 1.10 2017/01/30 14:55:58 roy Exp $ */
 
 /*
  * Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ins_wstr.c,v 1.9 2017/01/02 10:28:34 roy Exp $");
+__RCSID("$NetBSD: ins_wstr.c,v 1.10 2017/01/30 14:55:58 roy Exp $");
 #endif						  /* not lint */
 
 #include <string.h>
@@ -266,7 +266,8 @@ wins_nwstr(WINDOW *win, const wchar_t *w
 				}
 				continue;
 			case L'\t':
-				tabsize = win->screen->TABSIZE;
+				tabsize = _reentrant ?
+				    win->screen->TABSIZE : TABSIZE;
 				if (wins_nwstr(win, ws,
 				    min(win->maxx - x, tabsize - (x % tabsize)))
 				    == ERR)

Index: src/lib/libcurses/setterm.c
diff -u src/lib/libcurses/setterm.c:1.61 src/lib/libcurses/setterm.c:1.62
--- src/lib/libcurses/setterm.c:1.61	Wed Jan 11 20:43:03 2017
+++ src/lib/libcurses/setterm.c	Mon Jan 30 14:55:58 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: setterm.c,v 1.61 2017/01/11 20:43:03 roy Exp $	*/
+/*	$NetBSD: setterm.c,v 1.62 2017/01/30 14:55:58 roy Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)setterm.c	8.8 (Berkeley) 10/25/94";
 #else
-__RCSID("$NetBSD: setterm.c,v 1.61 2017/01/11 20:43:03 roy Exp $");
+__RCSID("$NetBSD: setterm.c,v 1.62 2017/01/30 14:55:58 roy Exp $");
 #endif
 #endif /* not lint */
 
@@ -404,6 +404,7 @@ set_tabsize(int tabsize)
 {
 
 	_cursesi_screen->TABSIZE = tabsize;
+	_reentrant = true;
 	TABSIZE = tabsize;
 	return OK;
 }

Reply via email to