/****************************************************************************
- * Copyright (c) 2005-2014,2015 Free Software Foundation, Inc. *
+ * Copyright 2019-2022,2023 Thomas E. Dickey *
+ * Copyright 2005-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 *
/*
* Author: Thomas E. Dickey
*
- * $Id: demo_termcap.c,v 1.48 2015/08/08 20:25:39 tom Exp $
+ * $Id: demo_termcap.c,v 1.65 2023/05/27 20:13:10 tom Exp $
*
* A simple demo of the termcap interface.
*/
#endif
#endif
-#ifdef NCURSES_VERSION
+#if defined(NCURSES_VERSION)
+#if HAVE_NCURSES_TERMCAP_H
+#include <ncurses/termcap.h>
+#elif HAVE_TERMCAP_H
#include <termcap.h>
#endif
+#endif
+
+static GCC_NORETURN void failed(const char *);
static void
failed(const char *msg)
static bool n_opt = FALSE;
static bool s_opt = FALSE;
static bool q_opt = FALSE;
+#ifdef NCURSES_VERSION
static bool x_opt = FALSE;
static bool y_opt = FALSE;
+#endif
static char *d_opt;
static char *e_opt;
#define EachCapName(n) n = 33; n < 127; ++n
static char *
-make_dbitem(char *p, char *q)
+make_dbitem(const char *const p, const char *const q)
{
- char *result = malloc(strlen(e_opt) + 2 + (size_t) (p - q));
- sprintf(result, "%s=%.*s", e_opt, (int) (p - q), q);
+ size_t need = strlen(e_opt) + 2 + (size_t) (p - q);
+ char *result = malloc(need);
+ _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q);
return result;
}
db_item++;
}
}
- printf("** %s\n", result);
+ if (result != 0)
+ printf("** %s\n", result);
return result;
}
+#if NO_LEAKS
static void
free_dblist(void)
{
db_list = 0;
}
}
+#endif /* NO_LEAKS */
static void
show_string(const char *name, const char *value)
static void
demo_termcap(NCURSES_CONST char *name)
{
- unsigned n;
- NCURSES_CONST char *cap;
char buffer[1024];
if (db_list) {
if (!q_opt)
printf("Terminal type \"%s\"\n", name);
if (tgetent(buffer, name) >= 0) {
+ NCURSES_CONST char *cap;
+ unsigned n;
if (b_opt) {
for (n = 0;; ++n) {
#ifdef NCURSES_VERSION
if (x_opt && (my_blob == 0) && y_opt) {
#if NCURSES_XNAMES
- TERMTYPE *term = &(cur_term->type);
+ TERMTYPE *term = (TERMTYPE *) cur_term;
if (term != 0
&& ((NUM_BOOLEANS(term) != BOOLCOUNT)
|| (NUM_NUMBERS(term) != NUMCOUNT)
static void
parse_description(const char *input_name)
{
- static char empty[1];
+ static char empty[1] =
+ {0};
FILE *fp;
struct stat sb;
failed("cannot allocate memory for input-file");
}
- if ((fp = fopen(input_name, "r")) == 0)
+ if ((fp = fopen(input_name, "r")) == 0) {
failed("cannot open input-file");
- len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp);
- my_blob[sb.st_size] = '\0';
- fclose(fp);
+ } else {
+ len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp);
+ my_blob[sb.st_size] = '\0';
+ fclose(fp);
+ }
/*
* First, get rid of comments and escaped newlines, as well as repeated
size_t count;
size_t length = 1;
char **result = 0;
- char *blob = 0;
char *unused = 0;
for (pass = 0; pass < 2; ++pass) {
length += chunk;
} else {
result[count] = unused;
- strcpy(unused, list[count]);
+ _nc_STRCPY(unused, list[count], length);
unused += chunk;
}
}
if (pass == 0) {
- blob = malloc(length);
+ char *blob = malloc(length);
result = typeCalloc(char *, count + 1);
unused = blob;
if (blob == 0 || result == 0)
return result;
}
-#endif
+#if NO_LEAKS
static void
-usage(void)
+free_code_list(char **list)
+{
+ if (list) {
+ free(list[0]);
+ free(list);
+ }
+}
+#endif /* NO_LEAKS */
+#endif /* USE_CODE_LISTS */
+
+static void
+usage(int ok)
{
static const char *msg[] =
{
- "Usage: demo_termcap [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",
- " -d LIST colon-separated list of databases to use",
- " -e NAME environment variable to set with -d option",
- " -i NAME terminal description to use as names for \"-a\" option, etc.",
- " -n print numeric-capabilities",
- " -q quiet (prints only counts)",
- " -r COUNT repeat for given count",
- " -s print string-capabilities",
- " -v print termcap-variables",
+ "Usage: demo_termcap [options] [terminal]"
+ ,""
+ ,"If no options are given, print all (boolean, numeric, string)"
+ ,"capabilities for the given terminal, using short names."
+ ,""
+ ,USAGE_COMMON
+ ,"Options:"
+ ," -a try all names, print capabilities found"
+ ," -b print boolean-capabilities"
+ ," -d LIST colon-separated list of databases to use"
+ ," -e NAME environment variable to set with -d option"
+ ," -i NAME terminal description to use as names for \"-a\" option, etc."
+ ," -n print numeric-capabilities"
+ ," -q quiet (prints only counts)"
+ ," -r COUNT repeat for given count"
+ ," -s print string-capabilities"
+ ," -v print termcap-variables"
#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 ch;
int n;
char *name;
bool a_opt = FALSE;
+#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED)
bool v_opt = FALSE;
+#endif
char *input_name = 0;
int repeat;
int r_opt = 1;
- while ((n = getopt(argc, argv, "abd:e:i:nqr:svxy")) != -1) {
- switch (n) {
+ while ((ch = getopt(argc, argv, OPTS_COMMON "abd:e:i:nqr:svxy")) != -1) {
+ switch (ch) {
case 'a':
a_opt = TRUE;
break;
break;
case 'r':
if ((r_opt = atoi(optarg)) <= 0)
- usage();
+ usage(FALSE);
break;
case 's':
s_opt = TRUE;
break;
+#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED)
case 'v':
v_opt = TRUE;
break;
+#endif
+#ifdef NCURSES_VERSION
#if NCURSES_XNAMES
case 'x':
x_opt = TRUE;
x_opt = TRUE;
break;
#endif
+#endif
+ case OPTS_VERSION:
+ show_version(argv);
+ ExitProgram(EXIT_SUCCESS);
default:
- usage();
- break;
+ usage(ch == OPTS_USAGE);
+ /* NOTREACHED */
}
}
show_number("PC", PC);
show_string("UP", UP);
show_string("BC", BC);
- show_number("ospeed", ospeed);
+ show_number("ospeed", (int) ospeed);
}
#endif
+#if NO_LEAKS
free_dblist();
+#if USE_CODE_LISTS
+ free_code_list(my_boolcodes);
+ free_code_list(my_numcodes);
+ free_code_list(my_strcodes);
+#endif
+#endif /* NO_LEAKS */
ExitProgram(EXIT_SUCCESS);
}
#else
int
-main(int argc GCC_UNUSED,
- char *argv[]GCC_UNUSED)
+main(void)
{
failed("This program requires termcap");
}