Module Name:    src
Committed By:   christos
Date:           Sun Oct 23 21:20:56 UTC 2016

Modified Files:
        src/lib/libcurses: curses_private.h delwin.c newwin.c printw.c

Log Message:
It is expensive to open and close files for every printf, keep it around.


To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/lib/libcurses/curses_private.h
cvs rdiff -u -r1.18 -r1.19 src/lib/libcurses/delwin.c
cvs rdiff -u -r1.47 -r1.48 src/lib/libcurses/newwin.c
cvs rdiff -u -r1.22 -r1.23 src/lib/libcurses/printw.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_private.h
diff -u src/lib/libcurses/curses_private.h:1.50 src/lib/libcurses/curses_private.h:1.51
--- src/lib/libcurses/curses_private.h:1.50	Thu Feb 20 04:42:42 2014
+++ src/lib/libcurses/curses_private.h	Sun Oct 23 17:20:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: curses_private.h,v 1.50 2014/02/20 09:42:42 blymn Exp $	*/
+/*	$NetBSD: curses_private.h,v 1.51 2016/10/23 21:20:56 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998-2000 Brett Lymn
@@ -147,6 +147,7 @@ struct __window {		/* Window structure. 
 #ifdef HAVE_WCHAR
 	nschar_t *bnsp;			/* Background non-spacing char list */
 #endif /* HAVE_WCHAR */
+	FILE	*fp;			/* for window formatted printf */
 };
 
 /* Set of attributes unset by 'me' - 'mb', 'md', 'mh', 'mk', 'mp' and 'mr'. */

Index: src/lib/libcurses/delwin.c
diff -u src/lib/libcurses/delwin.c:1.18 src/lib/libcurses/delwin.c:1.19
--- src/lib/libcurses/delwin.c:1.18	Tue Oct 15 18:15:17 2013
+++ src/lib/libcurses/delwin.c	Sun Oct 23 17:20:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: delwin.c,v 1.18 2013/10/15 22:15:17 roy Exp $	*/
+/*	$NetBSD: delwin.c,v 1.19 2016/10/23 21:20:56 christos Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)delwin.c	8.2 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: delwin.c,v 1.18 2013/10/15 22:15:17 roy Exp $");
+__RCSID("$NetBSD: delwin.c,v 1.19 2016/10/23 21:20:56 christos Exp $");
 #endif
 #endif				/* not lint */
 
@@ -112,6 +112,8 @@ delwin(WINDOW *win)
 		_cursesi_screen->stdscr = NULL;
 	if (win == _cursesi_screen->__virtscr)
 		_cursesi_screen->__virtscr = NULL;
+	if (win->fp)
+		fclose(win->fp);
 	free(win);
 	return (OK);
 }

Index: src/lib/libcurses/newwin.c
diff -u src/lib/libcurses/newwin.c:1.47 src/lib/libcurses/newwin.c:1.48
--- src/lib/libcurses/newwin.c:1.47	Wed Jul 22 12:57:15 2009
+++ src/lib/libcurses/newwin.c	Sun Oct 23 17:20:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: newwin.c,v 1.47 2009/07/22 16:57:15 roy Exp $	*/
+/*	$NetBSD: newwin.c,v 1.48 2016/10/23 21:20:56 christos Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)newwin.c	8.3 (Berkeley) 7/27/94";
 #else
-__RCSID("$NetBSD: newwin.c,v 1.47 2009/07/22 16:57:15 roy Exp $");
+__RCSID("$NetBSD: newwin.c,v 1.48 2016/10/23 21:20:56 christos Exp $");
 #endif
 #endif				/* not lint */
 
@@ -292,6 +292,7 @@ __makenew(SCREEN *screen, int nlines, in
 #ifdef DEBUG
 	__CTRACE(__CTRACE_WINDOW, "makenew: win = %p\n", win);
 #endif
+	win->fp = NULL;
 
 	/* Set up line pointer array and line space. */
 	if ((win->alines = malloc(nlines * sizeof(__LINE *))) == NULL) {

Index: src/lib/libcurses/printw.c
diff -u src/lib/libcurses/printw.c:1.22 src/lib/libcurses/printw.c:1.23
--- src/lib/libcurses/printw.c:1.22	Sun Jul 17 16:54:34 2011
+++ src/lib/libcurses/printw.c	Sun Oct 23 17:20:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: printw.c,v 1.22 2011/07/17 20:54:34 joerg Exp $	*/
+/*	$NetBSD: printw.c,v 1.23 2016/10/23 21:20:56 christos Exp $	*/
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)printw.c	8.3 (Berkeley) 5/4/94";
 #else
-__RCSID("$NetBSD: printw.c,v 1.22 2011/07/17 20:54:34 joerg Exp $");
+__RCSID("$NetBSD: printw.c,v 1.23 2016/10/23 21:20:56 christos Exp $");
 #endif
 #endif				/* not lint */
 
@@ -47,8 +47,6 @@ __RCSID("$NetBSD: printw.c,v 1.22 2011/0
  * printw and friends.
  */
 
-static int __winwrite __P((void *, const char *, int));
-
 /*
  * printw --
  *	Printf on the standard screen.
@@ -115,24 +113,21 @@ mvwprintw(WINDOW * win, int y, int x, co
 /*
  * Internal write-buffer-to-window function.
  */
-static int
-__winwrite(cookie, buf, n)
-	void   *cookie;
-	const char *buf;
-	int     n;
+static ssize_t
+winwrite(void   *cookie, const void *vbuf, size_t n)
 {
 	WINDOW *win;
-	int     c;
+	size_t     c;
+	const char *buf = vbuf;
 
-	for (c = n, win = cookie; --c >= 0;)
-	{
+	for (c = 0, win = cookie; c < n; c++) {
 #ifdef DEBUG
 		__CTRACE(__CTRACE_MISC, "__winwrite: %c\n", *buf);
 #endif
 		if (waddch(win, (chtype) (*buf++ & __CHARTEXT)) == ERR)
 			return (-1);
 	}
-	return (n);
+	return (ssize_t)n;
 }
 /*
  * vw_printw --
@@ -141,12 +136,14 @@ __winwrite(cookie, buf, n)
 int
 vw_printw(WINDOW *win, const char *fmt, va_list ap)
 {
-	FILE   *f;
-
-	if ((f = funopen(win, NULL, __winwrite, NULL, NULL)) == NULL)
-		return (ERR);
-	(void) vfprintf(f, fmt, ap);
-	return (fclose(f) ? ERR : OK);
+	if (win->fp == NULL) {
+		win->fp = funopen2(win, NULL, winwrite, NULL, NULL, NULL);
+		if (win->fp == NULL)
+			return ERR;
+	}
+	vfprintf(win->fp, fmt, ap);
+	fflush(win->fp);
+	return OK;
 }
 
 __strong_alias(vwprintw, vw_printw)

Reply via email to