X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fdemo_terminfo.c;h=239739a47a8f36ac5fedf05d932d257677070df2;hp=721847541aeb8ba6ce1ee688f5324003a4d26ffa;hb=17d9459c7aecedecbfc59b8ba5d29279a01e9003;hpb=dfaa1a3001fd447819f5edc2e523acc1a04f1440 diff --git a/test/demo_terminfo.c b/test/demo_terminfo.c index 72184754..239739a4 100644 --- a/test/demo_terminfo.c +++ b/test/demo_terminfo.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2009 Free Software Foundation, Inc. * + * Copyright (c) 2009-2012,2013 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,30 +29,112 @@ /* * Author: Thomas E. Dickey * - * $Id: demo_terminfo.c,v 1.6 2009/07/17 01:02:08 tom Exp $ + * $Id: demo_terminfo.c,v 1.19 2013/09/28 21:50:01 tom Exp $ * * A simple demo of the terminfo interface. */ #define USE_TINFO #include -#ifdef NCURSES_VERSION #if NCURSES_XNAMES +#if HAVE_TERM_ENTRY_H #include +#else +#undef NCURSES_XNAMES +#define NCURSES_XNAMES 0 #endif #endif +#if HAVE_TIGETSTR #if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) static bool b_opt = FALSE; static bool f_opt = FALSE; static bool n_opt = FALSE; +static bool q_opt = FALSE; static bool s_opt = FALSE; static bool x_opt = FALSE; +static char *d_opt; +static char *e_opt; +static char **db_list; +static int db_item; + +static long total_values; + #define FCOLS 8 #define FNAME(type) "%s %-*s = ", #type, FCOLS +static char * +make_dbitem(char *p, char *q) +{ + char *result = malloc(strlen(e_opt) + 2 + (size_t) (p - q)); + sprintf(result, "%s=%.*s", e_opt, (int) (p - q), q); + return result; +} + +static void +make_dblist(void) +{ + if (d_opt && e_opt) { + int pass; + + for (pass = 0; pass < 2; ++pass) { + char *p, *q; + size_t count = 0; + + for (p = q = d_opt; *p != '\0'; ++p) { + if (*p == ':') { + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + q = p + 1; + } + } + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + if (!pass) { + db_list = typeCalloc(char *, count + 1); + } + } + } +} + +static char * +next_dbitem(void) +{ + char *result = 0; + + if (db_list) { + if ((result = db_list[db_item]) == 0) { + db_item = 0; + result = db_list[0]; + } else { + db_item++; + } + } + printf("** %s\n", result); + return result; +} + +static void +free_dblist(void) +{ + if (db_list) { + int n; + for (n = 0; db_list[n]; ++n) + free(db_list[n]); + free(db_list); + db_list = 0; + } +} static void dumpit(NCURSES_CONST char *cap) { @@ -67,66 +149,77 @@ dumpit(NCURSES_CONST char *cap) int num; if ((str = tigetstr(cap)) != 0 && (str != (char *) -1)) { - /* - * Note that the strings returned are mostly terminfo format, since - * ncurses does not convert except for a handful of special cases. - */ - printf(FNAME(str), cap); - while (*str != 0) { - int ch = UChar(*str++); - switch (ch) { - case '\177': - fputs("^?", stdout); - break; - case '\033': - fputs("\\E", stdout); - break; - case '\b': - fputs("\\b", stdout); - break; - case '\f': - fputs("\\f", stdout); - break; - case '\n': - fputs("\\n", stdout); - break; - case '\r': - fputs("\\r", stdout); - break; - case ' ': - fputs("\\s", stdout); - break; - case '\t': - fputs("\\t", stdout); - break; - case '^': - fputs("\\^", stdout); - break; - case ':': - fputs("\\072", stdout); - break; - case '\\': - fputs("\\\\", stdout); - break; - default: - if (isgraph(ch)) - fputc(ch, stdout); - else if (ch < 32) - printf("^%c", ch + '@'); - else - printf("\\%03o", ch); - break; + total_values++; + if (!q_opt) { + /* + * Note that the strings returned are mostly terminfo format, since + * ncurses does not convert except for a handful of special cases. + */ + printf(FNAME(str), cap); + while (*str != 0) { + int ch = UChar(*str++); + switch (ch) { + case '\177': + fputs("^?", stdout); + break; + case '\033': + fputs("\\E", stdout); + break; + case '\b': + fputs("\\b", stdout); + break; + case '\f': + fputs("\\f", stdout); + break; + case '\n': + fputs("\\n", stdout); + break; + case '\r': + fputs("\\r", stdout); + break; + case ' ': + fputs("\\s", stdout); + break; + case '\t': + fputs("\\t", stdout); + break; + case '^': + fputs("\\^", stdout); + break; + case ':': + fputs("\\072", stdout); + break; + case '\\': + fputs("\\\\", stdout); + break; + default: + if (isgraph(ch)) + fputc(ch, stdout); + else if (ch < 32) + printf("^%c", ch + '@'); + else + printf("\\%03o", ch); + break; + } } + printf("\n"); } - printf("\n"); } else if ((num = tigetnum(cap)) >= 0) { - printf(FNAME(num), cap); - printf(" %d\n", num); + total_values++; + if (!q_opt) { + printf(FNAME(num), cap); + printf(" %d\n", num); + } } else if ((num = tigetflag(cap)) >= 0) { - printf(FNAME(flg), cap); - printf("%s\n", num ? "true" : "false"); + total_values++; + if (!q_opt) { + printf(FNAME(flg), cap); + printf("%s\n", num ? "true" : "false"); + } } - fflush(stdout); + + if (!q_opt) + fflush(stdout); } static void @@ -135,6 +228,9 @@ demo_terminfo(char *name) unsigned n; NCURSES_CONST char *cap; + if (db_list) { + putenv(next_dbitem()); + } printf("Terminal type \"%s\"\n", name); setupterm(name, 1, (int *) 0); @@ -175,18 +271,18 @@ demo_terminfo(char *name) || (NUM_NUMBERS(term) != NUMCOUNT) || (NUM_STRINGS(term) != STRCOUNT))) { for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) { - dumpit(ExtBoolname(term, n, boolnames)); + dumpit(ExtBoolname(term, (int) n, boolnames)); } for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) { - dumpit(ExtNumname(term, n, numnames)); + dumpit(ExtNumname(term, (int) n, numnames)); } for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { - dumpit(ExtStrname(term, n, strnames)); + dumpit(ExtStrname(term, (int) n, strnames)); } } #endif } else { - char temp[10]; + char temp[80]; static const char *xterm_keys[] = { "kDC", "kDN", "kEND", "kHOM", "kIC", @@ -195,9 +291,9 @@ demo_terminfo(char *name) for (n = 0; n < SIZEOF(xterm_keys); ++n) { for (mod = 0; mod < 8; ++mod) { if (mod == 0) - strcpy(temp, xterm_keys[n]); + sprintf(temp, "%.*s", 8, xterm_keys[n]); else - sprintf(temp, "%s%d", xterm_keys[n], mod); + sprintf(temp, "%.*s%d", 8, xterm_keys[n], mod); dumpit(temp); } } @@ -219,12 +315,16 @@ usage(void) "", "Options:", " -b print boolean-capabilities", + " -d LIST colon-separated list of databases to use", + " -e NAME environment variable to set with -d option", " -f print full names", " -n print numeric-capabilities", + " -q quiet (prints only counts)", " -r COUNT repeat for given count", " -s print string-capabilities", #ifdef NCURSES_VERSION " -x print extended capabilities", + " -y disable extended capabilities", #endif }; unsigned n; @@ -241,18 +341,30 @@ main(int argc, char *argv[]) int repeat; char *name; int r_opt = 1; +#ifdef NCURSES_VERSION + bool xy_opt = TRUE; /* by default, use_extended_names is true */ +#endif - while ((n = getopt(argc, argv, "bfnr:sx")) != -1) { + while ((n = getopt(argc, argv, "bd:e:fnqr:sxy")) != -1) { switch (n) { case 'b': b_opt = TRUE; break; + case 'd': + d_opt = optarg; + break; + case 'e': + e_opt = optarg; + break; case 'f': f_opt = TRUE; break; case 'n': n_opt = TRUE; break; + case 'q': + q_opt = TRUE; + break; case 'r': if ((r_opt = atoi(optarg)) <= 0) usage(); @@ -263,7 +375,10 @@ main(int argc, char *argv[]) #ifdef NCURSES_VERSION case 'x': x_opt = TRUE; - use_extended_names(TRUE); + xy_opt = TRUE; + break; + case 'y': + xy_opt = FALSE; break; #endif default: @@ -272,12 +387,18 @@ main(int argc, char *argv[]) } } +#if NCURSES_XNAMES + use_extended_names(xy_opt); +#endif + if (!(b_opt || n_opt || s_opt || x_opt)) { b_opt = TRUE; n_opt = TRUE; s_opt = TRUE; } + make_dblist(); + for (repeat = 0; repeat < r_opt; ++repeat) { if (optind < argc) { for (n = optind; n < argc; ++n) { @@ -291,6 +412,10 @@ main(int argc, char *argv[]) } } + printf("%ld values\n", total_values); + + free_dblist(); + ExitProgram(EXIT_SUCCESS); } @@ -302,3 +427,11 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) 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 */