/****************************************************************************
- * 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 *
#include "termsort.c" /* this C file is generated */
#include <parametrized.h> /* 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.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)
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 */
checking = check;
quickdump = (quick & 3);
+ did_wrap = (width <= 0);
+
/* versions */
if (version == 0)
tversion = V_ALLCAPS;
_nc_progname, width, tversion, outform);
}
-static TERMTYPE *cur_type;
+static TERMTYPE2 *cur_type;
static int
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) \
int gaps = (int) strlen(separator);
int want = gaps + need;
+ did_wrap = (width <= 0);
if (column > indent
&& column + want > width) {
force_wrap();
(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 ";
} 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)
}
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);
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,
_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;
}
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
}
static bool
-kill_string(TERMTYPE *tterm, char *cap)
+kill_string(TERMTYPE2 *tterm, char *cap)
{
unsigned n;
for (n = 0; n < NUM_STRINGS(tterm); ++n) {
}
static char *
-find_string(TERMTYPE *tterm, char *name)
+find_string(TERMTYPE2 *tterm, char *name)
{
PredIdx n;
for (n = 0; n < NUM_STRINGS(tterm); ++n) {
* make it smaller.
*/
static int
-kill_labels(TERMTYPE *tterm, int target)
+kill_labels(TERMTYPE2 *tterm, int target)
{
int n;
int result = 0;
* make it smaller.
*/
static int
-kill_fkeys(TERMTYPE *tterm, int target)
+kill_fkeys(TERMTYPE2 *tterm, int target)
{
int n;
int result = 0;
#define SHOW_WHY PRINTF
static bool
-purged_acs(TERMTYPE *tterm)
+purged_acs(TERMTYPE2 *tterm)
{
bool result = FALSE;
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;
}
* 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;
}
}
if (quickdump & 2) {
+ static char padding[] =
+ {0, 0};
int value = 0;
if (outbuf.used)
wrap_concat("\n");
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;
}
}
void
compare_entry(PredHook hook,
- TERMTYPE *tp GCC_UNUSED,
+ TERMTYPE2 *tp GCC_UNUSED,
bool quiet)
/* compare two entries */
{
#define CUR tp->
static void
-set_obsolete_termcaps(TERMTYPE *tp)
+set_obsolete_termcaps(TERMTYPE2 *tp)
{
#include "capdefaults.c"
}
* unique.
*/
void
-repair_acsc(TERMTYPE *tp)
+repair_acsc(TERMTYPE2 *tp)
{
if (VALID_STRING(acs_chars)) {
size_t n, m;