/****************************************************************************
- * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2014,2015 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.110 2013/11/16 19:58:01 tom Exp $")
+MODULE_ID("$Id: dump_entry.c,v 1.124 2015/11/28 22:54:33 tom Exp $")
-#define INDENT 8
#define DISCARD(string) string = ABSENT_STRING
#define PRINTF (void) printf
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 */
+static bool checking; /* true if we are checking for tic */
+static int quickdump; /* true if we are dumping compiled data */
static char *save_sgr;
static NCURSES_CONST char *const *str_names;
static const char *separator = "", *trailer = "";
+static int indent = 8;
/* cover various ports and variants of terminfo */
#define V_ALLCAPS 0 /* all capabilities (SVr4, XSI, ncurses) */
#endif
#define NameTrans(check,result) \
- if (OkIndex(np->nte_index, check) \
+ if ((np->nte_index <= OK_ ## check) \
&& check[np->nte_index]) \
return (result[np->nte_index])
NCURSES_CONST char *
nametrans(const char *name)
-/* translate a capability name from termcap to terminfo */
+/* translate a capability name to termcap from terminfo */
{
const struct name_table_entry *np;
- if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0)
+ if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) {
switch (np->nte_type) {
case BOOLEAN:
NameTrans(bool_from_termcap, boolcodes);
NameTrans(str_from_termcap, strcodes);
break;
}
+ }
return (0);
}
int twidth,
int theight,
unsigned traceval,
- bool formatted)
+ bool formatted,
+ bool check,
+ int quick)
/* set up for entry display */
{
width = twidth;
height = theight;
pretty = formatted;
+ checking = check;
+ quickdump = (quick & 3);
/* versions */
if (version == 0)
trailer = "\\\n\t:";
break;
}
+ indent = 8;
/* implement sort modes */
switch (sortmode = sort) {
oldcol = column;
trim_trailing();
strcpy_DYN(&outbuf, trailer);
- column = INDENT;
+ column = indent;
}
static void
size_t need = strlen(src);
size_t want = strlen(separator) + need;
- if (column > INDENT
+ if (column > indent
&& column + (int) want > width) {
force_wrap();
}
int n;
for (n = 0; n < level; n++)
- strncpy_DYN(buffer, "\t", 1);
+ strncpy_DYN(buffer, "\t", (size_t) 1);
}
-static bool
+bool
has_params(const char *src)
{
bool result = FALSE;
bool params = FALSE;
for (n = 0; n < len - 1; ++n) {
- if (!strncmp(src + n, "%p", 2)) {
+ if (!strncmp(src + n, "%p", (size_t) 2)) {
params = TRUE;
- } else if (!strncmp(src + n, "%;", 2)) {
+ } else if (!strncmp(src + n, "%;", (size_t) 2)) {
ifthen = TRUE;
result = params;
break;
while (*src != '\0') {
switch (*src) {
+ case '^':
+ percent = FALSE;
+ strncpy_DYN(&tmpbuf, src++, (size_t) 1);
+ break;
case '\\':
percent = FALSE;
- strncpy_DYN(&tmpbuf, src++, 1);
+ strncpy_DYN(&tmpbuf, src++, (size_t) 1);
break;
case '%':
percent = TRUE;
/* treat a "%e" as else-if, on the same level */
if (*src == 'e') {
indent_DYN(&tmpbuf, level);
- strncpy_DYN(&tmpbuf, "%", 1);
- strncpy_DYN(&tmpbuf, src, 1);
+ strncpy_DYN(&tmpbuf, "%", (size_t) 1);
+ strncpy_DYN(&tmpbuf, src, (size_t) 1);
src++;
params = has_params(src);
if (!params && *src != '\0' && *src != '%') {
- strncpy_DYN(&tmpbuf, "\n", 1);
+ strncpy_DYN(&tmpbuf, "\n", (size_t) 1);
indent_DYN(&tmpbuf, level + 1);
}
} else {
indent_DYN(&tmpbuf, level + 1);
- strncpy_DYN(&tmpbuf, "%", 1);
- strncpy_DYN(&tmpbuf, src, 1);
+ strncpy_DYN(&tmpbuf, "%", (size_t) 1);
+ strncpy_DYN(&tmpbuf, src, (size_t) 1);
if (*src++ == '?') {
src = fmt_complex(tterm, capability, src, level + 1);
if (*src != '\0' && *src != '%') {
- strncpy_DYN(&tmpbuf, "\n", 1);
+ strncpy_DYN(&tmpbuf, "\n", (size_t) 1);
indent_DYN(&tmpbuf, level + 1);
}
} else if (level == 1) {
- _nc_warning("%s: %%%c without %%? in %s",
- _nc_first_name(tterm->term_names),
- *src, capability);
+ if (checking)
+ _nc_warning("%s: %%%c without %%? in %s",
+ _nc_first_name(tterm->term_names),
+ *src, capability);
}
}
continue;
if (level > 1) {
tmpbuf.text[tmpbuf.used - 1] = '\n';
indent_DYN(&tmpbuf, level);
- strncpy_DYN(&tmpbuf, "%", 1);
- strncpy_DYN(&tmpbuf, src++, 1);
+ strncpy_DYN(&tmpbuf, "%", (size_t) 1);
+ strncpy_DYN(&tmpbuf, src++, (size_t) 1);
if (src[0] == '%'
&& src[1] != '\0'
&& (strchr("?e;", src[1])) == 0) {
}
return src;
}
- _nc_warning("%s: %%; without %%? in %s",
- _nc_first_name(tterm->term_names),
- capability);
+ if (checking)
+ _nc_warning("%s: %%; without %%? in %s",
+ _nc_first_name(tterm->term_names),
+ capability);
}
break;
case 'p':
if (percent && params) {
tmpbuf.text[tmpbuf.used - 1] = '\n';
indent_DYN(&tmpbuf, level + 1);
- strncpy_DYN(&tmpbuf, "%", 1);
+ strncpy_DYN(&tmpbuf, "%", (size_t) 1);
}
params = FALSE;
percent = FALSE;
break;
case ' ':
- strncpy_DYN(&tmpbuf, "\\s", 2);
+ strncpy_DYN(&tmpbuf, "\\s", (size_t) 2);
++src;
continue;
default:
percent = FALSE;
break;
}
- strncpy_DYN(&tmpbuf, src++, 1);
+ strncpy_DYN(&tmpbuf, src++, (size_t) 1);
}
return src;
}
int
fmt_entry(TERMTYPE *tterm,
PredFunc pred,
- bool content_only,
- bool suppress_untranslatable,
- bool infodump,
+ int content_only,
+ int suppress_untranslatable,
+ int infodump,
int numbers)
{
PredIdx i, j;
strcpy_DYN(&outbuf, 0);
if (content_only) {
- column = INDENT; /* FIXME: workaround to prevent empty lines */
+ column = indent; /* FIXME: workaround to prevent empty lines */
} else {
strcpy_DYN(&outbuf, tterm->term_names);
}
}
- if (column != INDENT && height > 1)
+ if (column != indent && height > 1)
force_wrap();
for_each_number(j, tterm) {
}
}
- if (column != INDENT && height > 1)
+ if (column != indent && height > 1)
force_wrap();
len += (int) (num_bools
trimmed_sgr0 = _nc_trim_sgr0(tterm);
if (strcmp(capability, trimmed_sgr0))
capability = trimmed_sgr0;
+ else {
+ if (trimmed_sgr0 != exit_attribute_mode)
+ free(trimmed_sgr0);
+ }
set_attributes = my_sgr;
}
"%s@", name);
WRAP_CONCAT;
} else if (outform == F_TERMCAP || outform == F_TCONVERR) {
- int params = ((i < (int) SIZEOF(parametrized))
- ? parametrized[i]
- : 0);
char *srccap = _nc_tic_expand(capability, TRUE, numbers);
+ int params = (((i < (int) SIZEOF(parametrized)) &&
+ (i < STRCOUNT))
+ ? parametrized[i]
+ : ((*srccap == 'k')
+ ? 0
+ : has_params(srccap)));
char *cv = _nc_infotocap(name, srccap, params);
if (cv == 0) {
return result;
}
+static void
+encode_b64(char *target, char *source, unsigned state, int *saved)
+{
+ /* RFC-4648 */
+ static const char data[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789" "-_";
+ int ch = UChar(source[state]);
+
+ switch (state % 3) {
+ case 0:
+ *target++ = data[ch & 077];
+ *saved = (ch >> 6) & 3;
+ break;
+ case 1:
+ *target++ = data[((ch << 2) | *saved) & 077];
+ *saved = (ch >> 4) & 017;
+ break;
+ case 2:
+ *target++ = data[((ch << 4) | *saved) & 077];
+ *target++ = data[(ch >> 2) & 077];
+ *saved = 0;
+ break;
+ }
+ *target = '\0';
+}
+
/*
* Dump a single entry.
*/
void
dump_entry(TERMTYPE *tterm,
- bool suppress_untranslatable,
- bool limited,
+ int suppress_untranslatable,
+ int limited,
int numbers,
PredFunc pred)
{
const char *legend;
bool infodump;
+ if (quickdump) {
+ char bigbuf[65536];
+ unsigned n;
+ unsigned offset = 0;
+ separator = "";
+ trailer = "\n";
+ indent = 0;
+ if (_nc_write_object(tterm, bigbuf, &offset, sizeof(bigbuf)) == OK) {
+ char numbuf[80];
+ if (quickdump & 1) {
+ if (outbuf.used)
+ wrap_concat("\n");
+ wrap_concat("hex:");
+ for (n = 0; n < offset; ++n) {
+ sprintf(numbuf, "%02X", UChar(bigbuf[n]));
+ wrap_concat(numbuf);
+ }
+ }
+ if (quickdump & 2) {
+ int value = 0;
+ if (outbuf.used)
+ wrap_concat("\n");
+ wrap_concat("b64:");
+ for (n = 0; n < offset; ++n) {
+ encode_b64(numbuf, bigbuf, n, &value);
+ wrap_concat(numbuf);
+ }
+ switch (n % 3) {
+ case 0:
+ break;
+ case 1:
+ wrap_concat("===");
+ break;
+ case 2:
+ wrap_concat("==");
+ break;
+ }
+ }
+ }
+ return;
+ }
+
if (outform == F_TERMCAP || outform == F_TCONVERR) {
critlen = MAX_TERMCAP_LENGTH;
legend = "older termcap";
}
outbuf.text[outbuf.used] = '\0';
}
- (void) fputs(outbuf.text, stdout);
- putchar('\n');
+ if (outbuf.text != 0) {
+ (void) fputs(outbuf.text, stdout);
+ putchar('\n');
+ }
return (int) outbuf.used;
}