Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libcurses It is expensive to open and close files for ev...



details:   https://anonhg.NetBSD.org/src/rev/8fe54012952c
branches:  trunk
changeset: 818681:8fe54012952c
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Oct 23 21:20:56 2016 +0000

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

diffstat:

 lib/libcurses/curses_private.h |   3 ++-
 lib/libcurses/delwin.c         |   6 ++++--
 lib/libcurses/newwin.c         |   5 +++--
 lib/libcurses/printw.c         |  35 ++++++++++++++++-------------------
 4 files changed, 25 insertions(+), 24 deletions(-)

diffs (149 lines):

diff -r 27cf796bec1d -r 8fe54012952c lib/libcurses/curses_private.h
--- a/lib/libcurses/curses_private.h    Sun Oct 23 21:01:52 2016 +0000
+++ b/lib/libcurses/curses_private.h    Sun Oct 23 21:20:56 2016 +0000
@@ -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 @@
 #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'. */
diff -r 27cf796bec1d -r 8fe54012952c lib/libcurses/delwin.c
--- a/lib/libcurses/delwin.c    Sun Oct 23 21:01:52 2016 +0000
+++ b/lib/libcurses/delwin.c    Sun Oct 23 21:20:56 2016 +0000
@@ -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 @@
                _cursesi_screen->stdscr = NULL;
        if (win == _cursesi_screen->__virtscr)
                _cursesi_screen->__virtscr = NULL;
+       if (win->fp)
+               fclose(win->fp);
        free(win);
        return (OK);
 }
diff -r 27cf796bec1d -r 8fe54012952c lib/libcurses/newwin.c
--- a/lib/libcurses/newwin.c    Sun Oct 23 21:01:52 2016 +0000
+++ b/lib/libcurses/newwin.c    Sun Oct 23 21:20:56 2016 +0000
@@ -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 @@
 #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) {
diff -r 27cf796bec1d -r 8fe54012952c lib/libcurses/printw.c
--- a/lib/libcurses/printw.c    Sun Oct 23 21:01:52 2016 +0000
+++ b/lib/libcurses/printw.c    Sun Oct 23 21:20:56 2016 +0000
@@ -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 @@
  * printw and friends.
  */
 
-static int __winwrite __P((void *, const char *, int));
-
 /*
  * printw --
  *     Printf on the standard screen.
@@ -115,24 +113,21 @@
 /*
  * 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 @@
 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)



Home | Main Index | Thread Index | Old Index