X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Fdump_entry.c;h=19d6cde72a233e7648acb78807bce2be2033982b;hp=55fe907a3d180f9c61151bfd01e66c2de38dc575;hb=4aaab5e7c855d212deaa53608a08de5648fd86f6;hpb=fe7c48d7d5115212f09b4ec0d84b189a76953f0d diff --git a/progs/dump_entry.c b/progs/dump_entry.c index 55fe907a..19d6cde7 100644 --- a/progs/dump_entry.c +++ b/progs/dump_entry.c @@ -39,9 +39,8 @@ #include "termsort.c" /* this C file is generated */ #include /* so is this */ -MODULE_ID("$Id: dump_entry.c,v 1.115 2015/05/27 00:57:40 tom Exp $") +MODULE_ID("$Id: dump_entry.c,v 1.123 2015/09/05 23:31:12 tom Exp $") -#define INDENT 8 #define DISCARD(string) string = ABSENT_STRING #define PRINTF (void) printf @@ -62,6 +61,7 @@ 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; @@ -75,6 +75,7 @@ static NCURSES_CONST char *const *num_names; 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) */ @@ -156,17 +157,17 @@ _nc_leaks_dump_entry(void) #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); @@ -180,6 +181,7 @@ nametrans(const char *name) NameTrans(str_from_termcap, strcodes); break; } + } return (0); } @@ -192,13 +194,15 @@ dump_init(const char *version, int theight, unsigned traceval, bool formatted, - bool check) + bool check, + int quick) /* set up for entry display */ { width = twidth; height = theight; pretty = formatted; checking = check; + quickdump = (quick & 3); /* versions */ if (version == 0) @@ -243,6 +247,7 @@ dump_init(const char *version, trailer = "\\\n\t:"; break; } + indent = 8; /* implement sort modes */ switch (sortmode = sort) { @@ -412,7 +417,7 @@ force_wrap(void) oldcol = column; trim_trailing(); strcpy_DYN(&outbuf, trailer); - column = INDENT; + column = indent; } static void @@ -421,7 +426,7 @@ wrap_concat(const char *src) size_t need = strlen(src); size_t want = strlen(separator) + need; - if (column > INDENT + if (column > indent && column + (int) want > width) { force_wrap(); } @@ -627,7 +632,7 @@ fmt_entry(TERMTYPE *tterm, 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); @@ -670,7 +675,7 @@ fmt_entry(TERMTYPE *tterm, } } - if (column != INDENT && height > 1) + if (column != indent && height > 1) force_wrap(); for_each_number(j, tterm) { @@ -698,7 +703,7 @@ fmt_entry(TERMTYPE *tterm, } } - if (column != INDENT && height > 1) + if (column != indent && height > 1) force_wrap(); len += (int) (num_bools @@ -777,6 +782,10 @@ fmt_entry(TERMTYPE *tterm, 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; } @@ -1107,6 +1116,34 @@ purged_acs(TERMTYPE *tterm) 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. */ @@ -1122,6 +1159,48 @@ dump_entry(TERMTYPE *tterm, 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"; @@ -1271,8 +1350,10 @@ show_entry(void) } 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; }