X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fdemo_termcap.c;h=b36ba96cc9872e36adebb8cf040e2884b23bf7bb;hp=3e856489407b08217b2d39bfec26212dec317fe6;hb=8485ec820b6d0ad70950b63834f31b3ca235c84b;hpb=85201fb67296429954e5c0a7784ec2c21a900c1d diff --git a/test/demo_termcap.c b/test/demo_termcap.c index 3e856489..b36ba96c 100644 --- a/test/demo_termcap.c +++ b/test/demo_termcap.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2005-2007,2008 Free Software Foundation, Inc. * + * Copyright (c) 2005-2008,2009 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 * @@ -29,7 +29,7 @@ /* * Author: Thomas E. Dickey * - * $Id: demo_termcap.c,v 1.7 2008/02/09 18:08:36 tom Exp $ + * $Id: demo_termcap.c,v 1.11 2009/08/02 00:02:53 tom Exp $ * * A simple demo of the termcap interface. */ @@ -38,10 +38,25 @@ #if HAVE_TGETENT +#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) +#define USE_CODE_LISTS 1 +#else +#define USE_CODE_LISTS 0 +#endif + +#define FCOLS 8 +#define FNAME(type) "%s %-*s = ", #type, FCOLS + +#if USE_CODE_LISTS +static bool b_opt = FALSE; +static bool n_opt = FALSE; +static bool s_opt = FALSE; +#endif + #define isCapName(c) (isgraph(c) && strchr("^#=:\\", c) == 0) static void -dumpit(char *cap) +dumpit(NCURSES_CONST char *cap) { /* * One of the limitations of the termcap interface is that the library @@ -59,7 +74,7 @@ dumpit(char *cap) * Note that the strings returned are mostly terminfo format, since * ncurses does not convert except for a handful of special cases. */ - printf("str %s = ", cap); + printf(FNAME(str), cap); while (*str != 0) { int ch = UChar(*str++); switch (ch) { @@ -108,15 +123,17 @@ dumpit(char *cap) } printf("\n"); } else if ((num = tgetnum(cap)) >= 0) { - printf("num %s = %d\n", cap, num); + printf(FNAME(num), cap); + printf(" %d\n", num); } else if ((num = tgetflag(cap)) > 0) { - printf("flg %s\n", cap); + printf(FNAME(flg), cap); + printf("%s\n", "true"); } fflush(stdout); } static void -demo_termcap(char *name) +brute_force(const char *name) { char buffer[1024]; @@ -140,23 +157,142 @@ demo_termcap(char *name) } } +#if USE_CODE_LISTS +static void +demo_terminfo(NCURSES_CONST char *name) +{ + unsigned n; + NCURSES_CONST char *cap; + + printf("Terminal type \"%s\"\n", name); + setupterm(name, 1, (int *) 0); + + if (b_opt) { + for (n = 0;; ++n) { + cap = boolcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } + + if (n_opt) { + for (n = 0;; ++n) { + cap = numcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } + + if (s_opt) { + for (n = 0;; ++n) { + cap = strcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } +} + +static void +usage(void) +{ + static const char *msg[] = + { + "Usage: demo_terminfo [options] [terminal]", + "", + "If no options are given, print all (boolean, numeric, string)", + "capabilities for the given terminal, using short names.", + "", + "Options:", + " -a try all names, print capabilities found", + " -b print boolean-capabilities", + " -n print numeric-capabilities", + " -r COUNT repeat for given count", + " -s print string-capabilities", + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(EXIT_FAILURE); +} +#endif + int main(int argc, char *argv[]) { int n; char *name; + bool a_opt = FALSE; + +#if USE_CODE_LISTS + int repeat; + int r_opt = 1; - if (argc > 1) { - for (n = 1; n < argc; ++n) { - demo_termcap(argv[n]); + while ((n = getopt(argc, argv, "abnr:s")) != -1) { + switch (n) { + case 'a': + a_opt = TRUE; + break; + case 'b': + b_opt = TRUE; + break; + case 'n': + n_opt = TRUE; + break; + case 'r': + if ((r_opt = atoi(optarg)) <= 0) + usage(); + break; + case 's': + s_opt = TRUE; + break; + default: + usage(); + break; } - } else if ((name = getenv("TERM")) != 0) { - demo_termcap(name); - } else { - static char dumb[] = "dumb"; - demo_termcap(dumb); } + if (!(b_opt || n_opt || s_opt)) { + b_opt = TRUE; + n_opt = TRUE; + s_opt = TRUE; + } +#else + a_opt = TRUE; +#endif + + if (a_opt) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + brute_force(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + brute_force(name); + } else { + static char dumb[] = "dumb"; + brute_force(dumb); + } + } +#if USE_CODE_LISTS + else { + for (repeat = 0; repeat < r_opt; ++repeat) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + demo_terminfo(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + demo_terminfo(name); + } else { + static char dumb[] = "dumb"; + demo_terminfo(dumb); + } + } + } +#endif + ExitProgram(EXIT_SUCCESS); }