]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/tic.c
ncurses 6.1 - patch 20190323
[ncurses.git] / progs / tic.c
index 9efb4b034d16bb08154cd81590eb589974da4b55..713fc11abda8ef2d5e9a024d097553e30f0a4e09 100644 (file)
@@ -48,7 +48,7 @@
 #include <parametrized.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tic.c,v 1.266 2019/02/10 02:25:46 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.271 2019/03/17 00:46:55 tom Exp $")
 
 #define STDIN_NAME "<stdin>"
 
@@ -1095,6 +1095,50 @@ main(int argc, char *argv[])
 static void
 check_acs(TERMTYPE2 *tp)
 {
+    int vt100_smacs = 0;
+    int vt100_rmacs = 0;
+    int vt100_enacs = 0;
+
+    /*
+     * ena_acs is not always necessary, but if it is present, the enter/exit
+     * capabilities should be.
+     */
+    ANDMISSING(ena_acs, enter_alt_charset_mode);
+    ANDMISSING(ena_acs, exit_alt_charset_mode);
+    PAIRED(exit_alt_charset_mode, exit_alt_charset_mode);
+
+    /*
+     * vt100-like is frequently used, but perhaps ena_acs is missing, etc.
+     */
+    if (VALID_STRING(enter_alt_charset_mode)) {
+       vt100_smacs = (!strcmp("\033(0", enter_alt_charset_mode)
+                      ? 2
+                      : (!strcmp("\016", enter_alt_charset_mode)
+                         ? 1
+                         : 0));
+    }
+    if (VALID_STRING(exit_alt_charset_mode)) {
+       vt100_rmacs = (!strcmp("\033(B", exit_alt_charset_mode)
+                      ? 2
+                      : (!strcmp("\017", exit_alt_charset_mode)
+                         ? 1
+                         : 0));
+    }
+    if (VALID_STRING(ena_acs)) {
+       vt100_enacs = (!strcmp("\033(B\033)0", ena_acs)
+                      ? 2
+                      : 0);
+    }
+    if (vt100_rmacs && vt100_smacs && (vt100_rmacs != vt100_smacs)) {
+       _nc_warning("rmacs/smacs are inconsistent");
+    }
+    if ((vt100_rmacs == 2) && (vt100_smacs == 2) && vt100_enacs) {
+       _nc_warning("rmacs/smacs make enacs redundant");
+    }
+    if ((vt100_rmacs == 1) && (vt100_smacs == 1) && !vt100_enacs) {
+       _nc_warning("VT100-style rmacs/smacs require enacs");
+    }
+
     if (VALID_STRING(acs_chars)) {
        const char *boxes = "lmkjtuvwqxn";
        char mapped[256];
@@ -1788,56 +1832,16 @@ expected_params(const char *name)
     return result;
 }
 
-typedef struct {
-    const char *name;
-    int n_type;
-    int n_parms;
-} USERCAPS;
-
 /*
- * These are user-capabilities that happen to be used in ncurses' terminal
+ * Check for user-capabilities that happen to be used in ncurses' terminal
  * database.
  */
-static USERCAPS *
+static struct user_table_entry const *
 lookup_user_capability(const char *name)
 {
-    /* *INDENT-OFF* */
-#define DATA(name,type,parms) { name, type, parms }
-    static USERCAPS table[] = {
-       DATA( "AX",    BOOLEAN, 0 ),
-       DATA( "Cr",    STRING,  0 ),
-       DATA( "Cs",    STRING,  1 ),
-       DATA( "E0",    STRING,  0 ),
-       DATA( "E3",    STRING,  0 ),
-       DATA( "G0",    BOOLEAN, 0 ),
-       DATA( "Ms",    STRING,  2 ),
-       DATA( "RGB",   BOOLEAN, 0 ),    /* FIXME can be number or string */
-       DATA( "S0",    STRING,  1 ),
-       DATA( "Se",    STRING,  0 ),
-       DATA( "Smulx", STRING,  1 ),
-       DATA( "Ss",    STRING,  1 ),
-       DATA( "TS",    STRING,  0 ),
-       DATA( "U8",    NUMBER,  0 ),
-       DATA( "XM",    STRING,  1 ),
-       DATA( "XT",    BOOLEAN, 0 ),
-       DATA( "grbom", STRING,  0 ),
-       DATA( "gsbom", STRING,  0 ),
-       DATA( "rmxx",  STRING,  0 ),
-       DATA( "smxx",  STRING,  0 ),
-       DATA( "xm",    STRING,  9 ),
-    };
-#undef DATA
-    /* *INDENT-ON* */
-
-    size_t n;
-    USERCAPS *result = 0;
+    struct user_table_entry const *result = 0;
     if (*name != 'k') {
-       for (n = 0; n < SIZEOF(table); ++n) {
-           if (!strcmp(name, table[n].name)) {
-               result = &table[n];
-               break;
-           }
-       }
+       result = _nc_find_user_entry(name);
     }
     return result;
 }
@@ -1863,9 +1867,9 @@ is_user_capability(const char *name)
        name[2] == '\0') {
        result = (name[1] == '6') ? 2 : 0;
     } else if (using_extensions) {
-       USERCAPS *p = lookup_user_capability(name);
+       struct user_table_entry const *p = lookup_user_capability(name);
        if (p != 0) {
-           result = p->n_parms;
+           result = (int) p->ute_argc;
        }
     }
     return result;
@@ -2834,20 +2838,12 @@ name_of_type(int type)
 static void
 check_user_capability_type(const char *name, int actual)
 {
-    USERCAPS *p = lookup_user_capability(name);
-    if (p != 0) {
-       if (p->n_type != actual)
-           _nc_warning("expected %s to be %s, but actually %s",
-                       name,
-                       name_of_type(p->n_type),
-                       name_of_type(actual)
-               );
-    } else {
+    if (lookup_user_capability(name) == 0) {
        int expected = standard_type(name);
        if (expected >= 0) {
            _nc_warning("expected %s to be %s, but actually %s",
                        name,
-                       name_of_type(p->n_type),
+                       name_of_type(actual),
                        name_of_type(expected)
                );
        } else if (*name != 'k') {