X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=test%2Flist_keys.c;h=b616919f4653c0a5b92bc7deb148b9aece0b249f;hb=122d3739b3c11c83decc625d53f26fff6e825710;hp=5beb52c9a8c11eff8899b20a3da957850fc22b50;hpb=3e7e5f8b5c4e8e499f682a1c414c576c16d47532;p=ncurses.git diff --git a/test/list_keys.c b/test/list_keys.c index 5beb52c9..b616919f 100644 --- a/test/list_keys.c +++ b/test/list_keys.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2016,2017 Free Software Foundation, Inc. * + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 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 * @@ -26,7 +27,7 @@ * authorization. * ****************************************************************************/ /* - * $Id: list_keys.c,v 1.21 2017/06/24 22:13:47 tom Exp $ + * $Id: list_keys.c,v 1.33 2023/11/11 00:35:05 tom Exp $ * * Author: Thomas E Dickey * @@ -51,7 +52,10 @@ static bool f_opt = FALSE; static bool m_opt = FALSE; static bool t_opt = FALSE; + +#if NCURSES_XNAMES || HAVE_USE_EXTENDED_NAMES static bool x_opt = FALSE; +#endif typedef enum { ktCursor @@ -70,6 +74,13 @@ typedef struct { #define Type(n) list[n].type #define Name(n) list[n].name +static void +failed(const char *msg) +{ + perror(msg); + ExitProgram(EXIT_FAILURE); +} + static const char * full_name(const char *name) { @@ -88,7 +99,6 @@ static int show_key(const char *name, bool show) { int width = 0; - char buffer[10]; NCURSES_CONST char *value = tigetstr((NCURSES_CONST char *) name); if (show && t_opt) @@ -96,6 +106,7 @@ show_key(const char *name, bool show) if (value != 0 && value != (char *) -1) { while (*value != 0) { + char buffer[10]; int ch = UChar(*value++); switch (ch) { case '\177': @@ -197,8 +208,8 @@ compare_keys(const void *a, const void *b) static void draw_line(int width) { - int j; if (!t_opt) { + int j; for (j = 0; j < width; ++j) { printf("-"); } @@ -209,8 +220,8 @@ draw_line(int width) static const char * modified_key(const char *name) { - static char result[80]; - char buffer[sizeof(result)]; + static char result[100]; + char buffer[sizeof(result) - 10]; int value; char chr; static const char *modifiers[][2] = @@ -238,8 +249,8 @@ modified_key(const char *name) map &= ~6; map |= (bit1 << 1) | (bit2 >> 1); _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result)) - "%sF%d", modifiers[map][(unsigned)f_opt], 1 + key); - } else if (sscanf(name, "k%[A-Z]%d%c", buffer, &value, &chr) == 2 && + "%sF%d", modifiers[map][(unsigned) f_opt], 1 + key); + } else if (sscanf(name, "k%80[A-Z]%d%c", buffer, &value, &chr) == 2 && (value > 1 && value <= 8) && (!strcmp(buffer, "UP") || @@ -253,12 +264,12 @@ modified_key(const char *name) !strcmp(buffer, "NXT") || !strcmp(buffer, "PRV"))) { _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result)) - "%sk%s", modifiers[value - 1][(unsigned)f_opt], buffer); - } else if (sscanf(name, "k%[A-Z]%c", buffer, &chr) == 1 && + "%sk%s", modifiers[value - 1][(unsigned) f_opt], buffer); + } else if (sscanf(name, "k%80[A-Z]%c", buffer, &chr) == 1 && (!strcmp(buffer, "UP") || !strcmp(buffer, "DN"))) { _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result)) - "%sk%s", modifiers[1][f_opt], buffer); + "%sk%s", modifiers[1][(unsigned) f_opt], buffer); } else { *result = '\0'; } @@ -285,8 +296,8 @@ list_keys(TERMINAL **terms, int count) } #if NCURSES_XNAMES if (x_opt) { - TERMTYPE *term; for (k = 0; k < count; ++k) { + TERMTYPE *term; set_curterm(terms[k]); term = (TERMTYPE *) cur_term; total += (size_t) (NUM_STRINGS(term) - STRCOUNT); @@ -298,16 +309,18 @@ list_keys(TERMINAL **terms, int count) Type(j) = ktOther; if (sscanf(strnames[j], "kf%d", &k) == 1) { Type(j) = ktFunction; - } else if (!strncmp(strnames[j], "kcu", 3)) { + } else if (!(strncmp) (strnames[j], "kcu", 3)) { Type(j) = ktCursor; } Name(j) = strnames[j]; } #if NCURSES_XNAMES if (x_opt) { - TERMTYPE *term; int m, n; + for (k = 0; k < count; ++k) { + TERMTYPE *term; + set_curterm(terms[k]); term = (TERMTYPE *) cur_term; for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { @@ -335,8 +348,11 @@ list_keys(TERMINAL **terms, int count) widths1 = (int) strlen(modifier); for (k = 0; k < count; ++k) { + char *value; set_curterm(terms[k]); - check = (int) strlen(termname()); + if ((value = termname()) == NULL) + failed("termname"); + check = (int) strlen(value); if (widths2 < check) widths2 = check; } @@ -414,37 +430,41 @@ list_keys(TERMINAL **terms, int count) } static void -usage(void) +usage(int ok) { static const char *msg[] = { - "Usage: list_keys [options] [terminal [terminal2 [...]]]", - "", - "Print capabilities for terminal special keys.", - "", - "Options:", - " -f print full names", - " -m print modifier-column for shift/control keys", - " -t print result as CSV table", + "Usage: list_keys [options] [terminal [terminal2 [...]]]" + ,"" + ,"Print capabilities for terminal special keys." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f print full names" + ," -m print modifier-column for shift/control keys" + ," -t print result as CSV table" #ifdef NCURSES_VERSION - " -x print extended capabilities", + ," -x print extended capabilities" #endif }; unsigned n; for (n = 0; n < SIZEOF(msg); ++n) { fprintf(stderr, "%s\n", msg[n]); } - ExitProgram(EXIT_FAILURE); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ int main(int argc, char *argv[]) { - int n; + int ch; TERMINAL **terms = typeCalloc(TERMINAL *, argc + 1); - while ((n = getopt(argc, argv, "fmtx")) != -1) { - switch (n) { + while ((ch = getopt(argc, argv, OPTS_COMMON "fmtx")) != -1) { + switch (ch) { case 'f': f_opt = TRUE; break; @@ -454,14 +474,17 @@ main(int argc, char *argv[]) case 't': t_opt = TRUE; break; -#ifdef NCURSES_VERSION +#if NCURSES_XNAMES || HAVE_USE_EXTENDED_NAMES case 'x': x_opt = TRUE; break; #endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); default: - usage(); - break; + usage(ch == OPTS_USAGE); + /* NOTREACHED */ } } @@ -472,6 +495,7 @@ main(int argc, char *argv[]) if (optind < argc) { int found = 0; int status; + int n; for (n = optind; n < argc; ++n) { setupterm((NCURSES_CONST char *) argv[n], 1, &status); if (status > 0 && cur_term != 0) { @@ -493,7 +517,7 @@ main(int argc, char *argv[]) #else int -main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) +main(void) { printf("This program requires the terminfo arrays\n"); ExitProgram(EXIT_FAILURE); @@ -501,7 +525,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) #endif #else /* !HAVE_TIGETSTR */ int -main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) +main(void) { printf("This program requires the terminfo functions such as tigetstr\n"); ExitProgram(EXIT_FAILURE);