ncurses 6.1 - patch 20190126
[ncurses.git] / progs / tic.c
index e89c477b68e534a8cffbc41962b3c00e3f8f9a8c..711ed11b9c40065c2de932da26d93b41a38b5ae0 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2016,2017 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2017,2018 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 <parametrized.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tic.c,v 1.247 2017/10/09 15:16:15 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.256 2018/03/18 00:05:10 tom Exp $")
 
 #define STDIN_NAME "<stdin>"
 
@@ -1129,6 +1129,27 @@ check_acs(TERMTYPE2 *tp)
     }
 }
 
+static bool
+same_color(NCURSES_CONST char *oldcap, NCURSES_CONST char *newcap, int limit)
+{
+    bool result = FALSE;
+    if (limit > 16)
+       limit = 16;
+    if (limit >= 8) {
+       int n;
+       int same;
+       for (n = same = 0; n < limit; ++n) {
+           char *oldvalue = strdup(TPARM_1(oldcap, n));
+           char *newvalue = strdup(TPARM_1(newcap, n));
+           same += !strcmp(oldvalue, newvalue);
+           free(oldvalue);
+           free(newvalue);
+       }
+       result = (same == limit);
+    }
+    return result;
+}
+
 /*
  * Check if the color capabilities are consistent
  */
@@ -1145,21 +1166,29 @@ check_colors(TERMTYPE2 *tp)
     PAIRED(set_color_pair, initialize_pair);
 
     if (VALID_STRING(set_foreground)
-       && VALID_STRING(set_a_foreground)
-       && !_nc_capcmp(set_foreground, set_a_foreground))
-       _nc_warning("expected setf/setaf to be different");
+       && VALID_STRING(set_a_foreground)) {
+       if (!_nc_capcmp(set_foreground, set_a_foreground)) {
+           _nc_warning("expected setf/setaf to be different");
+       } else if (same_color(set_foreground, set_a_foreground, max_colors)) {
+           _nc_warning("setf/setaf are equivalent");
+       }
+    }
 
     if (VALID_STRING(set_background)
-       && VALID_STRING(set_a_background)
-       && !_nc_capcmp(set_background, set_a_background))
-       _nc_warning("expected setb/setab to be different");
+       && VALID_STRING(set_a_background)) {
+       if (!_nc_capcmp(set_background, set_a_background)) {
+           _nc_warning("expected setb/setab to be different");
+       } else if (same_color(set_background, set_a_background, max_colors)) {
+           _nc_warning("setb/setab are equivalent");
+       }
+    }
 
     /* see: has_colors() */
     if (VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs)
-       && (((set_foreground != NULL)
-            && (set_background != NULL))
-           || ((set_a_foreground != NULL)
-               && (set_a_background != NULL))
+       && ((VALID_STRING(set_foreground)
+            && VALID_STRING(set_background))
+           || (VALID_STRING(set_a_foreground)
+               && VALID_STRING(set_a_background))
            || set_color_pair)) {
        if (!VALID_STRING(orig_pair) && !VALID_STRING(orig_colors))
            _nc_warning("expected either op/oc string for resetting colors");
@@ -1614,6 +1643,9 @@ check_screen(TERMTYPE2 *tp)
        bool have_kmouse = FALSE;
        bool use_sgr_39_49 = FALSE;
        char *name = _nc_first_name(tp->term_names);
+       bool is_screen = !strncmp(name, "screen", 6);
+       bool screen_base = (is_screen
+                           && strchr(name, '.') == 0);
 
        if (!VALID_BOOLEAN(have_bce)) {
            have_bce = FALSE;
@@ -1635,12 +1667,10 @@ check_screen(TERMTYPE2 *tp)
 
        if (have_XM && have_XT) {
            _nc_warning("Screen's XT capability conflicts with XM");
-       } else if (have_XT
-                  && strstr(name, "screen") != 0
-                  && strchr(name, '.') != 0) {
+       } else if (have_XT && screen_base) {
            _nc_warning("Screen's \"screen\" entries should not have XT set");
        } else if (have_XT) {
-           if (!have_kmouse && have_bce) {
+           if (!have_kmouse && is_screen) {
                if (VALID_STRING(key_mouse)) {
                    _nc_warning("Value of kmous inconsistent with screen's usage");
                } else {
@@ -1654,8 +1684,11 @@ check_screen(TERMTYPE2 *tp)
            if (VALID_STRING(to_status_line))
                _nc_warning("\"tsl\" capability is redundant, given XT");
        } else {
-           if (have_kmouse && !have_XM)
+           if (have_kmouse
+               && !have_XM
+               && !screen_base && strchr(name, '+') == 0) {
                _nc_warning("Expected XT to be set, given kmous");
+           }
        }
     }
 #endif
@@ -1755,14 +1788,22 @@ expected_params(const char *name)
     return result;
 }
 
+/*
+ * ncurses assumes that u6 could be used for getting the cursor-position, but
+ * that is not implemented.  Make a special case for that, to quiet needless
+ * warnings.
+ *
+ * There are other string-capability extensions (see terminfo.src) which could
+ * have parameters such as "Ss", "%u", but are not used by ncurses.
+ */
 static int
 is_user_capability(const char *name)
 {
-    int result = 0;
+    int result = -1;
     if (name[0] == 'u' &&
        (name[1] >= '0' && name[1] <= '9') &&
        name[2] == '\0')
-       result = 1;
+       result = (name[1] == '6') ? 2 : 0;
     return result;
 }
 
@@ -1844,7 +1885,10 @@ check_params(TERMTYPE2 *tp, const char *name, char *value, int extended)
            analyzed = popcount;
        }
        if (actual != analyzed && expected != analyzed) {
-           if (is_user_capability(name)) {
+           int user_cap = is_user_capability(name);
+           if ((user_cap == analyzed) && using_extensions) {
+               ;               /* ignore */
+           } else if (user_cap >= 0) {
                _nc_warning("tparm will use %d parameters for %s",
                            analyzed, name);
            } else {
@@ -2060,7 +2104,7 @@ check_1_infotocap(const char *name, NCURSES_CONST char *value, int count)
                         myParam(9));
        break;
     }
-    return result;
+    return strdup(result);
 }
 
 #define IsDelay(ch) ((ch) == '.' || isdigit(UChar(ch)))
@@ -2212,7 +2256,8 @@ check_infotocap(TERMTYPE2 *tp, int i, const char *value)
            || !strcmp(name, "setb")
            || !strcmp(name, "setaf")
            || !strcmp(name, "setab")) {
-           limit = max_colors;
+           if ((limit = max_colors) > 16)
+               limit = 16;
        }
        for (count = 0; count < limit; ++count) {
            char *ti_check = check_1_infotocap(name, ti_value, count);
@@ -2228,6 +2273,8 @@ check_infotocap(TERMTYPE2 *tp, int i, const char *value)
                _nc_warning("tparm-conversion of %s(%d) differs between\n\tterminfo %s\n\ttermcap  %s",
                            name, count, ti_check, tc_check);
            }
+           free(ti_check);
+           free(tc_check);
        }
     } else if (params == 0 && !same_ti_tc(ti_value, tc_value, &embedded)) {
        if (embedded) {
@@ -2705,7 +2752,7 @@ check_termtype(TERMTYPE2 *tp, bool literal)
             * check for consistent number of parameters.
             */
            if (j >= SIZEOF(parametrized) ||
-               is_user_capability(name) ||
+               is_user_capability(name) > 0 ||
                parametrized[j] > 0) {
                check_params(tp, name, a, (j >= STRCOUNT));
            }