/****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
#include "termsort.c" /* this C file is generated */
#include <parametrized.h> /* so is this */
-MODULE_ID("$Id: dump_entry.c,v 1.91 2011/05/14 22:39:21 tom Exp $")
+MODULE_ID("$Id: dump_entry.c,v 1.99 2012/03/10 23:20:35 tom Exp $")
#define INDENT 8
#define DISCARD(string) string = ABSENT_STRING
static int outform; /* output format to use */
static int sortmode; /* sort mode to use */
static int width = 60; /* max line width for listings */
+static int height = 65535; /* max number of lines for listings */
static int column; /* current column, limited by 'width' */
static int oldcol; /* last value of column before wrap */
static bool pretty; /* true if we format if-then-else strings */
int mode,
int sort,
int twidth,
+ int theight,
unsigned traceval,
bool formatted)
/* set up for entry display */
{
width = twidth;
+ height = theight;
pretty = formatted;
/* versions */
bool_names = boolnames;
num_names = numnames;
str_names = strnames;
- separator = twidth ? ", " : ",";
+ separator = (twidth > 0 && theight > 1) ? ", " : ",";
trailer = "\n\t";
break;
bool_names = boolfnames;
num_names = numfnames;
str_names = strfnames;
- separator = twidth ? ", " : ",";
+ separator = (twidth > 0 && theight > 1) ? ", " : ",";
trailer = "\n\t";
break;
column = INDENT; /* FIXME: workaround to prevent empty lines */
} else {
strcpy_DYN(&outbuf, tterm->term_names);
+
+ /*
+ * Colon is legal in terminfo descriptions, but not in termcap.
+ */
+ if (!infodump) {
+ char *p = outbuf.text;
+ while (*p) {
+ if (*p == ':') {
+ *p = '=';
+ }
+ ++p;
+ }
+ }
strcpy_DYN(&outbuf, separator);
column = (int) outbuf.used;
- force_wrap();
+ if (height > 1)
+ force_wrap();
}
for_each_boolean(j, tterm) {
predval = pred(BOOLEAN, i);
if (predval != FAIL) {
- (void) strcpy(buffer, name);
+ _nc_STRCPY(buffer, name, sizeof(buffer));
if (predval <= 0)
- (void) strcat(buffer, "@");
+ _nc_STRCAT(buffer, "@", sizeof(buffer));
else if (i + 1 > num_bools)
num_bools = i + 1;
WRAP_CONCAT;
}
}
- if (column != INDENT)
+ if (column != INDENT && height > 1)
force_wrap();
for_each_number(j, tterm) {
predval = pred(NUMBER, i);
if (predval != FAIL) {
if (tterm->Numbers[i] < 0) {
- sprintf(buffer, "%s@", name);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "%s@", name);
} else {
- sprintf(buffer, "%s#%d", name, tterm->Numbers[i]);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "%s#%d", name, tterm->Numbers[i]);
if (i + 1 > num_values)
num_values = i + 1;
}
}
}
- if (column != INDENT)
+ if (column != INDENT && height > 1)
force_wrap();
len += (int) (num_bools
if (PRESENT(insert_character) || PRESENT(parm_ich)) {
if (SAME_CAP(i, enter_insert_mode)
&& enter_insert_mode == ABSENT_STRING) {
- (void) strcpy(buffer, "im=");
+ _nc_STRCPY(buffer, "im=", sizeof(buffer));
WRAP_CONCAT;
continue;
}
if (SAME_CAP(i, exit_insert_mode)
&& exit_insert_mode == ABSENT_STRING) {
- (void) strcpy(buffer, "ei=");
+ _nc_STRCPY(buffer, "ei=", sizeof(buffer));
WRAP_CONCAT;
continue;
}
num_strings = i + 1;
if (!VALID_STRING(capability)) {
- sprintf(buffer, "%s@", name);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "%s@", name);
WRAP_CONCAT;
} else if (outform == F_TERMCAP || outform == F_TCONVERR) {
int params = ((i < (int) SIZEOF(parametrized))
if (cv == 0) {
if (outform == F_TCONVERR) {
- sprintf(buffer, "%s=!!! %s WILL NOT CONVERT !!!",
- name, srccap);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "%s=!!! %s WILL NOT CONVERT !!!",
+ name, srccap);
} else if (suppress_untranslatable) {
continue;
} else {
char *s = srccap, *d = buffer;
- sprintf(d, "..%s=", name);
+ _nc_SPRINTF(d, _nc_SLIMIT(sizeof(buffer)) "..%s=", name);
d += strlen(d);
while ((*d = *s++) != 0) {
if (*d == ':') {
}
}
} else {
- sprintf(buffer, "%s=%s", name, cv);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "%s=%s", name, cv);
}
len += (int) strlen(capability) + 1;
WRAP_CONCAT;
*/
if (tversion == V_HPUX) {
if (VALID_STRING(memory_lock)) {
- (void) sprintf(buffer, "meml=%s", memory_lock);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "meml=%s", memory_lock);
WRAP_CONCAT;
}
if (VALID_STRING(memory_unlock)) {
- (void) sprintf(buffer, "memu=%s", memory_unlock);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "memu=%s", memory_unlock);
WRAP_CONCAT;
}
} else if (tversion == V_AIX) {
tp[0] = '\0';
if (box_ok) {
- (void) strcpy(buffer, "box1=");
- (void) strcat(buffer, _nc_tic_expand(boxchars,
- outform == F_TERMINFO, numbers));
+ _nc_STRCPY(buffer, "box1=", sizeof(buffer));
+ _nc_STRCAT(buffer,
+ _nc_tic_expand(boxchars,
+ outform == F_TERMINFO, numbers),
+ sizeof(buffer));
WRAP_CONCAT;
}
}
char name[10];
for (n = 0; n <= 10; ++n) {
- sprintf(name, "lf%d", n);
+ _nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "lf%d", n);
if ((cap = find_string(tterm, name)) != ABSENT_STRING
&& kill_string(tterm, cap)) {
target -= (int) (strlen(cap) + 5);
char name[10];
for (n = 60; n >= 0; --n) {
- sprintf(name, "kf%d", n);
+ _nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "kf%d", n);
if ((cap = find_string(tterm, name)) != ABSENT_STRING
&& kill_string(tterm, cap)) {
target -= (int) (strlen(cap) + 5);
if (outform == F_TERMCAP || outform == F_TCONVERR)
trim_trailing();
- (void) sprintf(buffer, "%s%s", infodump ? "use=" : "tc=", name);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+ "%s%s", infodump ? "use=" : "tc=", name);
wrap_concat(buffer);
}
int
show_entry(void)
{
- trim_trailing();
+ /*
+ * Trim any remaining whitespace.
+ */
+ if (outbuf.used != 0) {
+ bool infodump = (outform != F_TERMCAP && outform != F_TCONVERR);
+ char delim = infodump ? ',' : ':';
+ int j;
+
+ for (j = (int) outbuf.used - 1; j > 0; --j) {
+ char ch = outbuf.text[j];
+ if (ch == '\n') {
+ ;
+ } else if (isspace(UChar(ch))) {
+ outbuf.used = (size_t) j;
+ } else if (!infodump && ch == '\\') {
+ outbuf.used = (size_t) j;
+ } else if (ch == delim && (j == 0 || outbuf.text[j - 1] != '\\')) {
+ outbuf.used = (size_t) (j + 1);
+ } else {
+ break;
+ }
+ }
+ outbuf.text[outbuf.used] = '\0';
+ }
(void) fputs(outbuf.text, stdout);
putchar('\n');
return (int) outbuf.used;