X-Git-Url: http://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=progs%2Finfocmp.c;h=d98c67601abc704c06afd66feb8876b14ea981d3;hb=9f479192e3ca3413d235c66bf058f8cc63764898;hp=b864ad880278ab00036a86316c3d3ea1211a6516;hpb=646aa4040ea415c39a376991d2d9658eff0fce77;p=ncurses.git diff --git a/progs/infocmp.c b/progs/infocmp.c index b864ad88..d98c6760 100644 --- a/progs/infocmp.c +++ b/progs/infocmp.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2015,2016 Free Software Foundation, Inc. * + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2016,2017 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 * @@ -42,7 +43,7 @@ #include -MODULE_ID("$Id: infocmp.c,v 1.140 2016/10/01 19:09:22 tom Exp $") +MODULE_ID("$Id: infocmp.c,v 1.151 2021/06/17 21:11:08 tom Exp $") #define MAX_STRING 1024 /* maximum formatted string */ @@ -93,7 +94,7 @@ typedef struct { static ENTERED *entered; #undef ExitProgram -static void ExitProgram(int code) GCC_NORETURN; +static GCC_NORETURN void ExitProgram(int code); /* prototype is to get gcc to accept the noreturn attribute */ static void ExitProgram(int code) @@ -136,6 +137,33 @@ canonical_name(char *ptr, char *buf) return (buf); } +static bool +no_boolean(int value) +{ + bool result = (value == ABSENT_BOOLEAN); + if (!strcmp(s_absent, s_cancel)) + result = !VALID_BOOLEAN(value); + return result; +} + +static bool +no_numeric(int value) +{ + bool result = (value == ABSENT_NUMERIC); + if (!strcmp(s_absent, s_cancel)) + result = !VALID_NUMERIC(value); + return result; +} + +static bool +no_string(char *value) +{ + bool result = (value == ABSENT_STRING); + if (!strcmp(s_absent, s_cancel)) + result = !VALID_STRING(value); + return result; +} + /*************************************************************************** * * Predicates for dump function @@ -268,7 +296,7 @@ useeq(ENTRY * e1, ENTRY * e2) } static bool -entryeq(TERMTYPE *t1, TERMTYPE *t2) +entryeq(TERMTYPE2 *t1, TERMTYPE2 *t2) /* are two entries equivalent? */ { unsigned i; @@ -294,16 +322,17 @@ static void print_uses(ENTRY * ep, FILE *fp) /* print an entry's use references */ { - unsigned i; - - if (!ep->nuses) + if (!ep->nuses) { fputs("NULL", fp); - else + } else { + unsigned i; + for (i = 0; i < ep->nuses; i++) { fputs(ep->uses[i].name, fp); if (i < ep->nuses - 1) fputs(" ", fp); } + } } static const char * @@ -326,7 +355,7 @@ dump_boolean(int val) static void dump_numeric(int val, char *buf) -/* display the value of a boolean capability */ +/* display the value of a numeric capability */ { switch (val) { case ABSENT_NUMERIC: @@ -390,7 +419,7 @@ show_comparing(char **names) /* * ncurses stores two types of non-standard capabilities: - * a) capabilities listed past the "STOP-HERE" comment in the Caps file. + * a) capabilities listed past the "STOP-HERE" comment in the Caps file. * These are used in the terminfo source file to provide data for termcaps, * e.g., when there is no equivalent capability in terminfo, as well as for * widely-used non-standard capabilities. @@ -434,7 +463,7 @@ compare_predicate(PredType type, PredIdx idx, const char *name) switch (compare) { case C_DIFFERENCE: b2 = next_entry->Booleans[idx]; - if (!(b1 == ABSENT_BOOLEAN && b2 == ABSENT_BOOLEAN) && b1 != b2) + if (!(no_boolean(b1) && no_boolean(b2)) && (b1 != b2)) (void) printf("\t%s: %s%s%s.\n", name, dump_boolean(b1), @@ -482,7 +511,7 @@ compare_predicate(PredType type, PredIdx idx, const char *name) switch (compare) { case C_DIFFERENCE: n2 = next_entry->Numbers[idx]; - if (!((n1 == ABSENT_NUMERIC && n2 == ABSENT_NUMERIC)) && n1 != n2) { + if (!(no_numeric(n1) && no_numeric(n2)) && n1 != n2) { dump_numeric(n1, buf1); dump_numeric(n2, buf2); (void) printf("\t%s: %s, %s.\n", name, buf1, buf2); @@ -530,7 +559,7 @@ compare_predicate(PredType type, PredIdx idx, const char *name) switch (compare) { case C_DIFFERENCE: s2 = next_entry->Strings[idx]; - if (capcmp(idx, s1, s2)) { + if (!(no_string(s1) && no_string(s2)) && capcmp(idx, s1, s2)) { dump_string(s1, buf1); dump_string(s2, buf2); if (strcmp(buf1, buf2)) @@ -783,7 +812,7 @@ lookup_params(const assoc * table, char *dst, char *src) } static void -analyze_string(const char *name, const char *cap, TERMTYPE *tp) +analyze_string(const char *name, const char *cap, TERMTYPE2 *tp) { char buf2[MAX_TERMINFO_LENGTH]; const char *sp; @@ -807,6 +836,8 @@ analyze_string(const char *name, const char *cap, TERMTYPE *tp) char *cp = tp->Strings[i]; /* don't use function-key capabilities */ + if (strnames[i] == NULL) + continue; if (strnames[i][0] == 'k' && strnames[i][1] == 'f') continue; @@ -1166,8 +1197,9 @@ usage(void) DATA("Options:") }; #undef DATA + /* length is given here so the compiler can make everything readonly */ #define DATA(s) s - static const char options[][45] = + static const char options[][46] = { " -0 print single-row" ," -1 print single-column" @@ -1267,7 +1299,7 @@ string_variable(const char *type) /* dump C initializers for the terminal type */ static void -dump_initializers(TERMTYPE *term) +dump_initializers(TERMTYPE2 *term) { unsigned n; const char *str = 0; @@ -1276,9 +1308,9 @@ dump_initializers(TERMTYPE *term) name_initializer("alias"), entries->tterm.term_names); for_each_string(n, term) { - char buf[MAX_STRING], *sp, *tp; - if (VALID_STRING(term->Strings[n])) { + char buf[MAX_STRING], *sp, *tp; + tp = buf; #define TP_LIMIT ((MAX_STRING - 5) - (size_t)(tp - buf)) *tp++ = '"'; @@ -1391,7 +1423,7 @@ dump_initializers(TERMTYPE *term) /* dump C initializers for the terminal type */ static void -dump_termtype(TERMTYPE *term) +dump_termtype(TERMTYPE2 *term) { (void) printf("\t%s\n\t\t%s,\n", L_CURL, name_initializer("alias")); (void) printf("\t\t(char *)0,\t/* pointer to string table */\n"); @@ -1481,6 +1513,8 @@ show_databases(void) #if NO_LEAKS #define MAIN_LEAKS() \ + _nc_free_termtype2(&entries[0].tterm); \ + _nc_free_termtype2(&entries[1].tterm); \ free(myargv); \ free(tfile); \ free(tname) @@ -1500,7 +1534,7 @@ main(int argc, char *argv[]) char **myargv; char *firstdir, *restdir; - int c, i, len; + int c; bool formatted = FALSE; bool filecompare = FALSE; int initdump = 0; @@ -1806,9 +1840,9 @@ main(int argc, char *argv[]) _nc_progname, tname[termcount]); - status = _nc_read_entry(tname[termcount], - tfile[termcount], - &entries[termcount].tterm); + status = _nc_read_entry2(tname[termcount], + tfile[termcount], + &entries[termcount].tterm); } if (status <= 0) { @@ -1852,6 +1886,8 @@ main(int argc, char *argv[]) analyze_string("rmkx", keypad_local, &entries[0].tterm); #undef CUR } else { + int i; + int len; /* * Here's where the real work gets done