+ int percent = 0;
+ int n;
+ bool if_then = strstr(src, "%?") != 0;
+ bool params = !if_then && (strlen(src) > 50) && (strstr(src, "%p") != 0);
+
+ while (*src != '\0') {
+ switch (*src) {
+ case '\\':
+ percent = 0;
+ strncpy_DYN(&tmpbuf, src++, 1);
+ break;
+ case '%':
+ percent = 1;
+ break;
+ case '?': /* "if" */
+ case 't': /* "then" */
+ case 'e': /* "else" */
+ if (percent) {
+ percent = 0;
+ tmpbuf.text[tmpbuf.used - 1] = '\n';
+ /* treat a "%e%?" as else-if, on the same level */
+ if (!strncmp(src, "e%?", 3)) {
+ for (n = 0; n < level; n++)
+ strncpy_DYN(&tmpbuf, "\t", 1);
+ strncpy_DYN(&tmpbuf, "%", 1);
+ strncpy_DYN(&tmpbuf, src, 3);
+ src += 3;
+ } else {
+ for (n = 0; n <= level; n++)
+ strncpy_DYN(&tmpbuf, "\t", 1);
+ strncpy_DYN(&tmpbuf, "%", 1);
+ strncpy_DYN(&tmpbuf, src, 1);
+ if (*src++ == '?') {
+ src = fmt_complex(src, level + 1);
+ } else if (level == 1) {
+ _nc_warning("%%%c without %%?", *src);
+ }
+ }
+ continue;
+ }
+ break;
+ case ';': /* "endif" */
+ if (percent) {
+ percent = 0;
+ if (level > 1) {
+ tmpbuf.text[tmpbuf.used - 1] = '\n';
+ for (n = 0; n < level; n++)
+ strncpy_DYN(&tmpbuf, "\t", 1);
+ strncpy_DYN(&tmpbuf, "%", 1);
+ strncpy_DYN(&tmpbuf, src++, 1);
+ return src;
+ }
+ _nc_warning("%%; without %%?");
+ }
+ break;
+ case 'p':
+ if (percent && params) {
+ tmpbuf.text[tmpbuf.used - 1] = '\n';
+ for (n = 0; n <= level; n++)
+ strncpy_DYN(&tmpbuf, "\t", 1);
+ strncpy_DYN(&tmpbuf, "%", 1);
+ }
+ percent = 0;
+ break;
+ default:
+ percent = 0;
+ break;
+ }
+ strncpy_DYN(&tmpbuf, src++, 1);
+ }
+ return src;
+}
+
+#define SAME_CAP(n,cap) (&tterm->Strings[n] == &cap)
+
+int
+fmt_entry(TERMTYPE *tterm,
+ PredFunc pred,
+ bool content_only,
+ bool suppress_untranslatable,
+ bool infodump,
+ int numbers)
+{
+ PredIdx i, j;
+ char buffer[MAX_TERMINFO_LENGTH];
+ char *capability;
+ NCURSES_CONST char *name;
+ int predval, len;
+ PredIdx num_bools = 0;
+ PredIdx num_values = 0;
+ PredIdx num_strings = 0;
+ bool outcount = 0;