#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>"
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];
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;
}
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;
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') {