X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_set_term.c;h=c51d65b02644f1d21f533154d2b6578057d9dfd4;hp=3ed5e72431394834013eaf2e844680748c7eb8d1;hb=6a530b46563470c2ca73579d1994a0c8e275dd98;hpb=6c611e66965f5a8fb1a6696611f18441132852a2 diff --git a/ncurses/base/lib_set_term.c b/ncurses/base/lib_set_term.c index 3ed5e724..c51d65b0 100644 --- a/ncurses/base/lib_set_term.c +++ b/ncurses/base/lib_set_term.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright (c) 1998-2014,2015 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.143 2012/08/25 20:10:40 tom Exp $") +MODULE_ID("$Id: lib_set_term.c,v 1.152 2015/05/02 19:20:18 tom Exp $") #ifdef USE_TERM_DRIVER #define MaxColors InfoOf(sp).maxcolors @@ -190,6 +190,7 @@ delscreen(SCREEN *sp) NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx sp->_term); + FreeIfNeeded(sp->out_buffer); free(sp); /* @@ -206,6 +207,12 @@ delscreen(SCREEN *sp) COLOR_PAIRS = 0; #endif _nc_set_screen(0); +#if USE_WIDEC_SUPPORT + if (SP == 0) { + FreeIfNeeded(_nc_wacs); + _nc_wacs = 0; + } +#endif } } _nc_unlock_global(curses); @@ -242,13 +249,14 @@ no_mouse_wrap(SCREEN *sp GCC_UNUSED) } #if NCURSES_EXT_FUNCS && USE_COLORFGBG -static char * -extract_fgbg(char *src, int *result) +static const char * +extract_fgbg(const char *src, int *result) { - char *dst = 0; - long value = strtol(src, &dst, 0); + const char *dst = 0; + char *tmp = 0; + long value = strtol(src, &tmp, 0); - if (dst == 0) { + if ((dst = tmp) == 0) { dst = src; } else if (value >= 0) { *result = value; @@ -261,8 +269,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) @@ -351,7 +359,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( slines = 1; SET_LINES(slines); #ifdef USE_TERM_DRIVER - CallDriver(sp, setfilter); + CallDriver(sp, td_setfilter); #else clear_screen = 0; cursor_down = parm_down_cursor = 0; @@ -376,7 +384,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( fflush(output); sp->_ofd = output ? fileno(output) : -1; sp->_ofp = output; - sp->out_limit = (size_t) (slines * scolumns); + 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; @@ -442,7 +450,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( * decide later if it is worth having default attributes as well. */ if (getenv("COLORFGBG") != 0) { - char *p = getenv("COLORFGBG"); + const char *p = getenv("COLORFGBG"); TR(TRACE_CHARPUT | TRACE_MOVE, ("decoding COLORFGBG %s", p)); p = extract_fgbg(p, &(sp->_default_fg)); p = extract_fgbg(p, &(sp->_default_bg)); @@ -453,7 +461,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( if (sp->_default_fg >= MaxColors) { if (set_a_foreground != ABSENT_STRING && !strcmp(set_a_foreground, "\033[3%p1%dm")) { - set_a_foreground = "\033[3%?%p1%{8}%>%t9%e%p1%d%;m"; + set_a_foreground = strdup("\033[3%?%p1%{8}%>%t9%e%p1%d%;m"); } else { sp->_default_fg %= MaxColors; } @@ -461,7 +469,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( if (sp->_default_bg >= MaxColors) { if (set_a_background != ABSENT_STRING && !strcmp(set_a_background, "\033[4%p1%dm")) { - set_a_background = "\033[4%?%p1%{8}%>%t9%e%p1%d%;m"; + set_a_background = strdup("\033[4%?%p1%{8}%>%t9%e%p1%d%;m"); } else { sp->_default_bg %= MaxColors; } @@ -507,16 +515,7 @@ NCURSES_SP_NAME(_nc_setupscreen) ( if (magic_cookie_glitch > 0) { /* tvi, wyse */ - sp->_xmc_triggers = sp->_ok_attributes & ( - A_STANDOUT | - A_UNDERLINE | - A_REVERSE | - A_BLINK | - A_DIM | - A_BOLD | - A_INVIS | - A_PROTECT - ); + sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT; #if 0 /* * We "should" treat colors as an attribute. The wyse350 (and its @@ -581,9 +580,15 @@ NCURSES_SP_NAME(_nc_setupscreen) ( NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG); #if USE_WIDEC_SUPPORT - _nc_init_wacs(); + sp->_screen_unicode = _nc_unicode_locale(); + if (_nc_wacs == 0) { + _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();