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)