]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/lib_setup.c
ncurses 6.0 - patch 20170617
[ncurses.git] / ncurses / tinfo / lib_setup.c
index c32887d490daa94ca953d8eb4a76258547c6c8fc..93a42a04a3aabc2f0188f0af5bdfd69c1c1e3cf7 100644 (file)
@@ -48,7 +48,7 @@
 #include <locale.h>
 #endif
 
-MODULE_ID("$Id: lib_setup.c,v 1.173 2017/04/01 13:48:38 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.173 2017/04/01 13:48:38 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;
@@ -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 */
@@ -398,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));
@@ -470,10 +476,10 @@ _nc_update_screensize(SCREEN *sp)
  * 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
@@ -501,7 +507,7 @@ _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)
 {
     char *tmp;
 
@@ -580,7 +586,7 @@ _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";
     const char *env;
@@ -611,7 +617,7 @@ _nc_locale_breaks_acs(TERMINAL * termp)
 }
 
 NCURSES_EXPORT(int)
-TINFO_SETUP_TERM(TERMINAL ** tp,
+TINFO_SETUP_TERM(TERMINAL **tp,
                 NCURSES_CONST char *tname,
                 int Filedes,
                 int *errret,
@@ -687,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
@@ -715,22 +721,24 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
            termp->Filedes = (short) Filedes;
            termp->_termname = strdup(tname);
        } else {
+           _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 NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
-       status = _nc_setup_tinfo(tname, &termp->type);
+       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;
            }
        }
@@ -738,15 +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
-#define MY_SIZE (size_t) (NAMESIZE - 1)
-       _nc_STRNCPY(ttytype, termp->type.term_names, MY_SIZE);
-       ttytype[MY_SIZE] = '\0';
+       save_ttytype(termp);
 #endif
 
        termp->Filedes = (short) Filedes;
@@ -825,8 +836,9 @@ new_prescr(void)
     T((T_CALLED("new_prescr()")));
 
     sp = _nc_alloc_screen_sp();
-    T(("_nc_alloc_screen_sp %p", 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;