ncurses 5.9 - patch 20121026
[ncurses.git] / ncurses / base / lib_set_term.c
index 49752fd71e31330635f5f13141f3f409a0d02053..83d0e7d01487a7954bb16e4f2b269828e2c12e64 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.128 2009/09/27 14:21:25 tom Exp $")
+MODULE_ID("$Id: lib_set_term.c,v 1.146 2012/10/27 23:04:17 tom Exp $")
 
 #ifdef USE_TERM_DRIVER
 #define MaxColors      InfoOf(sp).maxcolors
@@ -63,7 +63,7 @@ set_term(SCREEN *screenp)
     SCREEN *oldSP;
     SCREEN *newSP;
 
-    T((T_CALLED("set_term(%p)"), screenp));
+    T((T_CALLED("set_term(%p)"), (void *) screenp));
 
     _nc_lock_global(curses);
 
@@ -74,9 +74,9 @@ set_term(SCREEN *screenp)
     if (newSP != 0) {
        TINFO_SET_CURTERM(newSP, newSP->_term);
 #if !USE_REENTRANT
-       curscr = newSP->_curscr;
-       newscr = newSP->_newscr;
-       stdscr = newSP->_stdscr;
+       curscr = CurScreen(newSP);
+       newscr = NewScreen(newSP);
+       stdscr = StdScreen(newSP);
        COLORS = newSP->_color_count;
        COLOR_PAIRS = newSP->_pair_count;
 #endif
@@ -93,7 +93,7 @@ set_term(SCREEN *screenp)
 
     _nc_unlock_global(curses);
 
-    T((T_RETURN("%p"), oldSP));
+    T((T_RETURN("%p"), (void *) oldSP));
     return (oldSP);
 }
 
@@ -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;
@@ -136,7 +136,7 @@ delscreen(SCREEN *sp)
 {
     int i;
 
-    T((T_CALLED("delscreen(%p)"), sp));
+    T((T_CALLED("delscreen(%p)"), (void *) sp));
 
     _nc_lock_global(curses);
     if (delink_screen(sp)) {
@@ -154,9 +154,9 @@ delscreen(SCREEN *sp)
        }
 #endif
 
-       (void) _nc_freewin(sp->_curscr);
-       (void) _nc_freewin(sp->_newscr);
-       (void) _nc_freewin(sp->_stdscr);
+       (void) _nc_freewin(CurScreen(sp));
+       (void) _nc_freewin(NewScreen(sp));
+       (void) _nc_freewin(StdScreen(sp));
 
        if (sp->_slk != 0) {
            if (sp->_slk->ent != 0) {
@@ -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,39 +261,8 @@ extract_fgbg(char *src, int *result)
 }
 #endif
 
-#if NCURSES_SP_FUNCS
-/*
- * In case of handling multiple screens, we need to have a screen before
- * initialization in setupscreen takes place.  This is to extend the substitute
- * for some of the stuff in _nc_prescreen, especially for slk and ripoff
- * handling which should be done per screen.
- */
-NCURSES_EXPORT(SCREEN *)
-new_prescr(void)
-{
-    SCREEN *sp = _nc_alloc_screen_sp();
-    if (sp) {
-       sp->rsp = sp->rippedoff;
-       sp->_filtered = _nc_prescreen.filter_mode;
-       sp->_use_env = _nc_prescreen.use_env;
-#if NCURSES_NO_PADDING
-       sp->_no_padding = _nc_prescreen._no_padding;
-#endif
-       sp->slk_format = 0;
-       sp->_slk = 0;
-       sp->_prescreen = TRUE;
-       SP_PRE_INIT(sp);
-#if USE_REENTRANT
-       sp->_TABSIZE = _nc_prescreen._TABSIZE;
-       sp->_ESCDELAY = _nc_prescreen._ESCDELAY;
-#endif
-    }
-    return sp;
-}
-#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)
@@ -315,7 +273,7 @@ NCURSES_SP_NAME(_nc_setupscreen) (
                                     int slines,
                                     int scolumns,
                                     FILE *output,
-                                    bool filtered,
+                                    int filtered,
                                     int slk_format)
 {
     char *env;
@@ -327,7 +285,7 @@ NCURSES_SP_NAME(_nc_setupscreen) (
 #endif
 
     T((T_CALLED("_nc_setupscreen(%d, %d, %p, %d, %d)"),
-       slines, scolumns, output, filtered, slk_format));
+       slines, scolumns, (void *) output, filtered, slk_format));
 
     assert(CURRENT_SCREEN == 0);       /* has been reset in newterm() ! */
 
@@ -345,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;
 
@@ -359,7 +317,7 @@ NCURSES_SP_NAME(_nc_setupscreen) (
        returnCode(ERR);
     }
 
-    T(("created SP %p", SP));
+    T(("created SP %p", (void *) SP));
 
     sp = SP;                   /* fixup so SET_LINES and SET_COLS works */
     sp->_next_screen = _nc_screen_chain;
@@ -411,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);
 
@@ -616,6 +582,9 @@ NCURSES_SP_NAME(_nc_setupscreen) (
     NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG);
 #if USE_WIDEC_SUPPORT
     _nc_init_wacs();
+    if (_nc_wacs == 0) {
+       ReturnScreenError();
+    }
 
     sp->_screen_acs_fix = (_nc_unicode_locale()
                           && _nc_locale_breaks_acs(sp->_term));
@@ -633,27 +602,28 @@ NCURSES_SP_NAME(_nc_setupscreen) (
     sp->newhash = 0;
 
     T(("creating newscr"));
-    sp->_newscr = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
-                                          0, 0);
-    if (sp->_newscr == 0) {
+    NewScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
+                                            0, 0);
+    if (NewScreen(sp) == 0) {
        ReturnScreenError();
     }
     T(("creating curscr"));
-    sp->_curscr = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
-                                          0, 0);
-    if (sp->_curscr == 0) {
+    CurScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
+                                            0, 0);
+    if (CurScreen(sp) == 0) {
        ReturnScreenError();
     }
 #if !USE_REENTRANT
