]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/tic.c
ncurses 5.9 - patch 20120901
[ncurses.git] / progs / tic.c
index 28e48738b300163108736e228551fd433c73ea38..ed77db9eb7721dc7392f0d11fbd89bbe986aee5e 100644 (file)
@@ -46,7 +46,7 @@
 #include <hashed_db.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tic.c,v 1.170 2012/04/21 19:59:53 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.177 2012/06/02 17:19:31 tom Exp $")
 
 #define STDIN_NAME "<stdin>"
 
@@ -1212,6 +1212,11 @@ check_cursor(TERMTYPE *tp)
     int count;
     char *list[4];
 
+    /* it is rare to have an insert-line feature without a matching delete */
+    ANDMISSING(parm_insert_line, insert_line);
+    ANDMISSING(parm_delete_line, delete_line);
+    ANDMISSING(parm_insert_line, parm_delete_line);
+
     /* if we have a parameterized form, then the non-parameterized is easy */
     ANDMISSING(parm_down_cursor, cursor_down);
     ANDMISSING(parm_up_cursor, cursor_up);
@@ -1385,6 +1390,12 @@ check_keypad(TERMTYPE *tp)
        if (*show != '\0')
            _nc_warning("vt100 keypad map incomplete:%s", show);
     }
+
+    /*
+     * These warnings are useful for consistency checks - it is possible that
+     * there are real terminals with mismatches in these 
+     */
+    ANDMISSING(key_ic, key_dc);
 }
 
 static void
@@ -1790,7 +1801,7 @@ static void
 show_where(unsigned level)
 {
     if (_nc_tracing >= DEBUG_LEVEL(level)) {
-       char my_name[256];
+       char my_name[MAX_NAME_SIZE];
        _nc_get_type(my_name);
        _tracef("\"%s\", line %d, '%s'",
                _nc_get_source(),
@@ -1802,6 +1813,55 @@ show_where(unsigned level)
 #define show_where(level)      /* nothing */
 #endif
 
+typedef struct {
+    int keycode;
+    const char *name;
+    const char *value;
+} NAME_VALUE;
+
+static NAME_VALUE *
+get_fkey_list(TERMTYPE *tp)
+{
+    NAME_VALUE *result = typeMalloc(NAME_VALUE, NUM_STRINGS(tp) + 1);
+    const struct tinfo_fkeys *all_fkeys = _nc_tinfo_fkeys;
+    int used = 0;
+    int j;
+
+    for (j = 0; all_fkeys[j].code; j++) {
+       char *a = tp->Strings[all_fkeys[j].offset];
+       if (VALID_STRING(a)) {
+           result[used].keycode = (int) all_fkeys[j].code;
+           result[used].name = strnames[all_fkeys[j].offset];
+           result[used].value = a;
+           ++used;
+       }
+    }
+#if NCURSES_XNAMES
+    for (j = STRCOUNT; j < NUM_STRINGS(tp); ++j) {
+       const char *name = ExtStrname(tp, j, strnames);
+       if (*name == 'k') {
+           result[used].keycode = -1;
+           result[used].name = name;
+           result[used].value = tp->Strings[j];
+           ++used;
+       }
+    }
+#endif
+    result[used].keycode = 0;
+    return result;
+}
+
+static void
+show_fkey_name(NAME_VALUE * data)
+{
+    if (data->keycode > 0) {
+       fprintf(stderr, " %s", keyname(data->keycode));
+       fprintf(stderr, " (capability \"%s\")", data->name);
+    } else {
+       fprintf(stderr, " capability \"%s\"", data->name);
+    }
+}
+
 /* other sanity-checks (things that we don't want in the normal
  * logic that reads a terminfo entry)
  */
@@ -1810,7 +1870,6 @@ check_termtype(TERMTYPE *tp, bool literal)
 {
     bool conflict = FALSE;
     unsigned j, k;
-    char fkeys[STRCOUNT];
 
     /*
      * A terminal entry may contain more than one keycode assigned to
@@ -1818,41 +1877,44 @@ check_termtype(TERMTYPE *tp, bool literal)
      * return one (the last one assigned).
      */
     if (!(_nc_syntax == SYN_TERMCAP && capdump)) {
-       memset(fkeys, 0, sizeof(fkeys));
-       for (j = 0; _nc_tinfo_fkeys[j].code; j++) {
-           char *a = tp->Strings[_nc_tinfo_fkeys[j].offset];
+       char *check = calloc((size_t) (NUM_STRINGS(tp) + 1), sizeof(char));
+       NAME_VALUE *given = get_fkey_list(tp);
+
+       for (j = 0; given[j].keycode; ++j) {
+           const char *a = given[j].value;
            bool first = TRUE;
-           if (!VALID_STRING(a))
-               continue;
-           for (k = j + 1; _nc_tinfo_fkeys[k].code; k++) {
-               char *b = tp->Strings[_nc_tinfo_fkeys[k].offset];
-               if (!VALID_STRING(b)
-                   || fkeys[k])
+
+           for (k = j + 1; given[k].keycode; k++) {
+               const char *b = given[k].value;
+               if (check[k])
                    continue;
                if (!_nc_capcmp(a, b)) {
-                   fkeys[j] = 1;
-                   fkeys[k] = 1;
+                   check[j] = 1;
+                   check[k] = 1;
                    if (first) {
                        if (!conflict) {
                            _nc_warning("Conflicting key definitions (using the last)");
                            conflict = TRUE;
                        }
-                       fprintf(stderr, "... %s is the same as %s",
-                               keyname((int) _nc_tinfo_fkeys[j].code),
-                               keyname((int) _nc_tinfo_fkeys[k].code));
+                       fprintf(stderr, "...");
+                       show_fkey_name(given + j);
+                       fprintf(stderr, " is the same as");
+                       show_fkey_name(given + k);
                        first = FALSE;
                    } else {
-                       fprintf(stderr, ", %s",
-                               keyname((int) _nc_tinfo_fkeys[k].code));
+                       fprintf(stderr, ", ");
+                       show_fkey_name(given + k);
                    }
                }
            }
            if (!first)
                fprintf(stderr, "\n");
        }
+       free(given);
+       free(check);
     }
 
-    for (j = 0; j < NUM_STRINGS(tp); j++) {
+    for_each_string(j, tp) {
        char *a = tp->Strings[j];
        if (VALID_STRING(a))
            check_params(tp, ExtStrname(tp, (int) j, strnames), a);