+ case '\016': /* SO */
+ term.charset = 0;
+ break;
+ case '\017': /* SI */
+ term.charset = 1;
+ break;
+ case '\032': /* SUB */
+ tsetchar(question, &term.c.attr, term.c.x, term.c.y);
+ case '\030': /* CAN */
+ csireset();
+ break;
+ case '\005': /* ENQ (IGNORED) */
+ case '\000': /* NUL (IGNORED) */
+ case '\021': /* XON (IGNORED) */
+ case '\023': /* XOFF (IGNORED) */
+ case 0177: /* DEL (IGNORED) */
+ case 0x84: /* TODO: IND */
+ case 0x85: /* TODO: NEL */
+ case 0x88: /* TODO: HTS */
+ case 0x8d: /* TODO: RI */
+ case 0x8e: /* TODO: SS2 */
+ case 0x8f: /* TODO: SS3 */
+ case 0x90: /* TODO: DCS */
+ case 0x98: /* TODO: SOS */
+ case 0x9a: /* TODO: DECID */
+ case 0x9b: /* TODO: CSI */
+ case 0x9c: /* TODO: ST */
+ case 0x9d: /* TODO: OSC */
+ case 0x9e: /* TODO: PM */
+ case 0x9f: /* TODO: APC */
+ break;
+ }
+ term.esc &= ~(ESC_STR_END|ESC_STR);
+ return;
+}
+
+void
+tdectest(char c) {
+ static char E[UTF_SIZ] = "E";
+ int x, y;
+
+ if(c == '8') { /* DEC screen alignment test. */
+ for(x = 0; x < term.col; ++x) {
+ for(y = 0; y < term.row; ++y)
+ tsetchar(E, &term.c.attr, x, y);
+ }
+ }
+}
+
+void
+tputc(char *c, int len) {
+ uchar ascii;
+ bool control;
+ long unicodep;
+ int width;
+ Glyph *gp;
+
+ if(len == 1) {
+ width = 1;
+ unicodep = ascii = *c;
+ } else {
+ utf8decode(c, &unicodep, UTF_SIZ);
+ width = wcwidth(unicodep);
+ control = ISCONTROLC1(unicodep);
+ ascii = unicodep;
+ }
+
+ if(IS_SET(MODE_PRINT))
+ tprinter(c, len);
+ control = ISCONTROL(unicodep);
+
+ /*
+ * STR sequence must be checked before anything else
+ * because it uses all following characters until it
+ * receives a ESC, a SUB, a ST or any other C1 control
+ * character.
+ */
+ if(term.esc & ESC_STR) {
+ if(width == 1 &&
+ (ascii == '\a' || ascii == 030 ||
+ ascii == 032 || ascii == 033 ||
+ ISCONTROLC1(unicodep))) {
+ term.esc &= ~ESC_STR;
+ term.esc |= ESC_STR_END;
+ } else if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
+ memmove(&strescseq.buf[strescseq.len], c, len);
+ strescseq.len += len;
+ return;
+ } else {
+ /*
+ * Here is a bug in terminals. If the user never sends
+ * some code to stop the str or esc command, then st
+ * will stop responding. But this is better than
+ * silently failing with unknown characters. At least
+ * then users will report back.
+ *
+ * In the case users ever get fixed, here is the code:
+ */
+ /*
+ * term.esc = 0;
+ * strhandle();
+ */
+ return;
+ }