]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/dump_entry.c
ncurses 6.0 - patch 20150912
[ncurses.git] / progs / dump_entry.c
index 0f6a8b05bab399521c8033541c3bb0f67aab74d5..19d6cde72a233e7648acb78807bce2be2033982b 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2013,2014 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            *
@@ -39,9 +39,8 @@
 #include "termsort.c"          /* this C file is generated */
 #include <parametrized.h>      /* so is this */
 
-MODULE_ID("$Id: dump_entry.c,v 1.114 2014/10/18 09:32:54 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
 
@@ -61,6 +60,8 @@ static int height = 65535;    /* max number of lines for listings */
 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;
 
@@ -74,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) */
@@ -155,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);
@@ -179,6 +181,7 @@ nametrans(const char *name)
            NameTrans(str_from_termcap, strcodes);
            break;
        }
+    }
 
     return (0);
 }
@@ -190,12 +193,16 @@ dump_init(const char *version,
          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)
@@ -240,6 +247,7 @@ dump_init(const char *version,
        trailer = "\\\n\t:";
        break;
     }
+    indent = 8;
 
     /* implement sort modes */
     switch (sortmode = sort) {
@@ -409,7 +417,7 @@ force_wrap(void)
     oldcol = column;
     trim_trailing();
     strcpy_DYN(&outbuf, trailer);
-    column = INDENT;
+    column = indent;
 }
 
 static void
@@ -418,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();
     }
@@ -537,9 +545,10 @@ fmt_complex(TERMTYPE *tterm, const char *capability, char *src, int level)
                            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;
@@ -561,9 +570,10 @@ fmt_complex(TERMTYPE *tterm, const char *capability, char *src, int level)
                    }
                    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':
@@ -622,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);
 
@@ -665,7 +675,7 @@ fmt_entry(TERMTYPE *tterm,
        }
     }
 
-    if (column != INDENT && height > 1)
+    if (column != indent && height > 1)
        force_wrap();
 
     for_each_number(j, tterm) {
@@ -693,7 +703,7 @@ fmt_entry(TERMTYPE *tterm,
        }
     }
 
-    if (column != INDENT && height > 1)
+    if (column != indent && height > 1)
        force_wrap();
 
     len += (int) (num_bools
@@ -772,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;
                }
@@ -1102,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.
  */
@@ -1117,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";
@@ -1266,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;
 }