/****************************************************************************
- * Copyright 2018-2020,2021 Thomas E. Dickey *
+ * Copyright 2018-2022,2023 Thomas E. Dickey *
* Copyright 1998-2016,2017 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
#define __INTERNAL_CAPS_VISIBLE
#include <progs.priv.h>
-#include "dump_entry.h"
-#include "termsort.c" /* this C file is generated */
+#include <dump_entry.h>
+#include <termsort.h> /* this C file is generated */
#include <parametrized.h> /* so is this */
-MODULE_ID("$Id: dump_entry.c,v 1.184 2021/04/03 23:01:08 tom Exp $")
+MODULE_ID("$Id: dump_entry.c,v 1.196 2023/05/27 20:13:10 tom Exp $")
#define DISCARD(string) string = ABSENT_STRING
#define PRINTF (void) printf
/* cover various ports and variants of terminfo */
#define V_ALLCAPS 0 /* all capabilities (SVr4, XSI, ncurses) */
#define V_SVR1 1 /* SVR1, Ultrix */
-#define V_HPUX 2 /* HP/UX */
+#define V_HPUX 2 /* HP-UX */
#define V_AIX 3 /* AIX */
#define V_BSD 4 /* BSD */
if (pass) {
result[d] = '\0';
} else {
- result = malloc(need + 1);
+ result = calloc(need + 1, sizeof(char));
if (result == 0)
failed("fill_spaces");
}
indent_DYN(&tmpbuf, level + 1);
strncpy_DYN(&tmpbuf, "%", (size_t) 1);
}
- params = FALSE;
percent = FALSE;
break;
case ' ':
{
PredIdx i, j;
char buffer[MAX_TERMINFO_LENGTH + EXTRA_CAP];
- char *capability;
NCURSES_CONST char *name;
int predval, len;
PredIdx num_bools = 0;
strcpy_DYN(&outbuf, 0);
if (content_only) {
- column = indent; /* FIXME: workaround to prevent empty lines */
+ column = indent; /* workaround to prevent empty lines */
} else {
strcpy_DYN(&outbuf, tterm->term_names);
}
for_each_string(j, tterm) {
+ char *capability;
i = StrIndirect(j);
name = ExtStrname(tterm, (int) i, str_names);
assert(strlen(name) < sizeof(buffer) - EXTRA_CAP);
}
static bool
-kill_string(TERMTYPE2 *tterm, char *cap)
+kill_string(TERMTYPE2 *tterm, const char *const cap)
{
unsigned n;
for (n = 0; n < NUM_STRINGS(tterm); ++n) {
PredFunc pred)
{
TERMTYPE2 save_tterm;
- int len, critlen;
+ int critlen;
const char *legend;
bool infodump;
save_sgr = set_attributes;
if ((FMT_ENTRY() > critlen)
+ && TcOutput()
&& limited) {
save_tterm = *tterm;
}
if (FMT_ENTRY() > critlen) {
/*
- * We pick on sgr because it's a nice long string capability that
+ * We pick on sgr because it is a nice long string capability that
* is really just an optimization hack. Another good candidate is
* acsc since it is both long and unused by BSD termcap.
*/
}
if (!changed || (FMT_ENTRY() > critlen)) {
int oldversion = tversion;
+ int len;
tversion = V_BSD;
SHOW_WHY("# (terminfo-only capabilities suppressed to fit entry within %d bytes)\n",
}
void
-dump_uses(const char *name, bool infodump)
+dump_uses(const char *value, bool infodump)
/* dump "use=" clauses in the appropriate format */
{
- char buffer[MAX_TERMINFO_LENGTH];
+ char buffer[MAX_TERMINFO_LENGTH + EXTRA_CAP];
+ int limit = (VALID_STRING(value) ? (int) strlen(value) : 0);
+ const char *cap = infodump ? "use" : "tc";
if (TcOutput())
trim_trailing();
+ if (limit == 0) {
+ _nc_warning("empty \"%s\" field", cap);
+ value = "";
+ } else if (limit > MAX_ALIAS) {
+ _nc_warning("\"%s\" field too long (%d), limit to %d",
+ cap, limit, MAX_ALIAS);
+ limit = MAX_ALIAS;
+ }
_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
- "%s%s", infodump ? "use=" : "tc=", name);
+ "%s=%.*s", cap, limit, value);
wrap_concat1(buffer);
}
outbuf.used = (size_t) j;
} else if (!infodump && ch == '\\') {
outbuf.used = (size_t) j;
- } else if (ch == delim && (j == 0 || outbuf.text[j - 1] != '\\')) {
+ } else if (ch == delim && (outbuf.text[j - 1] != '\\')) {
outbuf.used = (size_t) (j + 1);
} else {
break;