ncurses 5.9 - patch 20121229
[ncurses.git] / ncurses / tinfo / lib_setup.c
index ff5857b3730990d33e767d4df9cc8e5aa44eace6..6e738e0f5a7dafaeb013557fb74e1839c5873ccf 100644 (file)
@@ -48,7 +48,7 @@
 #include <locale.h>
 #endif
 
-MODULE_ID("$Id: lib_setup.c,v 1.147 2012/07/14 23:59:26 tom Exp $")
+MODULE_ID("$Id: lib_setup.c,v 1.155 2012/12/15 19:04:54 tom Exp $")
 
 /****************************************************************************
  *
@@ -304,7 +304,7 @@ _nc_get_screensize(SCREEN *sp,
     *linep = (int) lines;
     *colp = (int) columns;
 
-    if (_nc_prescreen.use_env) {
+    if (_nc_prescreen.use_env || _nc_prescreen.use_tioctl) {
        int value;
 
 #ifdef __EMX__
@@ -340,33 +340,35 @@ _nc_get_screensize(SCREEN *sp,
        }
 #endif /* HAVE_SIZECHANGE */
 
-       if (_nc_prescreen.use_tioctl) {
+       if (_nc_prescreen.use_env) {
+           if (_nc_prescreen.use_tioctl) {
+               /*
+                * If environment variables are used, update them.
+                */
+               if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) {
+                   _nc_setenv_num("LINES", *linep);
+               }
+               if (_nc_getenv_num("COLUMNS") > 0) {
+                   _nc_setenv_num("COLUMNS", *colp);
+               }
+           }
+
            /*
-            * If environment variables are used, update them.
+            * Finally, look for environment variables.
+            *
+            * Solaris lets users override either dimension with an environment
+            * variable.
             */
-           if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) {
-               _nc_setenv_num("LINES", *linep);
+           if ((value = _nc_getenv_num("LINES")) > 0) {
+               *linep = value;
+               T(("screen size: environment LINES = %d", *linep));
            }
-           if (_nc_getenv_num("COLUMNS") > 0) {
-               _nc_setenv_num("COLUMNS", *colp);
+           if ((value = _nc_getenv_num("COLUMNS")) > 0) {
+               *colp = value;
+               T(("screen size: environment COLUMNS = %d", *colp));
            }
        }
 
-       /*
-        * Finally, look for environment variables.
-        *
-        * Solaris lets users override either dimension with an environment
-        * variable.
-        */
-       if ((value = _nc_getenv_num("LINES")) > 0) {
-           *linep = value;
-           T(("screen size: environment LINES = %d", *linep));
-       }
-       if ((value = _nc_getenv_num("COLUMNS")) > 0) {
-           *colp = value;
-           T(("screen size: environment COLUMNS = %d", *colp));
-       }
-
        /* if we can't get dynamic info about the size, use static */
        if (*linep <= 0) {
            *linep = (int) lines;
@@ -436,8 +438,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 != 0
-       && 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)) {
@@ -544,7 +545,9 @@ NCURSES_EXPORT(int)
 _nc_unicode_locale(void)
 {
     int result = 0;
-#if HAVE_LANGINFO_CODESET
+#if defined(__MINGW32__) && USE_WIDEC_SUPPORT
+    result = 1;
+#elif HAVE_LANGINFO_CODESET
     char *env = nl_langinfo(CODESET);
     result = !strcmp(env, "UTF-8");
     T(("_nc_unicode_locale(%s) ->%d", env, result));
@@ -632,7 +635,11 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
     if (tname == 0) {
        tname = getenv("TERM");
        if (tname == 0 || *tname == '\0') {
+#ifdef USE_TERM_DRIVER
+           tname = "unknown";
+#else
            ret_error0(TGETENT_ERR, "TERM environment variable not set.\n");
+#endif
        }
     }
 
@@ -675,6 +682,9 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
        && _nc_name_match(termp->type.term_names, tname, "|")) {
        T(("reusing existing terminal information and mode-settings"));
        code = OK;
+#ifdef USE_TERM_DRIVER
+       TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+#endif
     } else {
 #ifdef USE_TERM_DRIVER
        termp = (TERMINAL *) typeCalloc(TERMINAL_CONTROL_BLOCK, 1);
@@ -773,11 +783,14 @@ 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);
            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
@@ -834,7 +847,7 @@ _nc_setupterm(NCURSES_CONST char *tname,
              int reuse)
 {
     int res;
-    TERMINAL *termp;
+    TERMINAL *termp = 0;
     res = TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse);
     if (ERR != res)
        NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp);