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)