]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/tic.c
ncurses 6.1 - patch 20191123
[ncurses.git] / progs / tic.c
index 65b5fb75aea8d338dda6e2f1817b4a58d289311b..c66a4ef4cdb93e97e82c8d2752c52043589193a6 100644 (file)
@@ -48,7 +48,7 @@
 #include <parametrized.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tic.c,v 1.272 2019/04/06 20:18:54 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.281 2019/11/09 18:51:36 tom Exp $")
 
 #define STDIN_NAME "<stdin>"
 
@@ -218,7 +218,8 @@ write_it(ENTRY * ep)
            while ((ch = *t++) != 0) {
                *d++ = (char) ch;
                if (ch == '\\') {
-                   *d++ = *t++;
+                   if ((*d++ = *t++) == '\0')
+                       break;
                } else if ((ch == '%')
                           && (*t == L_BRACE)) {
                    char *v = 0;
@@ -1024,10 +1025,14 @@ main(int argc, char *argv[])
                    if (!quiet) {
                        (void) fseek(tmp_fp, qp->cstart, SEEK_SET);
                        while (j-- > 0) {
-                           if (infodump)
-                               (void) putchar(fgetc(tmp_fp));
-                           else
-                               put_translate(fgetc(tmp_fp));
+                           int ch = fgetc(tmp_fp);
+                           if (ch == EOF || ferror(tmp_fp)) {
+                               break;
+                           } else if (infodump) {
+                               (void) putchar(ch);
+                           } else {
+                               put_translate(ch);
+                           }
                        }
                    }
 
@@ -1200,6 +1205,8 @@ same_color(NCURSES_CONST char *oldcap, NCURSES_CONST char *newcap, int limit)
 static void
 check_colors(TERMTYPE2 *tp)
 {
+    char *value;
+
     if ((max_colors > 0) != (max_pairs > 0)
        || ((max_colors > max_pairs) && (initialize_pair == 0)))
        _nc_warning("inconsistent values for max_colors (%d) and max_pairs (%d)",
@@ -1248,6 +1255,15 @@ check_colors(TERMTYPE2 *tp)
            _nc_warning("expected ccc because initc is given");
        }
     }
+    value = tigetstr("RGB");
+    if (VALID_STRING(value)) {
+       int r, g, b;
+       char bad;
+       int code = sscanf(value, "%d/%d/%d%c", &r, &g, &b, &bad);
+       if (code != 3 || r <= 0 || g <= 0 || b <= 0) {
+           _nc_warning("unexpected value for RGB capability: %s", value);
+       }
+    }
 }
 
 static int
@@ -1928,7 +1944,7 @@ check_params(TERMTYPE2 *tp, const char *name, char *value, int extended)
 #if NCURSES_XNAMES
     if (extended) {
        int check = is_user_capability(name);
-       if (check != actual) {
+       if (check != actual && (check >= 0 && actual >= 0)) {
            _nc_warning("extended %s capability has %d parameters, expected %d",
                        name, actual, check);
        } else if (debug_level > 1) {
@@ -1937,6 +1953,8 @@ check_params(TERMTYPE2 *tp, const char *name, char *value, int extended)
        }
        expected = actual;
     }
+#else
+    (void) extended;
 #endif
 
     if (params[0]) {
@@ -2316,8 +2334,7 @@ static void
 check_infotocap(TERMTYPE2 *tp, int i, const char *value)
 {
     const char *name = ExtStrname(tp, i, strnames);
-    int params = (((i < (int) SIZEOF(parametrized)) &&
-                  (i < STRCOUNT))
+    int params = ((i < (int) SIZEOF(parametrized))
                  ? parametrized[i]
                  : ((*value == 'k')
                     ? 0
@@ -2327,6 +2344,7 @@ check_infotocap(TERMTYPE2 *tp, int i, const char *value)
     char *tc_value;
     bool embedded;
 
+    assert(SIZEOF(parametrized) == STRCOUNT);
     if ((ti_value = _nc_tic_expand(value, TRUE, to_char)) == ABSENT_STRING) {
        _nc_warning("tic-expansion of %s failed", name);
     } else if ((tc_value = _nc_infotocap(name, ti_value, params)) == ABSENT_STRING) {
@@ -2917,6 +2935,12 @@ check_termtype(TERMTYPE2 *tp, bool literal)
     check_printer(tp);
     check_screen(tp);
 
+    /*
+     * These are probably both or none.
+     */
+    PAIRED(parm_index, parm_rindex);
+    PAIRED(parm_ich, parm_dch);
+
     /*
      * These may be mismatched because the terminal description relies on
      * restoring the cursor visibility by resetting it.
@@ -3032,7 +3056,7 @@ check_termtype(TERMTYPE2 *tp, bool literal)
      * ncurses handles it.
      */
     if ((PRESENT(enter_insert_mode) || PRESENT(exit_insert_mode))
-       && PRESENT(parm_ich)) {
+       && PRESENT(insert_character)) {
        _nc_warning("non-curses applications may be confused by ich1 with smir/rmir");
     }