X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Flib_setup.c;h=93a42a04a3aabc2f0188f0af5bdfd69c1c1e3cf7;hp=9467b7df6b3097a68003bb8a00214d7647de7536;hb=af3d0ee323cbb22d2a7596d564bf68f7307f5076;hpb=64f44b13d30e0a7bc2921a9d43755423f81564fd diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c index 9467b7df..93a42a04 100644 --- a/ncurses/tinfo/lib_setup.c +++ b/ncurses/tinfo/lib_setup.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright (c) 1998-2016,2017 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 * @@ -48,7 +48,7 @@ #include #endif -MODULE_ID("$Id: lib_setup.c,v 1.154 2012/12/08 22:01:26 tom Exp $") +MODULE_ID("$Id: lib_setup.c,v 1.182 2017/06/17 22:21:50 tom Exp $") /**************************************************************************** * @@ -98,7 +98,7 @@ MODULE_ID("$Id: lib_setup.c,v 1.154 2012/12/08 22:01:26 tom Exp $") * Reduce explicit use of "cur_term" global variable. */ #undef CUR -#define CUR termp->type. +#define CUR TerminalType(termp). /* * Wrap global variables in this module. @@ -115,12 +115,12 @@ NCURSES_PUBLIC_VAR(ttytype) (void) if (CURRENT_SCREEN) { TERMINAL *termp = TerminalOf(CURRENT_SCREEN); if (termp != 0) { - result = termp->type.term_names; + result = TerminalType(termp).term_names; } } #else if (cur_term != 0) { - result = cur_term->type.term_names; + result = TerminalType(cur_term).term_names; } #endif return result; @@ -220,9 +220,9 @@ _nc_handle_sigwinch(SCREEN *sp) NCURSES_EXPORT(void) NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f) { + START_TRACE(); T((T_CALLED("use_env(%p,%d)"), (void *) SP_PARM, (int) f)); #if NCURSES_SP_FUNCS - START_TRACE(); if (IsPreScreen(SP_PARM)) { SP_PARM->_use_env = f; } @@ -235,11 +235,11 @@ NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f) NCURSES_EXPORT(void) NCURSES_SP_NAME(use_tioctl) (NCURSES_SP_DCLx bool f) { + START_TRACE(); T((T_CALLED("use_tioctl(%p,%d)"), (void *) SP_PARM, (int) f)); #if NCURSES_SP_FUNCS - START_TRACE(); if (IsPreScreen(SP_PARM)) { - SP_PARM->_use_tioctl = f; + SP_PARM->use_tioctl = f; } #else _nc_prescreen.use_tioctl = f; @@ -251,8 +251,8 @@ NCURSES_SP_NAME(use_tioctl) (NCURSES_SP_DCLx bool f) NCURSES_EXPORT(void) use_env(bool f) { - T((T_CALLED("use_env(%d)"), (int) f)); START_TRACE(); + T((T_CALLED("use_env(%d)"), (int) f)); _nc_prescreen.use_env = f; returnVoid; } @@ -260,8 +260,8 @@ use_env(bool f) NCURSES_EXPORT(void) use_tioctl(bool f) { - T((T_CALLED("use_tioctl(%d)"), (int) f)); START_TRACE(); + T((T_CALLED("use_tioctl(%d)"), (int) f)); _nc_prescreen.use_tioctl = f; returnVoid; } @@ -270,7 +270,7 @@ use_tioctl(bool f) NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *sp, #ifdef USE_TERM_DRIVER - TERMINAL * termp, + TERMINAL *termp, #endif int *linep, int *colp) /* Obtain lines/columns values from the environment and/or terminfo entry */ @@ -283,7 +283,7 @@ _nc_get_screensize(SCREEN *sp, TCB = (TERMINAL_CONTROL_BLOCK *) termp; my_tabsize = TCB->info.tabsize; - TCB->drv->size(TCB, linep, colp); + TCB->drv->td_size(TCB, linep, colp); #if USE_REENTRANT if (sp != 0) { @@ -297,6 +297,8 @@ _nc_get_screensize(SCREEN *sp, #else /* !USE_TERM_DRIVER */ TERMINAL *termp = cur_term; int my_tabsize; + bool useEnv = _nc_prescreen.use_env; + bool useTioctl = _nc_prescreen.use_tioctl; /* figure out the size of the screen */ T(("screen size: terminfo lines = %d columns = %d", lines, columns)); @@ -304,9 +306,14 @@ _nc_get_screensize(SCREEN *sp, *linep = (int) lines; *colp = (int) columns; - if (_nc_prescreen.use_env || _nc_prescreen.use_tioctl) { - int value; +#if NCURSES_SP_FUNCS + if (sp) { + useEnv = sp->_use_env; + useTioctl = sp->use_tioctl; + } +#endif + if (useEnv || useTioctl) { #ifdef __EMX__ { int screendata[2]; @@ -321,7 +328,7 @@ _nc_get_screensize(SCREEN *sp, #endif #if HAVE_SIZECHANGE /* try asking the OS */ - if (isatty(cur_term->Filedes)) { + if (NC_ISATTY(cur_term->Filedes)) { STRUCT_WINSIZE size; errno = 0; @@ -340,8 +347,10 @@ _nc_get_screensize(SCREEN *sp, } #endif /* HAVE_SIZECHANGE */ - if (_nc_prescreen.use_env) { - if (_nc_prescreen.use_tioctl) { + if (useEnv) { + int value; + + if (useTioctl) { /* * If environment variables are used, update them. */ @@ -389,8 +398,14 @@ _nc_get_screensize(SCREEN *sp, * Put the derived values back in the screen-size caps, so * tigetnum() and tgetnum() will do the right thing. */ - lines = (short) (*linep); - columns = (short) (*colp); + lines = (NCURSES_INT2) (*linep); + columns = (NCURSES_INT2) (*colp); +#if NCURSES_EXT_NUMBERS +#define OldNumber(termp,name) \ + (termp)->type.Numbers[(&name - (termp)->type2.Numbers)] + OldNumber(termp, lines) = (short) (*linep); + OldNumber(termp, columns) = (short) (*colp); +#endif } T(("screen size is %dx%d", *linep, *colp)); @@ -423,7 +438,7 @@ _nc_update_screensize(SCREEN *sp) assert(sp != 0); - CallDriver_2(sp, getsize, &old_lines, &old_cols); + CallDriver_2(sp, td_getsize, &old_lines, &old_cols); #else TERMINAL *termp = cur_term; @@ -438,7 +453,7 @@ _nc_update_screensize(SCREEN *sp) * We're doing it this way because those functions belong to the upper * ncurses library, while this resides in the lower terminfo library. */ - if (sp->_resize != 0) { + if (sp != 0 && sp->_resize != 0) { if ((new_lines != old_lines) || (new_cols != old_cols)) { sp->_resize(NCURSES_SP_ARGx new_lines, new_cols); } else if (sp->_sig_winch && (sp->_ungetch != 0)) { @@ -455,16 +470,16 @@ _nc_update_screensize(SCREEN *sp) * ****************************************************************************/ -#if USE_DATABASE || USE_TERMCAP +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP /* * Return 1 if entry found, 0 if not found, -1 if database not accessible, * just like tgetent(). */ int -_nc_setup_tinfo(const char *const tn, TERMTYPE *const tp) +_nc_setup_tinfo(const char *const tn, TERMTYPE2 *const tp) { char filename[PATH_MAX]; - int status = _nc_read_entry(tn, filename, tp); + int status = _nc_read_entry2(tn, filename, tp); /* * If we have an entry, force all of the cancelled strings to null @@ -492,10 +507,8 @@ _nc_setup_tinfo(const char *const tn, TERMTYPE *const tp) ** and substitute it in for the prototype given in 'command_character'. */ void -_nc_tinfo_cmdch(TERMINAL * termp, int proto) +_nc_tinfo_cmdch(TERMINAL *termp, int proto) { - unsigned i; - char CC; char *tmp; /* @@ -504,7 +517,9 @@ _nc_tinfo_cmdch(TERMINAL * termp, int proto) * name as an environment variable - using the same symbol. */ if ((tmp = getenv("CC")) != 0 && strlen(tmp) == 1) { - CC = *tmp; + unsigned i; + char CC = *tmp; + for_each_string(i, &(termp->type)) { for (tmp = termp->type.Strings[i]; tmp && *tmp; tmp++) { if (UChar(*tmp) == proto) @@ -571,13 +586,14 @@ _nc_unicode_locale(void) * character set. */ NCURSES_EXPORT(int) -_nc_locale_breaks_acs(TERMINAL * termp) +_nc_locale_breaks_acs(TERMINAL *termp) { const char *env_name = "NCURSES_NO_UTF8_ACS"; - char *env; + const char *env; int value; int result = 0; + T((T_CALLED("_nc_locale_breaks_acs:%d"), result)); if (getenv(env_name) != 0) { result = _nc_getenv_num(env_name); } else if ((value = tigetnum("U8")) >= 0) { @@ -597,11 +613,11 @@ _nc_locale_breaks_acs(TERMINAL * termp) } } } - return result; + returnCode(result); } NCURSES_EXPORT(int) -TINFO_SETUP_TERM(TERMINAL ** tp, +TINFO_SETUP_TERM(TERMINAL **tp, NCURSES_CONST char *tname, int Filedes, int *errret, @@ -609,8 +625,6 @@ TINFO_SETUP_TERM(TERMINAL ** tp, { #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = 0; -#else - int status; #endif TERMINAL *termp; SCREEN *sp = 0; @@ -655,7 +669,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, * Allow output redirection. This is what SVr3 does. If stdout is * directed to a file, screen updates go to standard error. */ - if (Filedes == STDOUT_FILENO && !isatty(Filedes)) + if (Filedes == STDOUT_FILENO && !NC_ISATTY(Filedes)) Filedes = STDERR_FILENO; /* @@ -679,7 +693,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, && termp->Filedes == Filedes && termp->_termname != 0 && !strcmp(termp->_termname, tname) - && _nc_name_match(termp->type.term_names, tname, "|")) { + && _nc_name_match(TerminalType(termp).term_names, tname, "|")) { T(("reusing existing terminal information and mode-settings")); code = OK; #ifdef USE_TERM_DRIVER @@ -687,8 +701,12 @@ TINFO_SETUP_TERM(TERMINAL ** tp, #endif } else { #ifdef USE_TERM_DRIVER - termp = (TERMINAL *) typeCalloc(TERMINAL_CONTROL_BLOCK, 1); + TERMINAL_CONTROL_BLOCK *my_tcb; + my_tcb = typeCalloc(TERMINAL_CONTROL_BLOCK, 1); + termp = &(my_tcb->term); #else + int status; + termp = typeCalloc(TERMINAL, 1); #endif if (termp == 0) { @@ -703,22 +721,24 @@ TINFO_SETUP_TERM(TERMINAL ** tp, termp->Filedes = (short) Filedes; termp->_termname = strdup(tname); } else { - ret_error0(TGETENT_ERR, + _nc_free_termtype2(&TerminalType(termp)); + free(my_tcb); + ret_error0(errret ? *errret : TGETENT_ERR, "Could not find any driver to handle this terminal.\n"); } #else -#if USE_DATABASE || USE_TERMCAP - status = _nc_setup_tinfo(tname, &termp->type); +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP + status = _nc_setup_tinfo(tname, &TerminalType(termp)); #else status = TGETENT_NO; #endif /* try fallback list if entry on disk */ if (status != TGETENT_YES) { - const TERMTYPE *fallback = _nc_fallback(tname); + const TERMTYPE2 *fallback = _nc_fallback2(tname); if (fallback) { - _nc_copy_termtype(&(termp->type), fallback); + TerminalType(termp) = *fallback; status = TGETENT_YES; } } @@ -726,14 +746,18 @@ TINFO_SETUP_TERM(TERMINAL ** tp, if (status != TGETENT_YES) { del_curterm(termp); if (status == TGETENT_ERR) { + _nc_free_termtype2(&TerminalType(termp)); ret_error0(status, "terminals database is inaccessible\n"); } else if (status == TGETENT_NO) { + _nc_free_termtype2(&TerminalType(termp)); ret_error1(status, "unknown terminal type.\n", tname); } } +#if NCURSES_EXT_NUMBERS + _nc_export_termtype2(&termp->type, &TerminalType(termp)); +#endif #if !USE_REENTRANT - strncpy(ttytype, termp->type.term_names, (size_t) (NAMESIZE - 1)); - ttytype[NAMESIZE - 1] = '\0'; + save_ttytype(termp); #endif termp->Filedes = (short) Filedes; @@ -748,10 +772,11 @@ TINFO_SETUP_TERM(TERMINAL ** tp, * If an application calls setupterm() rather than initscr() or * newterm(), we will not have the def_prog_mode() call in * _nc_setupscreen(). Do it now anyway, so we can initialize the - * baudrate. + * baudrate. Also get the shell-mode so that erasechar() works. */ - if (isatty(Filedes)) { - def_prog_mode(); + if (NC_ISATTY(Filedes)) { + NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG); + NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG); baudrate(); } code = OK; @@ -761,7 +786,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, #ifdef USE_TERM_DRIVER *tp = termp; NCURSES_SP_NAME(set_curterm) (sp, termp); - TCB->drv->init(TCB); + TCB->drv->td_init(TCB); #else sp = SP; #endif @@ -783,14 +808,12 @@ TINFO_SETUP_TERM(TERMINAL ** tp, if ((VALID_STRING(cursor_address) || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home))) && VALID_STRING(clear_screen)) { - free(termp); ret_error1(TGETENT_YES, "terminal is not really generic.\n", tname); } else { - free(termp); + del_curterm(termp); ret_error1(TGETENT_NO, "I need something more specific.\n", tname); } } else if (hard_copy) { - free(termp); ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname); } #endif @@ -800,36 +823,36 @@ TINFO_SETUP_TERM(TERMINAL ** tp, #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. + * initialization in _nc_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) { - static SCREEN *sp; + SCREEN *sp; START_TRACE(); T((T_CALLED("new_prescr()"))); - if (sp == 0) { - sp = _nc_alloc_screen_sp(); - if (sp != 0) { - sp->rsp = sp->rippedoff; - sp->_filtered = _nc_prescreen.filter_mode; - sp->_use_env = _nc_prescreen.use_env; + sp = _nc_alloc_screen_sp(); + T(("_nc_alloc_screen_sp %p", (void *) sp)); + if (sp != 0) { + _nc_prescreen.allocated = 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; + sp->_no_padding = _nc_prescreen._no_padding; #endif - sp->slk_format = 0; - sp->_slk = 0; - sp->_prescreen = TRUE; - SP_PRE_INIT(sp); + 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; + sp->_TABSIZE = _nc_prescreen._TABSIZE; + sp->_ESCDELAY = _nc_prescreen._ESCDELAY; #endif - } } returnSP(sp); } @@ -864,5 +887,6 @@ _nc_setupterm(NCURSES_CONST char *tname, NCURSES_EXPORT(int) setupterm(NCURSES_CONST char *tname, int Filedes, int *errret) { + START_TRACE(); return _nc_setupterm(tname, Filedes, errret, FALSE); }