X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Fdump_entry.c;h=241fc1dc82e38a4e513d21e34c6c04e8e52a5aeb;hp=f62d5c172bd57f78823af2a02b8f58c12c839205;hb=37419a9e525f087444051c12ccadf5ef347dcb2b;hpb=8b06e371ed1bce3dd6f37138e6becb5e1a562fe0 diff --git a/progs/dump_entry.c b/progs/dump_entry.c index f62d5c17..241fc1dc 100644 --- a/progs/dump_entry.c +++ b/progs/dump_entry.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * + * Copyright (c) 1998-2012,2013 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,7 +39,7 @@ #include "termsort.c" /* this C file is generated */ #include /* so is this */ -MODULE_ID("$Id: dump_entry.c,v 1.97 2012/02/23 00:00:08 tom Exp $") +MODULE_ID("$Id: dump_entry.c,v 1.109 2013/05/04 18:48:56 tom Exp $") #define INDENT 8 #define DISCARD(string) string = ABSENT_STRING @@ -73,7 +73,7 @@ static NCURSES_CONST char *const *bool_names; static NCURSES_CONST char *const *num_names; static NCURSES_CONST char *const *str_names; -static const char *separator, *trailer; +static const char *separator = "", *trailer = ""; /* cover various ports and variants of terminfo */ #define V_ALLCAPS 0 /* all capabilities (SVr4, XSI, ncurses) */ @@ -100,6 +100,15 @@ static const char *separator, *trailer; #define StrIndirect(j) ((sortmode == S_NOSORT) ? (j) : str_indirect[j]) #endif +static void failed(const char *) GCC_NORETURN; + +static void +failed(const char *s) +{ + perror(s); + ExitProgram(EXIT_FAILURE); +} + static void strncpy_DYN(DYNBUF * dst, const char *src, size_t need) { @@ -107,6 +116,8 @@ strncpy_DYN(DYNBUF * dst, const char *src, size_t need) if (want > dst->size) { dst->size += (want + 1024); /* be generous */ dst->text = typeRealloc(char, dst->size, dst->text); + if (dst->text == 0) + failed("strncpy_DYN"); } (void) strncpy(dst->text + dst->used, src, need); dst->used += need; @@ -298,7 +309,11 @@ dump_predicate(PredType type, PredIdx idx) static void set_obsolete_termcaps(TERMTYPE *tp); /* is this the index of a function key string? */ -#define FNKEY(i) (((i)<= 65 && (i)>= 75) || ((i)<= 216 && (i)>= 268)) +#define FNKEY(i) \ + (((i) >= STR_IDX(key_f0) && \ + (i) <= STR_IDX(key_f9)) || \ + ((i) >= STR_IDX(key_f11) && \ + (i) <= STR_IDX(key_f63))) /* * If we configure with a different Caps file, the offsets into the arrays @@ -480,7 +495,7 @@ has_params(const char *src) } static char * -fmt_complex(char *src, int level) +fmt_complex(TERMTYPE *tterm, const char *capability, char *src, int level) { bool percent = FALSE; bool params = has_params(src); @@ -516,13 +531,15 @@ fmt_complex(char *src, int level) strncpy_DYN(&tmpbuf, "%", 1); strncpy_DYN(&tmpbuf, src, 1); if (*src++ == '?') { - src = fmt_complex(src, level + 1); + src = fmt_complex(tterm, capability, src, level + 1); if (*src != '\0' && *src != '%') { strncpy_DYN(&tmpbuf, "\n", 1); indent_DYN(&tmpbuf, level + 1); } } else if (level == 1) { - _nc_warning("%%%c without %%?", *src); + _nc_warning("%s: %%%c without %%? in %s", + _nc_first_name(tterm->term_names), + *src, capability); } } continue; @@ -536,9 +553,17 @@ fmt_complex(char *src, int level) indent_DYN(&tmpbuf, level); strncpy_DYN(&tmpbuf, "%", 1); strncpy_DYN(&tmpbuf, src++, 1); + if (src[0] == '%' + && src[1] != '\0' + && (strchr("?e;", src[1])) == 0) { + tmpbuf.text[tmpbuf.used++] = '\n'; + indent_DYN(&tmpbuf, level); + } return src; } - _nc_warning("%%; without %%?"); + _nc_warning("%s: %%; without %%? in %s", + _nc_first_name(tterm->term_names), + capability); } break; case 'p': @@ -631,7 +656,7 @@ fmt_entry(TERMTYPE *tterm, predval = pred(BOOLEAN, i); if (predval != FAIL) { - _nc_STRCAT(buffer, name, sizeof(buffer)); + _nc_STRCPY(buffer, name, sizeof(buffer)); if (predval <= 0) _nc_STRCAT(buffer, "@", sizeof(buffer)); else if (i + 1 > num_bools) @@ -721,14 +746,14 @@ fmt_entry(TERMTYPE *tterm, if (PRESENT(insert_character) || PRESENT(parm_ich)) { if (SAME_CAP(i, enter_insert_mode) && enter_insert_mode == ABSENT_STRING) { - _nc_STRCAT(buffer, "im=", sizeof(buffer)); + _nc_STRCPY(buffer, "im=", sizeof(buffer)); WRAP_CONCAT; continue; } if (SAME_CAP(i, exit_insert_mode) && exit_insert_mode == ABSENT_STRING) { - _nc_STRCAT(buffer, "ei=", sizeof(buffer)); + _nc_STRCPY(buffer, "ei=", sizeof(buffer)); WRAP_CONCAT; continue; } @@ -809,7 +834,7 @@ fmt_entry(TERMTYPE *tterm, if (pretty && (outform == F_TERMINFO || outform == F_VARIABLE)) { - fmt_complex(src, 1); + fmt_complex(tterm, name, src, 1); } else { strcpy_DYN(&tmpbuf, src); } @@ -819,7 +844,9 @@ fmt_entry(TERMTYPE *tterm, } } /* e.g., trimmed_sgr0 */ - if (capability != tterm->Strings[i]) + if (capability != ABSENT_STRING && + capability != CANCELLED_STRING && + capability != tterm->Strings[i]) free(capability); } len += (int) (num_strings * 2); @@ -860,11 +887,41 @@ fmt_entry(TERMTYPE *tterm, tp[0] = '\0'; if (box_ok) { - _nc_STRCAT(buffer, "box1=", sizeof(buffer)); - _nc_STRCAT(buffer, - _nc_tic_expand(boxchars, - outform == F_TERMINFO, numbers), - sizeof(buffer)); + char *tmp = _nc_tic_expand(boxchars, + (outform == F_TERMINFO), + numbers); + _nc_STRCPY(buffer, "box1=", sizeof(buffer)); + while (*tmp != '\0') { + size_t have = strlen(buffer); + size_t next = strlen(tmp); + size_t want = have + next + 1; + size_t last = next; + char save = '\0'; + + /* + * If the expanded string is too long for the buffer, + * chop it off and save the location where we chopped it. + */ + if (want >= sizeof(buffer)) { + save = tmp[last]; + tmp[last] = '\0'; + } + _nc_STRCAT(buffer, tmp, sizeof(buffer)); + + /* + * If we chopped the buffer, replace the missing piece and + * shift everything to append the remainder. + */ + if (save != '\0') { + next = 0; + tmp[last] = save; + while ((tmp[next] = tmp[last + next]) != '\0') { + ++next; + } + } else { + break; + } + } WRAP_CONCAT; } } @@ -1187,7 +1244,7 @@ show_entry(void) */ if (outbuf.used != 0) { bool infodump = (outform != F_TERMCAP && outform != F_TCONVERR); - char delim = infodump ? ',' : ':'; + char delim = (char) (infodump ? ',' : ':'); int j; for (j = (int) outbuf.used - 1; j > 0; --j) { @@ -1195,11 +1252,11 @@ show_entry(void) if (ch == '\n') { ; } else if (isspace(UChar(ch))) { - outbuf.used = j; + outbuf.used = (size_t) j; } else if (!infodump && ch == '\\') { - outbuf.used = j; + outbuf.used = (size_t) j; } else if (ch == delim && (j == 0 || outbuf.text[j - 1] != '\\')) { - outbuf.used = (j + 1); + outbuf.used = (size_t) (j + 1); } else { break; }