]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_set_term.c
ncurses 5.9 - patch 20130713
[ncurses.git] / ncurses / base / lib_set_term.c
index 816ab041d647c81c1c076bda82313ba9426216e6..1406b1ad03d0e7e1af6be686f061b47c00c3ebbc 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -47,7 +47,7 @@
 #define CUR SP_TERMTYPE
 #endif
 
-MODULE_ID("$Id: lib_set_term.c,v 1.135 2009/11/28 21:49:24 tom Exp $")
+MODULE_ID("$Id: lib_set_term.c,v 1.147 2012/12/22 21:30:04 tom Exp $")
 
 #ifdef USE_TERM_DRIVER
 #define MaxColors      InfoOf(sp).maxcolors
@@ -117,7 +117,7 @@ delink_screen(SCREEN *sp)
     for (each_screen(temp)) {
        if (temp == sp) {
            if (last)
-               last = sp->_next_screen;
+               last->_next_screen = sp->_next_screen;
            else
                _nc_screen_chain = sp->_next_screen;
            result = TRUE;
@@ -188,18 +188,7 @@ delscreen(SCREEN *sp)
        FreeIfNeeded(sp->_acs_map);
        FreeIfNeeded(sp->_screen_acs_map);
 
-       /*
-        * If the associated output stream has been closed, we can discard the
-        * set-buffer.  Limit the error check to EBADF, since fflush may fail
-        * for other reasons than trying to operate upon a closed stream.
-        */
-       if (sp->_ofp != 0
-           && sp->_setbuf != 0
-           && fflush(sp->_ofp) != 0
-           && errno == EBADF) {
-           free(sp->_setbuf);
-       }
-
+       NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
        NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx sp->_term);
        free(sp);
 
@@ -272,8 +261,8 @@ extract_fgbg(char *src, int *result)
 }
 #endif
 
-#define ReturnScreenError() _nc_set_screen(0); \
-                            returnCode(ERR)
+#define ReturnScreenError() _nc_set_screen(0); \
+                            returnCode(ERR); } while (0)
 
 /* OS-independent screen initializations */
 NCURSES_EXPORT(int)
@@ -284,7 +273,7 @@ NCURSES_SP_NAME(_nc_setupscreen) (
                                     int slines,
                                     int scolumns,
                                     FILE *output,
-                                    bool filtered,
+                                    int filtered,
                                     int slk_format)
 {
     char *env;
@@ -314,7 +303,7 @@ NCURSES_SP_NAME(_nc_setupscreen) (
        ReturnScreenError();
     }
 
-    T(("created SP %p", sp));
+    T(("created SP %p", (void *) sp));
     sp->_next_screen = _nc_screen_chain;
     _nc_screen_chain = sp;
 
@@ -380,10 +369,18 @@ NCURSES_SP_NAME(_nc_setupscreen) (
     setmode(output, O_BINARY);
 #endif
     NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_ARGx output, TRUE);
-    sp->_lines = slines;
-    sp->_lines_avail = slines;
-    sp->_columns = scolumns;
+    sp->_lines = (NCURSES_SIZE_T) slines;
+    sp->_lines_avail = (NCURSES_SIZE_T) slines;
+    sp->_columns = (NCURSES_SIZE_T) scolumns;
+
+    fflush(output);
+    sp->_ofd = output ? fileno(output) : -1;
     sp->_ofp = output;
+    sp->out_limit = (size_t) ((2 + slines) * (6 + scolumns));
+    if ((sp->out_buffer = malloc(sp->out_limit)) == 0)
+       sp->out_limit = 0;
+    sp->out_inuse = 0;
+
     SP_PRE_INIT(sp);
     SetNoPadding(sp);
 
@@ -584,9 +581,13 @@ NCURSES_SP_NAME(_nc_setupscreen) (
 
     NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG);
 #if USE_WIDEC_SUPPORT
+    sp->_screen_unicode = _nc_unicode_locale();
     _nc_init_wacs();
+    if (_nc_wacs == 0) {
+       ReturnScreenError();
+    }
 
-    sp->_screen_acs_fix = (_nc_unicode_locale()
+    sp->_screen_acs_fix = (sp->_screen_unicode
                           && _nc_locale_breaks_acs(sp->_term));
 #endif
     env = _nc_get_locale();
@@ -619,6 +620,7 @@ NCURSES_SP_NAME(_nc_setupscreen) (
 #endif
 #if USE_SIZECHANGE
     sp->_resize = NCURSES_SP_NAME(resizeterm);
+    sp->_ungetch = safe_ungetch;
 #endif
 
     NewScreen(sp)->_clear = TRUE;
@@ -663,11 +665,12 @@ NCURSES_SP_NAME(_nc_setupscreen) (
                } else {
                    ReturnScreenError();
                }
-               if (rop->line < 0)
+               if (rop->line < 0) {
                    bottom_stolen += count;
-               else
-                   sp->_topstolen += count;
-               sp->_lines_avail -= count;
+               } else {
+                   sp->_topstolen = (NCURSES_SIZE_T) (sp->_topstolen + count);
+               }
+               sp->_lines_avail = (NCURSES_SIZE_T) (sp->_lines_avail - count);
            }
        }
        /* reset the stack */
@@ -694,7 +697,7 @@ NCURSES_EXPORT(int)
 _nc_setupscreen(int slines GCC_UNUSED,
                int scolumns GCC_UNUSED,
                FILE *output,
-               bool filtered,
+               int filtered,
                int slk_format)
 {
     SCREEN *sp = 0;
@@ -722,7 +725,7 @@ NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx
     int code = ERR;
 
     START_TRACE();
-    T((T_CALLED("ripoffline(%p,%d,%p)"), (void *) SP_PARM, line, (void *) init));
+    T((T_CALLED("ripoffline(%p,%d,%p)"), (void *) SP_PARM, line, init));
 
 #if NCURSES_SP_FUNCS
     if (SP_PARM != 0 && SP_PARM->_prescreen)
@@ -758,6 +761,7 @@ NCURSES_SP_NAME(ripoffline) (NCURSES_SP_DCLx
                             int line,
                             int (*init) (WINDOW *, int))
 {
+    START_TRACE();
     return NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx
                                            (line < 0) ? -1 : 1,
                                            init);