X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Ftic.c;h=711ed11b9c40065c2de932da26d93b41a38b5ae0;hp=3545c3c92a9b401db68eceddf5f99477e3f6d8d4;hb=fe8c285d2a2770ee40523303dbf27a9fd8d01188;hpb=93ed44d781ca36f55021e0ad55f1ce33de62f7ba diff --git a/progs/tic.c b/progs/tic.c index 3545c3c9..711ed11b 100644 --- a/progs/tic.c +++ b/progs/tic.c @@ -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 #include -MODULE_ID("$Id: tic.c,v 1.244 2017/09/20 00:39:37 tom Exp $") +MODULE_ID("$Id: tic.c,v 1.256 2018/03/18 00:05:10 tom Exp $") #define STDIN_NAME "" @@ -674,8 +674,6 @@ add_digit(int *target, int source) *target = (*target * 10) + (source - '0'); } -#define VtoTrace(opt) (unsigned) ((opt > 0) ? opt : (opt == 0)) - int main(int argc, char *argv[]) { @@ -1131,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 */ @@ -1147,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"); @@ -1616,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; @@ -1637,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 { @@ -1656,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 @@ -1757,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; } @@ -1846,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 { @@ -1925,7 +1967,7 @@ skip_DECSCNM(const char *value, int *flag) } static void -check_delays(const char *name, const char *value) +check_delays(TERMTYPE2 *tp, const char *name, const char *value) { const char *p, *q; const char *first = 0; @@ -1975,6 +2017,14 @@ check_delays(const char *name, const char *value) _nc_warning("function-key %s has delay", name); } else if (proportional && !line_capability(name)) { _nc_warning("non-line capability using proportional delay: %s", name); + } else if (!xon_xoff && + !mandatory && + strchr(_nc_first_name(tp->term_names), '+') == 0) { + _nc_warning("%s in %s is used since no xon/xoff", + (proportional + ? "proportional delay" + : "delay"), + name); } } else { p = q - 1; /* restart scan */ @@ -2054,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))) @@ -2206,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); @@ -2222,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) { @@ -2699,11 +2752,11 @@ 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)); } - check_delays(ExtStrname(tp, (int) j, strnames), a); + check_delays(tp, ExtStrname(tp, (int) j, strnames), a); if (capdump) { check_infotocap(tp, (int) j, a); }