ncurses/test/test_arrays.c

227 lines
6.4 KiB
C

/****************************************************************************
* Copyright 2020 Thomas E. Dickey *
* Copyright 2007-2010,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 *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, distribute with modifications, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included *
* in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
* *
* Except as contained in this notice, the name(s) of the above copyright *
* holders shall not be used in advertising or otherwise to promote the *
* sale, use or other dealings in this Software without prior written *
* authorization. *
****************************************************************************/
/*
* $Id: test_arrays.c,v 1.9 2020/02/02 23:34:34 tom Exp $
*
* Author: Thomas E Dickey
*
* Demonstrate the public arrays from the terminfo library.
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolnames[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolcodes[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolfnames[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numnames[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numcodes[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numfnames[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strnames[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strcodes[];
extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strfnames[];
*/
#define USE_TINFO
#include <test.priv.h>
#if HAVE_TIGETSTR
#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES)
static bool opt_C;
static bool opt_T;
static bool opt_c;
static bool opt_f;
static bool opt_n;
static bool opt_t;
#define PLAIN(opts, name) if (opts) dump_array(#name, name)
static void
dump_array(const char *name, NCURSES_CONST char *const *list)
{
int n;
printf("%s:\n", name);
for (n = 0; list[n] != 0; ++n) {
printf("%5d:%s\n", n, list[n]);
}
}
static void
dump_plain(void)
{
PLAIN(opt_T && opt_n, boolnames);
PLAIN(opt_C && opt_c, boolcodes);
PLAIN(opt_T && opt_f, boolfnames);
PLAIN(opt_T && opt_n, numnames);
PLAIN(opt_C && opt_c, numcodes);
PLAIN(opt_T && opt_f, numfnames);
PLAIN(opt_T && opt_n, strnames);
PLAIN(opt_C && opt_c, strcodes);
PLAIN(opt_T && opt_f, strfnames);
}
#define STRING(opts, name) if (opts) { printf("%s\"%s\"", c++ ? "," : "", name); }
#define NUMBER(opts, value) if (opts) { printf("%s%d", c++ ? "," : "", value); }
static void
dump_table(void)
{
int c = 0;
int r;
STRING(opt_t, "Index");
STRING(opt_t, "Type");
STRING(opt_n, "Name");
STRING(opt_c, "Code");
STRING(opt_f, "FName");
printf("\n");
for (r = 0; boolnames[r]; ++r) {
c = 0;
NUMBER(opt_t, r);
STRING(opt_t, "bool");
STRING(opt_T && opt_n, boolnames[r]);
STRING(opt_C && opt_c, boolcodes[r]);
STRING(opt_T && opt_f, boolfnames[r]);
printf("\n");
}
for (r = 0; numnames[r]; ++r) {
c = 0;
NUMBER(opt_t, r);
STRING(opt_t, "num");
STRING(opt_T && opt_n, numnames[r]);
STRING(opt_C && opt_c, numcodes[r]);
STRING(opt_T && opt_f, numfnames[r]);
printf("\n");
}
for (r = 0; strnames[r]; ++r) {
c = 0;
NUMBER(opt_t, r);
STRING(opt_t, "str");
STRING(opt_T && opt_n, strnames[r]);
STRING(opt_C && opt_c, strcodes[r]);
STRING(opt_T && opt_f, strfnames[r]);
printf("\n");
}
}
static void
usage(void)
{
static const char *msg[] =
{
"Usage: test_arrays [options]",
"",
"If no options are given, print all (boolean, numeric, string)",
"capability names showing their index within the tables.",
"",
"Options:",
" -C print termcap names",
" -T print terminfo names",
" -c print termcap names",
" -f print full terminfo names",
" -n print short terminfo names",
" -t print the result as CSV table",
};
unsigned n;
for (n = 0; n < SIZEOF(msg); ++n) {
fprintf(stderr, "%s\n", msg[n]);
}
ExitProgram(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
int n;
while ((n = getopt(argc, argv, "CTcfnt")) != -1) {
switch (n) {
case 'C':
opt_C = TRUE;
break;
case 'T':
opt_T = TRUE;
break;
case 'c':
opt_c = TRUE;
break;
case 'f':
opt_f = TRUE;
break;
case 'n':
opt_n = TRUE;
break;
case 't':
opt_t = TRUE;
break;
default:
usage();
/* NOTREACHED */
}
}
if (optind < argc)
usage();
if (!(opt_T || opt_C)) {
opt_T = opt_C = TRUE;
}
if (!(opt_c || opt_f || opt_n)) {
opt_c = opt_f = opt_n = TRUE;
}
if (opt_t) {
dump_table();
} else {
dump_plain();
}
ExitProgram(EXIT_SUCCESS);
}
#else
int
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
printf("This program requires the terminfo arrays\n");
ExitProgram(EXIT_FAILURE);
}
#endif
#else /* !HAVE_TIGETSTR */
int
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
printf("This program requires the terminfo functions such as tigetstr\n");
ExitProgram(EXIT_FAILURE);
}
#endif /* HAVE_TIGETSTR */