X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Fdump_entry.c;h=dad3135f4fceec9ccca61e11c2de045ac8aaa138;hp=d9c309a5bb15e2425856bc846c50fafc147724c8;hb=b793748293cd1a764b1a858455399ad899b5a8a1;hpb=646aa4040ea415c39a376991d2d9658eff0fce77 diff --git a/progs/dump_entry.c b/progs/dump_entry.c index d9c309a5..dad3135f 100644 --- a/progs/dump_entry.c +++ b/progs/dump_entry.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2015,2016 Free Software Foundation, Inc. * + * Copyright (c) 1998-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 * @@ -39,10 +39,11 @@ #include "termsort.c" /* this C file is generated */ #include /* so is this */ -MODULE_ID("$Id: dump_entry.c,v 1.141 2016/10/02 01:28:04 tom Exp $") +MODULE_ID("$Id: dump_entry.c,v 1.152 2017/05/06 18:56:15 tom Exp $") #define DISCARD(string) string = ABSENT_STRING #define PRINTF (void) printf +#define WRAPPED 32 #define OkIndex(index,array) ((int)(index) >= 0 && (int)(index) < (int) SIZEOF(array)) #define TcOutput() (outform == F_TERMCAP || outform == F_TCONVERR) @@ -62,6 +63,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 wrapped; /* true if we wrap too-long strings */ +static bool did_wrap; /* true if last wrap_concat did wrapping */ static bool checking; /* true if we are checking for tic */ static int quickdump; /* true if we are dumping compiled data */ @@ -123,7 +125,7 @@ strncpy_DYN(DYNBUF * dst, const char *src, size_t need) if (dst->text == 0) failed("strncpy_DYN"); } - _nc_STRNCPY(dst->text + dst->used, src, need); + _nc_STRNCPY(dst->text + dst->used, src, need + 1); dst->used += need; dst->text[dst->used] = 0; } @@ -208,6 +210,8 @@ dump_init(const char *version, checking = check; quickdump = (quick & 3); + did_wrap = (width <= 0); + /* versions */ if (version == 0) tversion = V_ALLCAPS; @@ -295,7 +299,7 @@ dump_init(const char *version, _nc_progname, width, tversion, outform); } -static TERMTYPE *cur_type; +static TERMTYPE2 *cur_type; static int dump_predicate(PredType type, PredIdx idx) @@ -318,7 +322,7 @@ dump_predicate(PredType type, PredIdx idx) return (FALSE); /* pacify compiler */ } -static void set_obsolete_termcaps(TERMTYPE *tp); +static void set_obsolete_termcaps(TERMTYPE2 *tp); /* is this the index of a function key string? */ #define FNKEY(i) \ @@ -556,6 +560,7 @@ wrap_concat(const char *src) int gaps = (int) strlen(separator); int want = gaps + need; + did_wrap = (width <= 0); if (column > indent && column + want > width) { force_wrap(); @@ -565,14 +570,15 @@ wrap_concat(const char *src) (column + want) > width && (!TcOutput() || strncmp(src, "..", 2))) { int step = 0; - int used = width > 32 ? width : 32; - int size = used; + int used = width > WRAPPED ? width : WRAPPED; + int size; int base = 0; char *p, align[9]; const char *my_t = trailer; char *fill = fill_spaces(src); + int last = (int) strlen(fill); - need = (int) strlen(fill); + need = last; if (TcOutput()) trailer = "\\\n\t "; @@ -581,25 +587,30 @@ wrap_concat(const char *src) base = (int) (p + 1 - fill); if (base > 8) base = 8; - sprintf(align, "%*s", base, " "); + _nc_SPRINTF(align, _nc_SLIMIT(align) "%*s", base, " "); } else { align[base] = '\0'; } - while ((column + (need + gaps)) > used) { - size = used; - if (size > ((int) strlen(fill) - step)) { - size = ((int) strlen(fill) - step); - } - if (step) { - strcpy_DYN(&outbuf, align); - size -= base; + /* "pretty" overrides wrapping if it already split the line */ + if (!pretty || strchr(fill, '\n') == 0) { + while ((column + (need + gaps)) > used) { + size = used; + if (step) { + strcpy_DYN(&outbuf, align); + size -= base; + } + if (size > (last - step)) { + size = (last - step); + } + size = find_split(fill, step, size); + strncpy_DYN(&outbuf, fill + step, (size_t) size); + step += size; + need -= size; + if (need > 0) { + force_wrap(); + did_wrap = TRUE; + } } - size = find_split(fill, step, size); - strncpy_DYN(&outbuf, fill + step, (size_t) size); - step += size; - need -= size; - if (need > 0) - force_wrap(); } if (need > 0) { if (step) @@ -686,7 +697,7 @@ has_params(const char *src) } static char * -fmt_complex(TERMTYPE *tterm, const char *capability, char *src, int level) +fmt_complex(TERMTYPE2 *tterm, const char *capability, char *src, int level) { bool percent = FALSE; bool params = has_params(src); @@ -785,11 +796,33 @@ fmt_complex(TERMTYPE *tterm, const char *capability, char *src, int level) return src; } +/* + * Make "large" numbers a little easier to read by showing them in hexadecimal + * if they are "close" to a power of two. + */ +static const char * +number_format(int value) +{ + const char *result = "%d"; + if ((outform != F_TERMCAP) && (value > 255)) { + unsigned long lv = (unsigned long) value; + unsigned long mm; + int nn; + for (nn = 8; (mm = (1UL << nn)) != 0; ++nn) { + if ((mm - 16) <= lv && (mm + 16) > lv) { + result = "%#x"; + break; + } + } + } + return result; +} + #define SAME_CAP(n,cap) (&tterm->Strings[n] == &cap) #define EXTRA_CAP 20 int -fmt_entry(TERMTYPE *tterm, +fmt_entry(TERMTYPE2 *tterm, PredFunc pred, int content_only, int suppress_untranslatable, @@ -881,8 +914,13 @@ fmt_entry(TERMTYPE *tterm, _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s@", name); } else { + size_t nn; _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) - "%s#%d", name, tterm->Numbers[i]); + "%s#", name); + nn = strlen(buffer); + _nc_SPRINTF(buffer + nn, _nc_SLIMIT(sizeof(buffer) - nn) + number_format(tterm->Numbers[i]), + tterm->Numbers[i]); if (i + 1 > num_values) num_values = i + 1; } @@ -1138,9 +1176,11 @@ fmt_entry(TERMTYPE *tterm, if (outcount) { bool trimmed = FALSE; j = (PredIdx) outbuf.used; - if (j >= 2 - && outbuf.text[j - 1] == '\t' - && outbuf.text[j - 2] == '\n') { + if (wrapped && did_wrap) { + /* EMPTY */ ; + } else if (j >= 2 + && outbuf.text[j - 1] == '\t' + && outbuf.text[j - 2] == '\n') { outbuf.used -= 2; trimmed = TRUE; } else if (j >= 4 @@ -1175,7 +1215,7 @@ fmt_entry(TERMTYPE *tterm, } static bool -kill_string(TERMTYPE *tterm, char *cap) +kill_string(TERMTYPE2 *tterm, char *cap) { unsigned n; for (n = 0; n < NUM_STRINGS(tterm); ++n) { @@ -1188,7 +1228,7 @@ kill_string(TERMTYPE *tterm, char *cap) } static char * -find_string(TERMTYPE *tterm, char *name) +find_string(TERMTYPE2 *tterm, char *name) { PredIdx n; for (n = 0; n < NUM_STRINGS(tterm); ++n) { @@ -1209,7 +1249,7 @@ find_string(TERMTYPE *tterm, char *name) * make it smaller. */ static int -kill_labels(TERMTYPE *tterm, int target) +kill_labels(TERMTYPE2 *tterm, int target) { int n; int result = 0; @@ -1234,7 +1274,7 @@ kill_labels(TERMTYPE *tterm, int target) * make it smaller. */ static int -kill_fkeys(TERMTYPE *tterm, int target) +kill_fkeys(TERMTYPE2 *tterm, int target) { int n; int result = 0; @@ -1288,7 +1328,7 @@ one_one_mapping(const char *mapping) #define SHOW_WHY PRINTF static bool -purged_acs(TERMTYPE *tterm) +purged_acs(TERMTYPE2 *tterm) { bool result = FALSE; @@ -1315,16 +1355,16 @@ encode_b64(char *target, char *source, unsigned state, int *saved) switch (state % 3) { case 0: - *target++ = data[ch & 077]; - *saved = (ch >> 6) & 3; + *target++ = data[(ch >> 2) & 077]; + *saved = (ch << 4); break; case 1: - *target++ = data[((ch << 2) | *saved) & 077]; - *saved = (ch >> 4) & 017; + *target++ = data[((ch >> 4) | *saved) & 077]; + *saved = (ch << 2); break; case 2: - *target++ = data[((ch << 4) | *saved) & 077]; - *target++ = data[(ch >> 2) & 077]; + *target++ = data[((ch >> 6) | *saved) & 077]; + *target++ = data[ch & 077]; *saved = 0; break; } @@ -1335,13 +1375,13 @@ encode_b64(char *target, char *source, unsigned state, int *saved) * Dump a single entry. */ void -dump_entry(TERMTYPE *tterm, +dump_entry(TERMTYPE2 *tterm, int suppress_untranslatable, int limited, int numbers, PredFunc pred) { - TERMTYPE save_tterm; + TERMTYPE2 save_tterm; int len, critlen; const char *legend; bool infodump; @@ -1366,6 +1406,8 @@ dump_entry(TERMTYPE *tterm, } } if (quickdump & 2) { + static char padding[] = + {0, 0}; int value = 0; if (outbuf.used) wrap_concat("\n"); @@ -1378,10 +1420,14 @@ dump_entry(TERMTYPE *tterm, case 0: break; case 1: - wrap_concat("==="); + encode_b64(numbuf, padding, 1, &value); + wrap_concat(numbuf); + wrap_concat("=="); break; case 2: - wrap_concat("=="); + encode_b64(numbuf, padding, 1, &value); + wrap_concat(numbuf); + wrap_concat("="); break; } } @@ -1547,7 +1593,7 @@ show_entry(void) void compare_entry(PredHook hook, - TERMTYPE *tp GCC_UNUSED, + TERMTYPE2 *tp GCC_UNUSED, bool quiet) /* compare two entries */ { @@ -1606,7 +1652,7 @@ compare_entry(PredHook hook, #define CUR tp-> static void -set_obsolete_termcaps(TERMTYPE *tp) +set_obsolete_termcaps(TERMTYPE2 *tp) { #include "capdefaults.c" } @@ -1616,7 +1662,7 @@ set_obsolete_termcaps(TERMTYPE *tp) * unique. */ void -repair_acsc(TERMTYPE *tp) +repair_acsc(TERMTYPE2 *tp) { if (VALID_STRING(acs_chars)) { size_t n, m;