X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Ftic.c;h=4caa6b59dea4da5b89923520362ecf89a96ce1ac;hp=49e0a1d8b77abff9bbf24f9764c7566e630a3c88;hb=493e2f7b3fc309879f561a094fdfc15e5304b3d6;hpb=d30f99439fcc8d4bb4c38e5c4afb4f6555fc6ad4 diff --git a/progs/tic.c b/progs/tic.c index 49e0a1d8..4caa6b59 100644 --- a/progs/tic.c +++ b/progs/tic.c @@ -49,7 +49,7 @@ #include #include -MODULE_ID("$Id: tic.c,v 1.294 2021/04/03 22:51:09 tom Exp $") +MODULE_ID("$Id: tic.c,v 1.301 2021/08/21 00:24:45 tom Exp $") #define STDIN_NAME "" @@ -116,8 +116,6 @@ free_namelist(char **src) static void cleanup(void) { - int rc; - #if NO_LEAKS free_namelist(namelst); _nc_leaks_dump_entry(); @@ -125,6 +123,8 @@ cleanup(void) if (tmp_fp != 0) fclose(tmp_fp); if (to_remove != 0) { + int rc; + #if HAVE_REMOVE rc = remove(to_remove); #else @@ -400,7 +400,7 @@ open_tempfile(char *filename) } #else if (tmpnam(filename) != 0) - result = fopen(filename, "w"); + result = safe_fopen(filename, "w"); #endif return result; } @@ -442,7 +442,7 @@ copy_input(FILE *source, const char *filename, char *alt_file) * the one that we were writing on before starting to read from the * second stream. */ - result = fopen(alt_file, "r+"); + result = safe_fopen(alt_file, "r+"); fclose(target); to_remove = strdup(alt_file); } @@ -458,7 +458,7 @@ open_input(const char *filename, char *alt_file) if (!strcmp(filename, "-")) { fp = copy_input(stdin, STDIN_NAME, alt_file); - } else if (stat(filename, &sb) < 0) { + } else if (stat(filename, &sb) == -1) { fprintf(stderr, "%s: %s %s\n", _nc_progname, filename, strerror(errno)); ExitProgram(EXIT_FAILURE); } else if ((mode = (sb.st_mode & S_IFMT)) == S_IFDIR @@ -466,7 +466,7 @@ open_input(const char *filename, char *alt_file) fprintf(stderr, "%s: %s is not a file\n", _nc_progname, filename); ExitProgram(EXIT_FAILURE); } else { - fp = fopen(filename, "r"); + fp = safe_fopen(filename, "r"); if (fp == 0) { fprintf(stderr, "%s: Can't open %s\n", _nc_progname, filename); @@ -1922,19 +1922,63 @@ is_user_capability(const char *name) return result; } +static bool +line_capability(const char *name) +{ + bool result = FALSE; + static const char *table[] = + { + "csr", /* change_scroll_region */ + "clear", /* clear_screen */ + "ed", /* clr_eos */ + "cwin", /* create_window */ + "cup", /* cursor_address */ + "cud1", /* cursor_down */ + "home", /* cursor_home */ + "mrcup", /* cursor_mem_address */ + "ll", /* cursor_to_ll */ + "cuu1", /* cursor_up */ + "dl1", /* delete_line */ + "hd", /* down_half_line */ + "flash", /* flash_screen */ + "ff", /* form_feed */ + "il1", /* insert_line */ + "nel", /* newline */ + "dl", /* parm_delete_line */ + "cud", /* parm_down_cursor */ + "indn", /* parm_index */ + "il", /* parm_insert_line */ + "rin", /* parm_rindex */ + "cuu", /* parm_up_cursor */ + "mc0", /* print_screen */ + "vpa", /* row_address */ + "ind", /* scroll_forward */ + "ri", /* scroll_reverse */ + "hu", /* up_half_line */ + }; + size_t n; + for (n = 0; n < SIZEOF(table); ++n) { + if (!strcmp(name, table[n])) { + result = TRUE; + break; + } + } + return result; +} + /* * Make a quick sanity check for the parameters which are used in the given * strings. If there are no "%p" tokens, then there should be no other "%" * markers. */ static void -check_params(TERMTYPE2 *tp, const char *name, char *value, int extended) +check_params(TERMTYPE2 *tp, const char *name, const char *value, int extended) { int expected = expected_params(name); int actual = 0; int n; bool params[1 + NUM_PARM]; - char *s = value; + const char *s = value; #ifdef set_top_margin_parm if (!strcmp(name, "smgbp") @@ -2000,10 +2044,11 @@ check_params(TERMTYPE2 *tp, const char *name, char *value, int extended) * may not have been fully translated. Also, tparm does its own analysis. * Report differences here. */ + _nc_reset_tparm(NULL); if (actual >= 0) { char *p_is_s[NUM_PARM]; int popcount; - int analyzed = _nc_tparm_analyze(value, p_is_s, &popcount); + int analyzed = _nc_tparm_analyze(NULL, value, p_is_s, &popcount); if (analyzed < popcount) { analyzed = popcount; } @@ -2021,54 +2066,34 @@ check_params(TERMTYPE2 *tp, const char *name, char *value, int extended) _nc_warning("tparm analyzed %d parameters for %s, expected %d", analyzed, name, actual); } + } else if (expected > 0 + && actual == expected + && guess_tparm_type(expected, p_is_s) == Numbers) { + int limit = 1; + + if (!strcmp(name, "setf") + || !strcmp(name, "setb") + || !strcmp(name, "setaf") + || !strcmp(name, "setab")) { + if ((limit = max_colors) > 256) + limit = 256; + } else if (line_capability(name)) { + limit = 24; + } else if (is_user_capability(name) < 0) { + limit = 80; + } + for (n = 0; n < limit; ++n) { + _nc_reset_tparm(NULL); + (void) TPARM_9(value, n, n, n, n, n, n, n, n, n); + if (_nc_tparm_err) + _nc_warning("problem%s in tparm(%s, %d, ...)", + (_nc_tparm_err == 1) ? "" : "s", + name, n); + } } } } -static bool -line_capability(const char *name) -{ - bool result = FALSE; - static const char *table[] = - { - "csr", /* change_scroll_region */ - "clear", /* clear_screen */ - "ed", /* clr_eos */ - "cwin", /* create_window */ - "cup", /* cursor_address */ - "cud1", /* cursor_down */ - "home", /* cursor_home */ - "mrcup", /* cursor_mem_address */ - "ll", /* cursor_to_ll */ - "cuu1", /* cursor_up */ - "dl1", /* delete_line */ - "hd", /* down_half_line */ - "flash", /* flash_screen */ - "ff", /* form_feed */ - "il1", /* insert_line */ - "nel", /* newline */ - "dl", /* parm_delete_line */ - "cud", /* parm_down_cursor */ - "indn", /* parm_index */ - "il", /* parm_insert_line */ - "rin", /* parm_rindex */ - "cuu", /* parm_up_cursor */ - "mc0", /* print_screen */ - "vpa", /* row_address */ - "ind", /* scroll_forward */ - "ri", /* scroll_reverse */ - "hu", /* up_half_line */ - }; - size_t n; - for (n = 0; n < SIZEOF(table); ++n) { - if (!strcmp(name, table[n])) { - result = TRUE; - break; - } - } - return result; -} - /* * Check for DEC VT100 private mode for reverse video. */ @@ -2206,8 +2231,9 @@ check_1_infotocap(const char *name, NCURSES_CONST char *value, int count) next += strlen(next) + 1; } + _nc_reset_tparm(NULL); expect = tparm_type(name); - nparam = _nc_tparm_analyze(value, p_is_s, &ignored); + nparam = _nc_tparm_analyze(NULL, value, p_is_s, &ignored); actual = guess_tparm_type(nparam, p_is_s); if (expect != actual) { @@ -2215,6 +2241,7 @@ check_1_infotocap(const char *name, NCURSES_CONST char *value, int count) actual = Other; } + _nc_reset_tparm(NULL); switch (actual) { case Num_Str: result = TPARM_2(value, numbers[1], strings[2]); @@ -2403,8 +2430,8 @@ check_infotocap(TERMTYPE2 *tp, int i, const char *value) || !strcmp(name, "setb") || !strcmp(name, "setaf") || !strcmp(name, "setab")) { - if ((limit = max_colors) > 16) - limit = 16; + if ((limit = max_colors) > 256) + limit = 256; } for (count = 0; count < limit; ++count) { char *ti_check = check_1_infotocap(name, ti_value, count); @@ -2683,11 +2710,11 @@ static void check_conflict(TERMTYPE2 *tp) { bool conflict = FALSE; - unsigned j, k; if (!(_nc_syntax == SYN_TERMCAP && capdump)) { char *check = calloc((size_t) (NUM_STRINGS(tp) + 1), sizeof(char)); NAME_VALUE *given = get_fkey_list(tp); + unsigned j, k; if (check == 0) failed("check_conflict");