-    newscr = sp->_newscr;
-    curscr = sp->_curscr;
+    newscr = NewScreen(sp);
+    curscr = CurScreen(sp);
 #endif
 #if USE_SIZECHANGE
     sp->_resize = NCURSES_SP_NAME(resizeterm);
+    sp->_ungetch = safe_ungetch;
 #endif
 
-    sp->_newscr->_clear = TRUE;
-    sp->_curscr->_clear = FALSE;
+    NewScreen(sp)->_clear = TRUE;
+    CurScreen(sp)->_clear = FALSE;
 
     NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG);
     NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG);
@@ -667,9 +637,11 @@ NCURSES_SP_NAME(_nc_setupscreen) (
               We assume that we must simulate, if it is none of the standard
               formats (4-4 or 3-2-3) for which there may be some hardware
               support. */
-           if (rop->hook == _nc_slk_initialize)
-               if (!(NumLabels <= 0 || !SLK_STDFMT(slk_format)))
+           if (rop->hook == _nc_slk_initialize) {
+               if (!(NumLabels <= 0 || !SLK_STDFMT(slk_format))) {
                    continue;
+               }
+           }
            if (rop->hook) {
                int count;
                WINDOW *w;
@@ -692,11 +664,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 */
@@ -705,14 +678,14 @@ NCURSES_SP_NAME(_nc_setupscreen) (
 
     T(("creating stdscr"));
     assert((sp->_lines_avail + sp->_topstolen + bottom_stolen) == slines);
-    if ((sp->_stdscr = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
-                                               sp->_lines_avail,
-                                               scolumns, 0, 0)) == 0) {
+    if ((StdScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
+                                                 sp->_lines_avail,
+                                                 scolumns, 0, 0)) == 0) {
        ReturnScreenError();
     }
     SET_LINES(sp->_lines_avail);
 #if !USE_REENTRANT
-    stdscr = sp->_stdscr;
+    stdscr = StdScreen(sp);
 #endif
     sp->_prescreen = FALSE;
     returnCode(OK);
@@ -723,7 +696,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;
@@ -751,9 +724,12 @@ NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx
     int code = ERR;
 
     START_TRACE();
-    T((T_CALLED("ripoffline(%p,%d,%p)"), SP_PARM, line, init));
+    T((T_CALLED("ripoffline(%p,%d,%p)"), (void *) SP_PARM, line, init));
 
-    if (SP_PARM != 0 && SP_PARM->_prescreen) {
+#if NCURSES_SP_FUNCS
+    if (SP_PARM != 0 && SP_PARM->_prescreen)
+#endif
+    {
        if (line == 0) {
            code = OK;
        } else {
@@ -784,6 +760,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);