X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_set_term.c;h=83d0e7d01487a7954bb16e4f2b269828e2c12e64;hp=7429e2aa23ad9aa0cf2a16bca13ab944b5ace5ca;hb=91fa4688e82518794fcf0c32a36f3fcca5e4c2d5;hpb=3a0d9d27e0cf115ff9dcc6163c251bccaa62bd7d diff --git a/ncurses/base/lib_set_term.c b/ncurses/base/lib_set_term.c index 7429e2aa..83d0e7d0 100644 --- a/ncurses/base/lib_set_term.c +++ b/ncurses/base/lib_set_term.c @@ -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.129 2009/10/24 22:09:47 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 @@ -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 @@ -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; @@ -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; @@ -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; @@ -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)"), (void *) SP_PARM, line, (void *) 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);