diff options
Diffstat (limited to 'progs/tic.c')
| -rw-r--r-- | progs/tic.c | 183 |
1 files changed, 92 insertions, 91 deletions
diff --git a/progs/tic.c b/progs/tic.c index fc77b34445ff..51a5eea44a40 100644 --- a/progs/tic.c +++ b/progs/tic.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2018-2024,2025 Thomas E. Dickey * * Copyright 1998-2017,2018 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * @@ -49,7 +49,7 @@ #include <parametrized.h> #include <transform.h> -MODULE_ID("$Id: tic.c,v 1.325 2024/03/02 19:33:22 tom Exp $") +MODULE_ID("$Id: tic.c,v 1.334 2025/12/25 21:27:48 tom Exp $") #define STDIN_NAME "<stdin>" @@ -61,7 +61,7 @@ static bool capdump = FALSE; /* running as infotocap? */ static bool infodump = FALSE; /* running as captoinfo? */ static bool showsummary = FALSE; static unsigned debug_level; -static char **namelst = 0; +static char **namelst = NULL; static const char *to_remove; #if NCURSES_XNAMES @@ -104,9 +104,9 @@ source-file\n"; static void free_namelist(char **src) { - if (src != 0) { + if (src != NULL) { int n; - for (n = 0; src[n] != 0; ++n) + for (n = 0; src[n] != NULL; ++n) free(src[n]); free(src); } @@ -120,9 +120,9 @@ cleanup(void) free_namelist(namelst); _nc_leaks_dump_entry(); #endif - if (tmp_fp != 0) + if (tmp_fp != NULL) fclose(tmp_fp); - if (to_remove != 0) { + if (to_remove != NULL) { int rc; #if HAVE_REMOVE @@ -203,7 +203,8 @@ write_it(ENTRY * ep) { unsigned n; int ch; - char *s, *d, *t; + char *s, *d; + const char *t; char result[MAX_ENTRY_SIZE]; /* @@ -213,7 +214,7 @@ write_it(ENTRY * ep) for (n = 0; n < STRCOUNT; n++) { s = ep->tterm.Strings[n]; if (VALID_STRING(s) - && strchr(s, L_BRACE) != 0) { + && strchr(s, L_BRACE) != NULL) { d = result; t = s; while ((ch = *t++) != 0) { @@ -223,14 +224,14 @@ write_it(ENTRY * ep) break; } else if ((ch == '%') && (*t == L_BRACE)) { - char *v = 0; + char *v = NULL; long value = strtol(t + 1, &v, 0); - if (v != 0 + if (v != NULL && *v == R_BRACE && value > 0 && value != '\\' /* FIXME */ && value < 127 - && isprint((int) value)) { + && isprint(UChar(value))) { *d++ = S_QUOTE; *d++ = (char) value; *d++ = S_QUOTE; @@ -333,14 +334,14 @@ put_translate(int c) in_name = FALSE; suffix[0] = '\0'; - if ((up = strchr(namebuf, '#')) != 0 - || (up = strchr(namebuf, '=')) != 0 - || ((up = strchr(namebuf, '@')) != 0 && up[1] == '>')) { + if ((up = strchr(namebuf, '#')) != NULL + || (up = strchr(namebuf, '=')) != NULL + || ((up = strchr(namebuf, '@')) != NULL && up[1] == '>')) { _nc_STRCPY(suffix, up, have); *up = '\0'; } - if ((tp = nametrans(namebuf)) != 0) { + if ((tp = nametrans(namebuf)) != NULL) { (void) putchar(':'); (void) fputs(tp, stdout); (void) fputs(suffix, stdout); @@ -367,7 +368,7 @@ put_translate(int c) static char * stripped(char *src) { - char *dst = 0; + char *dst = NULL; while (isspace(UChar(*src))) src++; @@ -387,7 +388,7 @@ stripped(char *src) static FILE * open_tempfile(char *filename) { - FILE *result = 0; + FILE *result = NULL; _nc_STRCPY(filename, "/tmp/XXXXXX", PATH_MAX); #if HAVE_MKSTEMP @@ -409,9 +410,8 @@ static FILE * copy_input(FILE *source, const char *filename, char *alt_file) { char my_altfile[PATH_MAX]; - FILE *result = 0; + FILE *result = NULL; FILE *target; - int ch; if (alt_file == NULL) alt_file = my_altfile; @@ -423,7 +423,7 @@ copy_input(FILE *source, const char *filename, char *alt_file) } else { clearerr(source); for (;;) { - ch = fgetc(source); + int ch = fgetc(source); if (feof(source)) { break; } else if (ferror(source)) { @@ -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) == -1) { + } else if (!_nc_is_path_found(filename, &sb)) { fprintf(stderr, "%s: cannot open '%s': %s\n", _nc_progname, filename, strerror(errno)); ExitProgram(EXIT_FAILURE); @@ -476,7 +476,7 @@ open_input(const char *filename, char *alt_file) ExitProgram(EXIT_FAILURE); } if (mode != S_IFREG) { - if (alt_file != 0) { + if (alt_file != NULL) { FILE *fp2 = copy_input(fp, filename, alt_file); fp = fp2; } else { @@ -493,7 +493,7 @@ open_input(const char *filename, char *alt_file) static char ** make_namelist(char *src) { - char **dst = 0; + char **dst = NULL; char *s, *base; unsigned pass, n, nn; @@ -501,14 +501,14 @@ make_namelist(char *src) if (src == NULL) { /* EMPTY */ ; - } else if (strchr(src, '/') != 0) { /* a filename */ + } else if (strchr(src, '/') != NULL) { /* a filename */ FILE *fp = open_input(src, (char *) 0); for (pass = 1; pass <= 2; pass++) { nn = 0; - while (fgets(buffer, sizeof(buffer), fp) != 0) { - if ((s = stripped(buffer)) != 0) { - if (dst != 0) + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + if ((s = stripped(buffer)) != NULL) { + if (dst != NULL) dst[nn] = s; else free(s); @@ -517,8 +517,10 @@ make_namelist(char *src) } if (pass == 1) { if ((dst = typeCalloc(char *, nn + 1)) == NULL) - failed("make_namelist"); + failed("make_namelist (alloc)"); rewind(fp); + if (errno != 0) + failed("make_namelist (rewind)"); } } fclose(fp); @@ -531,7 +533,7 @@ make_namelist(char *src) nn++; } else { src[n] = '\0'; - if ((s = stripped(base)) != 0) + if ((s = stripped(base)) != NULL) dst[nn++] = s; base = &src[n + 1]; } @@ -545,9 +547,9 @@ make_namelist(char *src) } } } - if (showsummary && (dst != 0)) { + if (showsummary && (dst != NULL)) { fprintf(log_fp, "Entries that will be compiled:\n"); - for (n = 0; dst[n] != 0; n++) + for (n = 0; dst[n] != NULL; n++) fprintf(log_fp, "%u:%s\n", n + 1, dst[n]); } return dst; @@ -559,10 +561,10 @@ matches(char **needle, const char *haystack) { bool code = FALSE; - if (needle != 0) { + if (needle != NULL) { size_t n; - for (n = 0; needle[n] != 0; n++) { + for (n = 0; needle[n] != NULL; n++) { if (_nc_name_match(haystack, needle[n], "|")) { code = TRUE; break; @@ -593,20 +595,20 @@ valid_db_path(const char *nominal) #endif DEBUG(1, ("** stat(%s)", result)); - if (stat(result, &sb) >= 0) { + if (_nc_is_path_found(result, &sb)) { #if USE_HASHED_DB if (!S_ISREG(sb.st_mode) - || access(result, R_OK | W_OK) != 0) { + || _nc_access(result, R_OK | W_OK) != 0) { DEBUG(1, ("...not a writable file")); free(result); - result = 0; + result = NULL; } #else if (!S_ISDIR(sb.st_mode) - || access(result, R_OK | W_OK | X_OK) != 0) { + || _nc_access(result, R_OK | W_OK | X_OK) != 0) { DEBUG(1, ("...not a writable directory")); free(result); - result = 0; + result = NULL; } #endif } else { @@ -617,19 +619,19 @@ valid_db_path(const char *nominal) if (leaf) { char save = result[leaf]; result[leaf] = 0; - if (stat(result, &sb) >= 0 + if (_nc_is_path_found(result, &sb) && S_ISDIR(sb.st_mode) && access(result, R_OK | W_OK | X_OK) == 0) { result[leaf] = save; } else { DEBUG(1, ("...parent directory %s is not writable", result)); free(result); - result = 0; + result = NULL; } } else { DEBUG(1, ("... no parent directory")); free(result); - result = 0; + result = NULL; } } return result; @@ -643,22 +645,22 @@ valid_db_path(const char *nominal) static void show_databases(const char *outdir) { - bool specific = (outdir != 0) || getenv("TERMINFO") != 0; + bool specific = (outdir != NULL) || getenv("TERMINFO") != NULL; char *result; - const char *tried = 0; + const char *tried = NULL; if (outdir == NULL) { outdir = _nc_tic_dir(NULL); } - if ((result = valid_db_path(outdir)) != 0) { + if ((result = valid_db_path(outdir)) != NULL) { printf("%s\n", result); free(result); } else { tried = outdir; } - if ((outdir = _nc_home_terminfo())) { - if ((result = valid_db_path(outdir)) != 0) { + if ((outdir = _nc_home_terminfo()) != NULL) { + if ((result = valid_db_path(outdir)) != NULL) { printf("%s\n", result); free(result); } else if (!specific) { @@ -922,13 +924,13 @@ main(int argc, char *argv[]) if (infodump == TRUE) { /* captoinfo's no-argument case */ source_file = "/etc/termcap"; - if ((termcap = getenv("TERMCAP")) != 0 - && (namelst = make_namelist(getenv("TERM"))) != 0) { + if ((termcap = getenv("TERMCAP")) != NULL + && (namelst = make_namelist(getenv("TERM"))) != NULL) { if (access(termcap, F_OK) == 0) { /* file exists */ source_file = termcap; } else { - if ((tmp_fp = open_tempfile(my_tmpname)) != 0) { + if ((tmp_fp = open_tempfile(my_tmpname)) != NULL) { source_file = my_tmpname; fprintf(tmp_fp, "%s\n", termcap); fclose(tmp_fp); @@ -1119,7 +1121,7 @@ main(int argc, char *argv[]) * Check if the alternate character-set capabilities are consistent. */ static void -check_acs(TERMTYPE2 *tp) +check_acs(const TERMTYPE2 *tp) { int vt100_smacs = 0; int vt100_rmacs = 0; @@ -1332,8 +1334,8 @@ keypad_index(const char *string) if ((ch = keypad_final(string)) != '\0') { const char *list = "PQRSwxymtuvlqrsPpn"; /* app-keypad except "Enter" */ - char *test = (strchr) (list, ch); - if (test != 0) + const char *test = (strchr) (list, ch); + if (test != NULL) result = (long) (test - list); } return result; @@ -1363,7 +1365,7 @@ check_ansi_cursor(char *list[4]) } } if (!repeated) { - char *up = list[1]; + const char *up = list[1]; size_t prefix = (size_t) csi_length(up); size_t suffix; @@ -1410,7 +1412,7 @@ check_ansi_cursor(char *list[4]) #define UNEXPECTED(name) if (PRESENT(name)) _nc_warning("unexpected " #name ", for %s", why) static void -check_noaddress(TERMTYPE2 *tp, const char *why) +check_noaddress(const TERMTYPE2 *tp, const char *why) { UNEXPECTED(column_address); UNEXPECTED(cursor_address); @@ -1541,7 +1543,7 @@ check_cursor(TERMTYPE2 *tp) * is mapped inconsistently. */ static void -check_keypad(TERMTYPE2 *tp) +check_keypad(const TERMTYPE2 *tp) { char show[80]; @@ -1710,8 +1712,8 @@ check_printer(TERMTYPE2 *tp) static bool uses_SGR_39_49(const char *value) { - return (strstr(value, "39;49") != 0 - || strstr(value, "49;39") != 0); + return (strstr(value, "39;49") != NULL + || strstr(value, "49;39") != NULL); } /* @@ -1727,7 +1729,7 @@ check_screen(TERMTYPE2 *tp) bool have_kmouse = FALSE; bool use_sgr_39_49 = FALSE; const char *name_39_49 = "orig_pair or orig_colors"; - char *name = _nc_first_name(tp->term_names); + const char *name = _nc_first_name(tp->term_names); bool is_screen = !strncmp(name, "screen", 6); bool screen_base = (is_screen && strchr(name, '.') == NULL); @@ -1895,7 +1897,7 @@ expected_params(const char *name) static struct user_table_entry const * lookup_user_capability(const char *name) { - struct user_table_entry const *result = 0; + struct user_table_entry const *result = NULL; if (*name != 'k') { result = _nc_find_user_entry(name); } @@ -1927,7 +1929,7 @@ is_user_capability(const char *name) #if NCURSES_XNAMES else if (using_extensions) { struct user_table_entry const *p = lookup_user_capability(name); - if (p != 0) { + if (p != NULL) { result = (int) p->ute_argc; } } @@ -1985,7 +1987,7 @@ line_capability(const char *name) * markers. */ static void -check_params(TERMTYPE2 *tp, const char *name, const char *value, int extended) +check_params(const TERMTYPE2 *tp, const char *name, const char *value, int extended) { int expected = expected_params(name); int actual = 0; @@ -2023,7 +2025,7 @@ check_params(TERMTYPE2 *tp, const char *name, const char *value, int extended) _nc_warning("expected character after %% in %s", name); break; } else if (*s == 'p') { - if (*++s == '\0' || !isdigit((int) *s)) { + if (*++s == '\0' || !isdigit(UChar(*s))) { _nc_warning("expected digit after %%p in %s", name); return; } else { @@ -2132,7 +2134,7 @@ static const char * skip_DECSCNM(const char *value, int *flag) { *flag = -1; - if (value != 0) { + if (value != NULL) { int skip = csi_length(value); if (skip > 0 && value[skip++] == '?' && @@ -2149,16 +2151,16 @@ skip_DECSCNM(const char *value, int *flag) } static void -check_delays(TERMTYPE2 *tp, const char *name, const char *value) +check_delays(const TERMTYPE2 *tp, const char *name, const char *value) { const char *p, *q; - const char *first = 0; - const char *last = 0; + const char *first = NULL; + const char *last = NULL; for (p = value; *p != '\0'; ++p) { if (p[0] == '$' && p[1] == '<') { const char *base = p + 2; - const char *mark = 0; + const char *mark = NULL; bool mixed = FALSE; int proportional = 0; int mandatory = 0; @@ -2177,7 +2179,7 @@ check_delays(TERMTYPE2 *tp, const char *name, const char *value) ++mandatory; if (mark == NULL) mark = q; - } else if (!(isalnum(UChar(*q)) || strchr("+-.", *q) != 0)) { + } else if (!(isalnum(UChar(*q)) || strchr("+-.", *q) != NULL)) { break; } else if (proportional || mandatory) { mixed = TRUE; @@ -2213,7 +2215,7 @@ check_delays(TERMTYPE2 *tp, const char *name, const char *value) if (!strcmp(name, "flash") || !strcmp(name, "beep")) { - if (first != 0) { + if (first != NULL) { if (first == value || *last == 0) { /* * Delay is on one end or the other. @@ -2227,9 +2229,9 @@ check_delays(TERMTYPE2 *tp, const char *name, const char *value) * Check for missing delay when using VT100 reverse-video. * A real VT100 might not need this, but terminal emulators do. */ - if ((p = skip_DECSCNM(value, &flag)) != 0 && + if ((p = skip_DECSCNM(value, &flag)) != NULL && flag > 0 && - skip_DECSCNM(p, &flag) != 0 && + skip_DECSCNM(p, &flag) != NULL && flag == 0) { _nc_warning("expected a delay in %s", name); } @@ -2302,7 +2304,7 @@ check_1_infotocap(const char *name, NCURSES_CONST char *value, int count) break; case Other: default: -#define myParam(n) (p_is_s[n - 1] != 0 ? ((TPARM_ARG) strings[n]) : numbers[n]) +#define myParam(n) (p_is_s[n - 1] != NULL ? ((TPARM_ARG) strings[n]) : numbers[n]) result = TPARM_9(value, myParam(1), myParam(2), @@ -2575,7 +2577,7 @@ static bool similar_sgr(int num, char *a, char *b) { char *base_a = a; - char *base_b = b; + const char *base_b = b; int delaying = 0; while (*b != 0) { @@ -2631,7 +2633,7 @@ check_tparm_err(int num) } static char * -check_sgr(TERMTYPE2 *tp, char *zero, int num, char *cap, const char *name) +check_sgr(const TERMTYPE2 *tp, const char *zero, int num, char *cap, const char *name) { char *test; @@ -2646,7 +2648,7 @@ check_sgr(TERMTYPE2 *tp, char *zero, int num, char *cap, const char *name) num == 7, num == 8, num == 9); - if (test != 0) { + if (test != NULL) { if (PRESENT(cap)) { if (!similar_sgr(num, test, cap)) { _nc_warning("%s differs from sgr(%d)\n\t%s=%s\n\tsgr(%d)=%s", @@ -2731,7 +2733,7 @@ get_fkey_list(TERMTYPE2 *tp) } static void -show_fkey_name(NAME_VALUE * data) +show_fkey_name(const NAME_VALUE * data) { if (data->keycode > 0) { fprintf(stderr, " %s", keyname(data->keycode)); @@ -2866,7 +2868,7 @@ check_conflict(TERMTYPE2 *tp) static void check_exit_attribute(const char *name, char *test, char *trimmed, char *untrimmed) { - if (VALID_STRING(test) && (trimmed != 0)) { + if (VALID_STRING(test) && (trimmed != NULL)) { if (similar_sgr(-1, trimmed, test) || similar_sgr(-1, untrimmed, test)) { _nc_warning("%s matches exit_attribute_mode", name); @@ -2909,7 +2911,7 @@ is_sgr_string(char *value) * Check if the given capability contains a given SGR attribute. */ static void -check_sgr_param(TERMTYPE2 *tp, int code, const char *name, char *value) +check_sgr_param(TERMTYPE2 *tp, int code, const char *name, const char *const value) { if (VALID_STRING(value)) { int ncv = ((code != 0) ? (1 << (code - 1)) : 0); @@ -2961,7 +2963,7 @@ standard_type(const char *name) int result = -1; const struct name_table_entry *np; - if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) { + if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != NULL) { result = np->nte_type; } return result; @@ -2988,7 +2990,7 @@ name_of_type(int type) static void check_user_capability_type(const char *name, int actual) { - if (lookup_user_capability(name) == 0) { + if (lookup_user_capability(name) == NULL) { int expected = standard_type(name); if (expected >= 0) { _nc_warning("expected %s to be %s, but actually %s", @@ -3111,7 +3113,7 @@ isValidEscape(const char *value, const char *expect) } static int -guess_ANSI_VTxx(TERMTYPE2 *tp) +guess_ANSI_VTxx(const TERMTYPE2 *tp) { int result = -1; int checks = 0; @@ -3151,10 +3153,10 @@ guess_ANSI_VTxx(TERMTYPE2 *tp) */ #if defined(user6) && defined(user7) && defined(user8) && defined(user9) static void -check_user_6789(TERMTYPE2 *tp) +check_user_6789(const TERMTYPE2 *tp) { /* - * Check if the terminal is known to not + * Check if the terminal is known to not */ #define NO_QUERY(longname,shortname) \ if (PRESENT(longname)) _nc_warning(#shortname " is not supported") @@ -3200,7 +3202,7 @@ check_termtype(TERMTYPE2 *tp, bool literal) check_conflict(tp); for_each_string(j, tp) { - char *a = tp->Strings[j]; + const char *a = tp->Strings[j]; if (VALID_STRING(a)) { const char *name = ExtStrname(tp, (int) j, strnames); /* @@ -3270,17 +3272,17 @@ check_termtype(TERMTYPE2 *tp, bool literal) ANDMISSING(clear_all_tabs, set_tab); if (PRESENT(set_attributes)) { - char *zero = 0; + char *zero = NULL; _nc_tparm_err = 0; if (PRESENT(exit_attribute_mode)) { - zero = strdup(CHECK_SGR(0, exit_attribute_mode)); + zero = CHECK_SGR(0, exit_attribute_mode); } else { - zero = strdup(TIPARM_9(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + zero = TIPARM_9(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, 0); } check_tparm_err(0); - if (zero != 0) { + if (zero != NULL) { CHECK_SGR(1, enter_standout_mode); CHECK_SGR(2, enter_underline_mode); CHECK_SGR(3, enter_reverse_mode); @@ -3290,7 +3292,6 @@ check_termtype(TERMTYPE2 *tp, bool literal) CHECK_SGR(7, enter_secure_mode); CHECK_SGR(8, enter_protected_mode); CHECK_SGR(9, enter_alt_charset_mode); - free(zero); } else { _nc_warning("sgr(0) did not return a value"); } @@ -3366,6 +3367,6 @@ check_termtype(TERMTYPE2 *tp, bool literal) /* * Finally, do the non-verbose checks */ - if (save_check_termtype != 0) + if (save_check_termtype != NULL) save_check_termtype(tp, literal); } |
