freeline(line);
}
+#ifdef TERM_CC_DIAGS
/*
* Diagnostic function: verify that a termline has a correct
* combining character structure.
*
- * XXX-REMOVE-BEFORE-RELEASE: This is a performance-intensive
- * check. Although it's currently really useful for getting all the
- * bugs out of the new cc stuff, it will want to be absent when we
- * make a proper release.
+ * This is a performance-intensive check, so it's no longer enabled
+ * by default.
*/
static void cc_check(termline *line)
{
sfree(flags);
}
+#endif
/*
* Add a combining character to a character cell.
line->chars[newcc].chr = chr;
line->chars[col].cc_next = newcc - col;
- cc_check(line); /* XXX-REMOVE-BEFORE-RELEASE */
+#ifdef TERM_CC_DIAGS
+ cc_check(line);
+#endif
}
/*
line->chars[origcol].cc_next = 0;
- cc_check(line); /* XXX-REMOVE-BEFORE-RELEASE */
+#ifdef TERM_CC_DIAGS
+ cc_check(line);
+#endif
}
/*
add_cc(destline, x, src->chr);
}
- cc_check(destline); /* XXX-REMOVE-BEFORE-RELEASE */
+#ifdef TERM_CC_DIAGS
+ cc_check(destline);
+#endif
}
/*
/* Ensure the original cell doesn't have a cc list. */
src->cc_next = 0;
- cc_check(line); /* XXX-REMOVE-BEFORE-RELEASE */
+#ifdef TERM_CC_DIAGS
+ cc_check(line);
+#endif
}
/*
* Diagnostics: ensure that the compressed data really does
* decompress to the right thing.
*
- * XXX-REMOVE-BEFORE-RELEASE: This is a bit performance-heavy
- * to be leaving in production code.
+ * This is a bit performance-heavy for production code.
*/
+#ifdef TERM_CC_DIAGS
#ifndef CHECK_SB_COMPRESSION
{
int dused;
freeline(dcl);
}
#endif
+#endif /* TERM_CC_DIAGS */
/*
* Trim the allocated memory so we don't waste any, and return.
for (i = oldcols; i < cols; i++)
line->chars[i] = term->basic_erase_char;
- cc_check(line); /* XXX-REMOVE-BEFORE-RELEASE */
+#ifdef TERM_CC_DIAGS
+ cc_check(line);
+#endif
}
}
} else {
while (lines > 0) {
line = delpos234(term->screen, topline);
- cc_check(line); /* XXX-REMOVE-BEFORE-RELEASE */
+#ifdef TERM_CC_DIAGS
+ cc_check(line);
+#endif
if (sb && term->savelines > 0) {
int sblen = count234(term->scrollback);
/*
*/
compatibility(ANSIMIN);
if (term->ldisc) {
- char abuf[256], *s, *d;
- int state = 0;
- for (s = term->cfg.answerback, d = abuf; *s; s++) {
- if (state) {
- if (*s >= 'a' && *s <= 'z')
- *d++ = (*s - ('a' - 1));
- else if ((*s >= '@' && *s <= '_') ||
- *s == '?' || (*s & 0x80))
- *d++ = ('@' ^ *s);
- else if (*s == '~')
- *d++ = '^';
- state = 0;
- } else if (*s == '^') {
- state = 1;
- } else
- *d++ = *s;
+ char abuf[lenof(term->cfg.answerback)], *s, *d;
+ for (s = term->cfg.answerback, d = abuf; *s;) {
+ char *n;
+ char c = ctrlparse(s, &n);
+ if (n) {
+ *d++ = c;
+ s = n;
+ } else {
+ *d++ = *s++;
+ }
}
lpage_send(term->ldisc, DEFAULT_CODEPAGE,
abuf, d - abuf, 0);
width = 1;
if (!width)
width = (term->cfg.cjk_ambig_wide ?
- wcwidth_cjk((wchar_t) c) :
- wcwidth((wchar_t) c));
+ mk_wcwidth_cjk((wchar_t) c) :
+ mk_wcwidth((wchar_t) c));
if (term->wrapnext && term->wrap && width > 0) {
cline->lattr |= LATTR_WRAPPED;
term->has_focus = has_focus;
term_schedule_cblink(term);
}
+
+/*
+ * Provide "auto" settings for remote tty modes, suitable for an
+ * application with a terminal window.
+ */
+char *term_get_ttymode(Terminal *term, const char *mode)
+{
+ char *val = NULL;
+ if (strcmp(mode, "ERASE") == 0) {
+ val = term->cfg.bksp_is_delete ? "^?" : "^H";
+ }
+ /* FIXME: perhaps we should set ONLCR based on cfg.lfhascr as well? */
+ return dupstr(val);
+}