X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Fdump_entry.c;h=db4071877a3cd3dfd577d36992741c8c8816d426;hp=87e3ce332fa0c9d51fefa56a4032e45f2c705560;hb=3eda6f30a84d53844d2ebceadb457e2e7e9cfbf3;hpb=7af63696972b12659832a1c3413d9ace9641c8f6 diff --git a/progs/dump_entry.c b/progs/dump_entry.c index 87e3ce33..db407187 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.143 2016/10/09 01:30:14 tom Exp $") +MODULE_ID("$Id: dump_entry.c,v 1.149 2017/03/04 20:18:20 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 */ @@ -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; @@ -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 "; @@ -585,21 +591,26 @@ wrap_concat(const char *src) } 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) @@ -1138,9 +1149,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 @@ -1315,16 +1328,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; } @@ -1366,6 +1379,8 @@ dump_entry(TERMTYPE *tterm, } } if (quickdump & 2) { + static char padding[] = + {0, 0}; int value = 0; if (outbuf.used) wrap_concat("\n"); @@ -1378,10 +1393,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; } }