/* Generated by re2c 0.14.3 */ #line 1 "src/parser.re" #include #include #include #include "vt100.h" #include "parser.h" #define UNUSED(x) ((void)x) #ifdef VT100_DEBUG_TRACE #define DEBUG_TRACE1(x) do { \ fputs(x"\n", stderr); \ } while (0) #define DEBUG_TRACE3(x, x2, x2len) do { \ char old = (x2)[(x2len)]; \ (x2)[(x2len)] = '\0'; \ fprintf(stderr, x" %s\n", (x2)); \ (x2)[(x2len)] = old; \ } while (0) #else #define DEBUG_TRACE1(x) #define DEBUG_TRACE3(x, x2, x2len) #endif #define VT100_PARSER_CSI_MAX_PARAMS 256 static void vt100_parser_handle_bel(VT100Screen *vt); static void vt100_parser_handle_bs(VT100Screen *vt); static void vt100_parser_handle_tab(VT100Screen *vt); static void vt100_parser_handle_lf(VT100Screen *vt); static void vt100_parser_handle_cr(VT100Screen *vt); static void vt100_parser_handle_deckpam(VT100Screen *vt); static void vt100_parser_handle_deckpnm(VT100Screen *vt); static void vt100_parser_handle_ri(VT100Screen *vt); static void vt100_parser_handle_ris(VT100Screen *vt); static void vt100_parser_handle_vb(VT100Screen *vt); static void vt100_parser_handle_decsc(VT100Screen *vt); static void vt100_parser_handle_decrc(VT100Screen *vt); static void vt100_parser_extract_csi_params( char *buf, size_t len, int *params, int *nparams); static void vt100_parser_extract_sm_params( char *buf, size_t len, char *modes, int *params, int *nparams); static void vt100_parser_handle_ich(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_cuu(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_cud(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_ed(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_el(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_il(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_dl(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_dch(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_su(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_sd(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_ech(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_vpa(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_sm(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_rm(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_sgr(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_csr(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_decsed(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_decsel(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_osc0(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_osc1(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_osc2(VT100Screen *vt, char *buf, size_t len); static void vt100_parser_handle_ascii(VT100Screen *vt, char *text, size_t len); static void vt100_parser_handle_text(VT100Screen *vt, char *text, size_t len); static void vt100_parser_ignore(VT100Screen *vt); int vt100_parser_yylex(VT100Screen *vt, uint8_t *buf, size_t len) { uint8_t *marker, *start = buf, *cursor = buf; #define EXIT() { return cursor - buf; } #define NEXT() { buf = cursor; continue; } #define IGNORE() { vt100_parser_ignore(vt); NEXT() } #define HANDLE1(x) { vt100_parser_handle_##x(vt); NEXT() } #define HANDLE3(x) { vt100_parser_handle_##x(vt, (char*)buf, cursor - buf); NEXT() } while (buf - start < (ptrdiff_t)len) { #line 87 "src/parser.c" { uint8_t yych; unsigned int yyaccept = 0; yych = *cursor; if (yych <= 0x0F) { if (yych <= '\n') { if (yych <= 0x07) { if (yych >= 0x07) goto yy4; } else { if (yych <= 0x08) goto yy6; if (yych <= '\t') goto yy8; goto yy10; } } else { if (yych <= '\f') { if (yych <= '\v') goto yy12; goto yy14; } else { if (yych <= '\r') goto yy16; if (yych >= 0x0F) goto yy18; } } } else { if (yych <= 0x7F) { if (yych <= 0x1B) { if (yych >= 0x1B) goto yy20; } else { if (yych <= 0x1F) goto yy2; if (yych <= '~') goto yy22; } } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy24; goto yy26; } else { if (yych <= 0xEF) goto yy28; if (yych <= 0xF7) goto yy30; goto yy24; } } } yy2: ++cursor; #line 272 "src/parser.re" { fprintf(stderr, "unhandled control character: \\%03hho\n", buf[0]); NEXT() } #line 137 "src/parser.c" yy4: ++cursor; #line 161 "src/parser.re" HANDLE1(bel) #line 142 "src/parser.c" yy6: ++cursor; #line 162 "src/parser.re" HANDLE1(bs) #line 147 "src/parser.c" yy8: ++cursor; #line 163 "src/parser.re" HANDLE1(tab) #line 152 "src/parser.c" yy10: ++cursor; #line 164 "src/parser.re" HANDLE1(lf) #line 157 "src/parser.c" yy12: ++cursor; #line 165 "src/parser.re" HANDLE1(lf) #line 162 "src/parser.c" yy14: ++cursor; #line 166 "src/parser.re" HANDLE1(lf) #line 167 "src/parser.c" yy16: ++cursor; #line 167 "src/parser.re" HANDLE1(cr) #line 172 "src/parser.c" yy18: ++cursor; #line 168 "src/parser.re" IGNORE() #line 177 "src/parser.c" yy20: yyaccept = 0; yych = *(marker = ++cursor); if (yych <= 'M') { if (yych <= '6') { if (yych <= '(') { if (yych <= 0x1F) goto yy74; if (yych <= '\'') goto yy47; goto yy49; } else { if (yych <= ')') goto yy50; if (yych <= '*') goto yy51; if (yych <= '+') goto yy52; goto yy47; } } else { if (yych <= '<') { if (yych <= '7') goto yy53; if (yych <= '8') goto yy55; goto yy47; } else { if (yych <= '=') goto yy57; if (yych <= '>') goto yy59; if (yych <= 'L') goto yy47; goto yy61; } } } else { if (yych <= 'f') { if (yych <= '\\') { if (yych == '[') goto yy63; goto yy47; } else { if (yych <= ']') goto yy65; if (yych == 'c') goto yy67; goto yy47; } } else { if (yych <= 0xBF) { if (yych <= 'g') goto yy69; if (yych <= '~') goto yy47; if (yych <= 0x7F) goto yy74; } else { if (yych <= 0xDF) goto yy71; if (yych <= 0xEF) goto yy72; if (yych <= 0xF7) goto yy73; } } } yy21: #line 219 "src/parser.re" EXIT() #line 230 "src/parser.c" yy22: yyaccept = 1; yych = *(marker = ++cursor); goto yy46; yy23: #line 211 "src/parser.re" HANDLE3(ascii) #line 238 "src/parser.c" yy24: ++cursor; #line 277 "src/parser.re" { fprintf(stderr, "invalid utf8 byte: \\%03hho\n", buf[0]); NEXT() } #line 246 "src/parser.c" yy26: ++cursor; if ((yych = *cursor) <= 0x7F) goto yy27; if (yych <= 0xBF) goto yy34; yy27: #line 214 "src/parser.re" EXIT() #line 254 "src/parser.c" yy28: ++cursor; if ((yych = *cursor) <= 0x7F) goto yy29; if (yych <= 0xBF) goto yy44; yy29: #line 215 "src/parser.re" EXIT() #line 262 "src/parser.c" yy30: ++cursor; if ((yych = *cursor) <= 0x7F) goto yy31; if (yych <= 0xBF) goto yy32; yy31: #line 216 "src/parser.re" EXIT() #line 270 "src/parser.c" yy32: yych = *++cursor; if (yych <= 0x7F) goto yy31; if (yych >= 0xC0) goto yy31; yych = *++cursor; if (yych <= 0x7F) goto yy31; if (yych >= 0xC0) goto yy31; yy34: yyaccept = 2; marker = ++cursor; yych = *cursor; if (yych <= 0xBF) { if (yych <= 0x1F) goto yy36; if (yych <= '~') goto yy34; } else { if (yych <= 0xDF) goto yy37; if (yych <= 0xEF) goto yy39; if (yych <= 0xF7) goto yy40; } yy36: #line 212 "src/parser.re" HANDLE3(text) #line 293 "src/parser.c" yy37: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy34; yy38: cursor = marker; if (yyaccept <= 2) { if (yyaccept <= 1) { if (yyaccept == 0) { goto yy21; } else { goto yy23; } } else { goto yy36; } } else { if (yyaccept <= 4) { if (yyaccept == 3) { goto yy48; } else { goto yy64; } } else { goto yy66; } } yy39: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy43; goto yy38; yy40: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy34; goto yy38; yy43: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy34; goto yy38; yy44: yych = *++cursor; if (yych <= 0x7F) goto yy29; if (yych <= 0xBF) goto yy34; goto yy29; yy45: yyaccept = 1; marker = ++cursor; yych = *cursor; yy46: if (yych <= 0xBF) { if (yych <= 0x1F) goto yy23; if (yych <= '~') goto yy45; goto yy23; } else { if (yych <= 0xDF) goto yy37; if (yych <= 0xEF) goto yy39; if (yych <= 0xF7) goto yy40; goto yy23; } yy47: ++cursor; yy48: #line 258 "src/parser.re" { switch (buf[1]) { case '(': // character sets // not interested in implementing character sets, unicode should be // sufficient break; default: { fprintf(stderr, "unhandled escape sequence: \\033%c\n", buf[1]); break; } } NEXT() } #line 385 "src/parser.c" yy49: yyaccept = 3; yych = *(marker = ++cursor); if (yych <= 0x1F) goto yy48; if (yych <= '~') goto yy224; goto yy48; yy50: yyaccept = 3; yych = *(marker = ++cursor); if (yych <= 0x1F) goto yy48; if (yych <= '~') goto yy220; goto yy48; yy51: yyaccept = 3; yych = *(marker = ++cursor); if (yych <= 0x1F) goto yy48; if (yych <= '~') goto yy216; goto yy48; yy52: yyaccept = 3; yych = *(marker = ++cursor); if (yych <= 0x1F) goto yy48; if (yych <= '~') goto yy212; goto yy48; yy53: ++cursor; #line 175 "src/parser.re" HANDLE1(decsc) #line 414 "src/parser.c" yy55: ++cursor; #line 176 "src/parser.re" HANDLE1(decrc) #line 419 "src/parser.c" yy57: ++cursor; #line 170 "src/parser.re" HANDLE1(deckpam) #line 424 "src/parser.c" yy59: ++cursor; #line 171 "src/parser.re" HANDLE1(deckpnm) #line 429 "src/parser.c" yy61: ++cursor; #line 172 "src/parser.re" HANDLE1(ri) #line 434 "src/parser.c" yy63: yyaccept = 4; yych = *(marker = ++cursor); if (yych <= '>') { if (yych <= ':') goto yy123; if (yych <= ';') goto yy166; if (yych <= '=') goto yy156; goto yy123; } else { if (yych <= '?') goto yy157; if (yych == 'r') goto yy164; goto yy123; } yy64: #line 217 "src/parser.re" EXIT() #line 451 "src/parser.c" yy65: yyaccept = 5; yych = *(marker = ++cursor); if (yych <= '/') goto yy83; if (yych <= '0') goto yy79; if (yych <= '1') goto yy80; if (yych <= '2') goto yy81; goto yy83; yy66: #line 218 "src/parser.re" EXIT() #line 463 "src/parser.c" yy67: ++cursor; #line 173 "src/parser.re" HANDLE1(ris) #line 468 "src/parser.c" yy69: ++cursor; #line 174 "src/parser.re" HANDLE1(vb) #line 473 "src/parser.c" yy71: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy47; goto yy38; yy72: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy78; goto yy38; yy73: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy76; goto yy38; yy74: ++cursor; #line 253 "src/parser.re" { fprintf(stderr, "unhandled escape sequence: \\033\\%03hho\n", buf[1]); NEXT() } #line 496 "src/parser.c" yy76: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy47; goto yy38; yy78: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy47; goto yy38; yy79: yyaccept = 5; yych = *(marker = ++cursor); if (yych == ';') goto yy112; goto yy83; yy80: yyaccept = 5; yych = *(marker = ++cursor); if (yych == ';') goto yy102; goto yy83; yy81: yyaccept = 5; yych = *(marker = ++cursor); if (yych == ';') goto yy92; goto yy83; yy82: yyaccept = 5; marker = ++cursor; yych = *cursor; yy83: if (yych <= '~') { if (yych == 0x07) goto yy87; if (yych <= 0x1F) goto yy66; goto yy82; } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy66; } else { if (yych <= 0xEF) goto yy85; if (yych <= 0xF7) goto yy86; goto yy66; } } ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy82; goto yy38; yy85: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy91; goto yy38; yy86: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy89; goto yy38; yy87: ++cursor; #line 237 "src/parser.re" { if (!strncmp((char*)buf, "\e]50;", 5)) { // osx terminal.app private stuff // not interested in non-portable extensions } else if (!strncmp((char*)buf, "\e]499;", 5)) { // termcast private metadata // this isn't intended to be interpreted } else { char c = *cursor; *cursor = '\0'; fprintf(stderr, "unhandled OSC sequence: \\033%s\\007\n", buf + 1); *cursor = c; } NEXT() } #line 578 "src/parser.c" yy89: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy82; goto yy38; yy91: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy82; goto yy38; yy92: yyaccept = 5; marker = ++cursor; yych = *cursor; if (yych <= '~') { if (yych == 0x07) goto yy97; if (yych <= 0x1F) goto yy66; goto yy92; } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy66; } else { if (yych <= 0xEF) goto yy95; if (yych <= 0xF7) goto yy96; goto yy66; } } ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy92; goto yy38; yy95: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy101; goto yy38; yy96: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy99; goto yy38; yy97: ++cursor; #line 204 "src/parser.re" HANDLE3(osc2) #line 633 "src/parser.c" yy99: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy92; goto yy38; yy101: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy92; goto yy38; yy102: yyaccept = 5; marker = ++cursor; yych = *cursor; if (yych <= '~') { if (yych == 0x07) goto yy107; if (yych <= 0x1F) goto yy66; goto yy102; } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy66; } else { if (yych <= 0xEF) goto yy105; if (yych <= 0xF7) goto yy106; goto yy66; } } ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy102; goto yy38; yy105: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy111; goto yy38; yy106: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy109; goto yy38; yy107: ++cursor; #line 203 "src/parser.re" HANDLE3(osc1) #line 688 "src/parser.c" yy109: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy102; goto yy38; yy111: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy102; goto yy38; yy112: yyaccept = 5; marker = ++cursor; yych = *cursor; if (yych <= '~') { if (yych == 0x07) goto yy117; if (yych <= 0x1F) goto yy66; goto yy112; } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy66; } else { if (yych <= 0xEF) goto yy115; if (yych <= 0xF7) goto yy116; goto yy66; } } ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy112; goto yy38; yy115: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy121; goto yy38; yy116: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy119; goto yy38; yy117: ++cursor; #line 202 "src/parser.re" HANDLE3(osc0) #line 743 "src/parser.c" yy119: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy112; goto yy38; yy121: ++cursor; yych = *cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy112; goto yy38; yy122: yyaccept = 4; marker = ++cursor; yych = *cursor; yy123: if (yych <= 'O') { if (yych <= 'C') { if (yych <= ';') { if (yych <= '/') { if (yych <= 0x1F) goto yy167; goto yy169; } else { if (yych <= '9') goto yy122; if (yych <= ':') goto yy169; goto yy195; } } else { if (yych <= '@') { if (yych <= '?') goto yy169; } else { if (yych <= 'A') goto yy126; if (yych <= 'B') goto yy128; goto yy130; } } } else { if (yych <= 'I') { if (yych <= 'F') { if (yych <= 'D') goto yy132; goto yy169; } else { if (yych <= 'G') goto yy134; if (yych <= 'H') goto yy136; goto yy169; } } else { if (yych <= 'K') { if (yych <= 'J') goto yy138; goto yy140; } else { if (yych <= 'L') goto yy142; if (yych <= 'M') goto yy144; goto yy169; } } } } else { if (yych <= 'h') { if (yych <= 'W') { if (yych <= 'R') { if (yych <= 'P') goto yy146; goto yy169; } else { if (yych <= 'S') goto yy148; if (yych <= 'T') goto yy150; goto yy169; } } else { if (yych <= 'c') { if (yych <= 'X') goto yy152; goto yy169; } else { if (yych <= 'd') goto yy154; if (yych <= 'g') goto yy169; goto yy158; } } } else { if (yych <= 0x7F) { if (yych <= 'l') { if (yych <= 'k') goto yy169; goto yy160; } else { if (yych <= 'm') goto yy162; if (yych <= '~') goto yy169; goto yy167; } } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy64; goto yy171; } else { if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } } } ++cursor; #line 178 "src/parser.re" HANDLE3(ich) #line 852 "src/parser.c" yy126: ++cursor; #line 179 "src/parser.re" HANDLE3(cuu) #line 857 "src/parser.c" yy128: ++cursor; #line 180 "src/parser.re" HANDLE3(cud) #line 862 "src/parser.c" yy130: ++cursor; #line 181 "src/parser.re" HANDLE3(cuf) #line 867 "src/parser.c" yy132: ++cursor; #line 182 "src/parser.re" HANDLE3(cub) #line 872 "src/parser.c" yy134: ++cursor; #line 183 "src/parser.re" HANDLE3(cha) #line 877 "src/parser.c" yy136: ++cursor; #line 184 "src/parser.re" HANDLE3(cup) #line 882 "src/parser.c" yy138: ++cursor; #line 185 "src/parser.re" HANDLE3(ed) #line 887 "src/parser.c" yy140: ++cursor; #line 186 "src/parser.re" HANDLE3(el) #line 892 "src/parser.c" yy142: ++cursor; #line 187 "src/parser.re" HANDLE3(il) #line 897 "src/parser.c" yy144: ++cursor; #line 188 "src/parser.re" HANDLE3(dl) #line 902 "src/parser.c" yy146: ++cursor; #line 189 "src/parser.re" HANDLE3(dch) #line 907 "src/parser.c" yy148: ++cursor; #line 190 "src/parser.re" HANDLE3(su) #line 912 "src/parser.c" yy150: ++cursor; #line 191 "src/parser.re" HANDLE3(sd) #line 917 "src/parser.c" yy152: ++cursor; #line 192 "src/parser.re" HANDLE3(ech) #line 922 "src/parser.c" yy154: ++cursor; #line 193 "src/parser.re" HANDLE3(vpa) #line 927 "src/parser.c" yy156: yyaccept = 4; yych = *(marker = ++cursor); if (yych <= 'g') { if (yych == ';') goto yy166; goto yy194; } else { if (yych <= 'h') goto yy169; if (yych == 'l') goto yy169; goto yy194; } yy157: yyaccept = 4; yych = *(marker = ++cursor); if (yych <= 'g') { if (yych == ';') goto yy166; goto yy178; } else { if (yych <= 'h') goto yy169; if (yych == 'l') goto yy169; goto yy178; } yy158: ++cursor; yy159: #line 194 "src/parser.re" HANDLE3(sm) #line 955 "src/parser.c" yy160: ++cursor; yy161: #line 195 "src/parser.re" HANDLE3(rm) #line 961 "src/parser.c" yy162: ++cursor; #line 196 "src/parser.re" HANDLE3(sgr) #line 966 "src/parser.c" yy164: ++cursor; #line 197 "src/parser.re" HANDLE3(csr) #line 971 "src/parser.c" yy166: yych = *++cursor; goto yy64; yy167: ++cursor; #line 221 "src/parser.re" { char c = *cursor; *cursor = '\0'; fprintf(stderr, "unhandled CSI sequence: \\033%s\\%03hho\n", buf + 1, c); *cursor = c; NEXT() } #line 985 "src/parser.c" yy169: ++cursor; #line 229 "src/parser.re" { char c = *cursor; *cursor = '\0'; fprintf(stderr, "unhandled CSI sequence: \\033%s%c\n", buf + 1, c); *cursor = c; NEXT() } #line 996 "src/parser.c" yy171: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy169; goto yy38; yy172: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy176; goto yy38; yy173: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych >= 0xC0) goto yy38; yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy169; goto yy38; yy176: yych = *++cursor; if (yych <= 0x7F) goto yy38; if (yych <= 0xBF) goto yy169; goto yy38; yy177: yyaccept = 4; marker = ++cursor; yych = *cursor; yy178: if (yych <= 'g') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych <= '9') goto yy177; goto yy169; } else { if (yych <= 'I') { if (yych <= ';') goto yy183; goto yy169; } else { if (yych <= 'J') goto yy179; if (yych <= 'K') goto yy181; goto yy169; } } } else { if (yych <= 0x7F) { if (yych <= 'k') { if (yych <= 'h') goto yy158; goto yy169; } else { if (yych <= 'l') goto yy160; if (yych <= '~') goto yy169; goto yy167; } } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy64; goto yy171; } else { if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } } yy179: ++cursor; #line 199 "src/parser.re" HANDLE3(decsed) #line 1069 "src/parser.c" yy181: ++cursor; #line 200 "src/parser.re" HANDLE3(decsel) #line 1074 "src/parser.c" yy183: yyaccept = 4; marker = ++cursor; yych = *cursor; if (yych <= ';') { if (yych <= '/') goto yy64; if (yych >= ':') goto yy64; } else { if (yych == '>') goto yy64; if (yych <= '?') goto yy185; goto yy64; } yyaccept = 4; marker = ++cursor; yych = *cursor; if (yych <= 'k') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych <= '9') goto yy191; goto yy169; } else { if (yych <= ';') goto yy183; if (yych == 'h') goto yy158; goto yy169; } } else { if (yych <= 0xBF) { if (yych <= 'l') goto yy160; if (yych <= '~') goto yy169; if (yych <= 0x7F) goto yy167; goto yy64; } else { if (yych <= 0xDF) goto yy171; if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } yy185: ++cursor; yych = *cursor; if (yych <= '/') goto yy38; if (yych >= ':') goto yy38; yy186: ++cursor; yych = *cursor; if (yych <= ';') { if (yych <= '/') goto yy38; if (yych <= '9') goto yy186; if (yych <= ':') goto yy38; goto yy189; } else { if (yych <= 'h') { if (yych <= 'g') goto yy38; goto yy190; } else { if (yych != 'l') goto yy38; } } yych = *++cursor; goto yy161; yy189: ++cursor; yych = *cursor; if (yych <= ';') { if (yych <= '/') goto yy38; if (yych <= '9') goto yy186; goto yy38; } else { if (yych == '>') goto yy38; if (yych <= '?') goto yy185; goto yy38; } yy190: yych = *++cursor; goto yy159; yy191: yyaccept = 4; marker = ++cursor; yych = *cursor; if (yych <= 'k') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych <= '9') goto yy191; goto yy169; } else { if (yych <= ';') goto yy183; if (yych == 'h') goto yy158; goto yy169; } } else { if (yych <= 0xBF) { if (yych <= 'l') goto yy160; if (yych <= '~') goto yy169; if (yych <= 0x7F) goto yy167; goto yy64; } else { if (yych <= 0xDF) goto yy171; if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } yy193: yyaccept = 4; marker = ++cursor; yych = *cursor; yy194: if (yych <= 'k') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych <= '9') goto yy193; goto yy169; } else { if (yych <= ';') goto yy183; if (yych == 'h') goto yy158; goto yy169; } } else { if (yych <= 0xBF) { if (yych <= 'l') goto yy160; if (yych <= '~') goto yy169; if (yych <= 0x7F) goto yy167; goto yy64; } else { if (yych <= 0xDF) goto yy171; if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } yy195: yyaccept = 4; yych = *(marker = ++cursor); if (yych <= ';') { if (yych <= '/') goto yy64; if (yych >= ':') goto yy64; } else { if (yych == '>') goto yy64; if (yych <= '?') goto yy185; goto yy64; } yyaccept = 4; yych = *(marker = ++cursor); goto yy198; yy197: yyaccept = 4; marker = ++cursor; yych = *cursor; yy198: if (yych <= 'k') { if (yych <= ';') { if (yych <= '/') { if (yych <= 0x1F) goto yy167; goto yy169; } else { if (yych <= '9') goto yy197; if (yych <= ':') goto yy169; } } else { if (yych <= 'H') { if (yych <= 'G') goto yy169; goto yy136; } else { if (yych == 'h') goto yy158; goto yy169; } } } else { if (yych <= '~') { if (yych <= 'm') { if (yych <= 'l') goto yy160; goto yy162; } else { if (yych == 'r') goto yy164; goto yy169; } } else { if (yych <= 0xDF) { if (yych <= 0x7F) goto yy167; if (yych <= 0xBF) goto yy64; goto yy171; } else { if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } } yyaccept = 4; yych = *(marker = ++cursor); if (yych <= ';') { if (yych <= '/') goto yy64; if (yych >= ':') goto yy64; } else { if (yych == '>') goto yy64; if (yych <= '?') goto yy185; goto yy64; } yyaccept = 4; yych = *(marker = ++cursor); goto yy202; yy201: yyaccept = 4; marker = ++cursor; yych = *cursor; yy202: if (yych <= 'l') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych <= '9') goto yy201; goto yy169; } else { if (yych <= 'g') { if (yych >= '<') goto yy169; } else { if (yych <= 'h') goto yy158; if (yych <= 'k') goto yy169; goto yy160; } } } else { if (yych <= 0x7F) { if (yych <= 'q') { if (yych <= 'm') goto yy162; goto yy169; } else { if (yych <= 'r') goto yy164; if (yych <= '~') goto yy169; goto yy167; } } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy64; goto yy171; } else { if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } } yyaccept = 4; yych = *(marker = ++cursor); if (yych <= ';') { if (yych <= '/') goto yy64; if (yych >= ':') goto yy64; } else { if (yych == '>') goto yy64; if (yych <= '?') goto yy185; goto yy64; } yyaccept = 4; yych = *(marker = ++cursor); goto yy206; yy205: yyaccept = 4; marker = ++cursor; yych = *cursor; yy206: if (yych <= 'l') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych <= '9') goto yy205; goto yy169; } else { if (yych <= 'g') { if (yych >= '<') goto yy169; } else { if (yych <= 'h') goto yy158; if (yych <= 'k') goto yy169; goto yy160; } } } else { if (yych <= 0x7F) { if (yych <= 'q') { if (yych <= 'm') goto yy162; goto yy169; } else { if (yych <= 'r') goto yy164; if (yych <= '~') goto yy169; goto yy167; } } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy64; goto yy171; } else { if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } } yy207: yyaccept = 4; marker = ++cursor; yych = *cursor; if (yych <= ';') { if (yych <= '/') goto yy64; if (yych >= ':') goto yy64; } else { if (yych == '>') goto yy64; if (yych <= '?') goto yy185; goto yy64; } yyaccept = 4; marker = ++cursor; yych = *cursor; if (yych <= 'k') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych >= ':') goto yy169; } else { if (yych <= ';') goto yy207; if (yych == 'h') goto yy158; goto yy169; } } else { if (yych <= 0x7F) { if (yych <= 'l') goto yy160; if (yych <= 'm') goto yy162; if (yych <= '~') goto yy169; goto yy167; } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy64; goto yy171; } else { if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } } yy209: yyaccept = 4; marker = ++cursor; yych = *cursor; if (yych <= 'k') { if (yych <= ':') { if (yych <= 0x1F) goto yy167; if (yych <= '/') goto yy169; if (yych <= '9') goto yy209; goto yy169; } else { if (yych <= ';') goto yy207; if (yych == 'h') goto yy158; goto yy169; } } else { if (yych <= 0x7F) { if (yych <= 'l') goto yy160; if (yych <= 'm') goto yy162; if (yych <= '~') goto yy169; goto yy167; } else { if (yych <= 0xDF) { if (yych <= 0xBF) goto yy64; goto yy171; } else { if (yych <= 0xEF) goto yy172; if (yych <= 0xF7) goto yy173; goto yy64; } } } yy211: ++cursor; yych = *cursor; yy212: if (yych <= 0x1F) goto yy38; if (yych <= '/') goto yy211; if (yych >= 0x7F) goto yy38; ++cursor; #line 209 "src/parser.re" IGNORE() #line 1459 "src/parser.c" yy215: ++cursor; yych = *cursor; yy216: if (yych <= 0x1F) goto yy38; if (yych <= '/') goto yy215; if (yych >= 0x7F) goto yy38; ++cursor; #line 208 "src/parser.re" IGNORE() #line 1470 "src/parser.c" yy219: ++cursor; yych = *cursor; yy220: if (yych <= 0x1F) goto yy38; if (yych <= '/') goto yy219; if (yych >= 0x7F) goto yy38; ++cursor; #line 207 "src/parser.re" IGNORE() #line 1481 "src/parser.c" yy223: ++cursor; yych = *cursor; yy224: if (yych <= 0x1F) goto yy38; if (yych <= '/') goto yy223; if (yych >= 0x7F) goto yy38; ++cursor; #line 206 "src/parser.re" IGNORE() #line 1492 "src/parser.c" } #line 281 "src/parser.re" } EXIT(); } static void vt100_parser_handle_bel(VT100Screen *vt) { DEBUG_TRACE1("BEL"); vt100_screen_audible_bell(vt); } static void vt100_parser_handle_bs(VT100Screen *vt) { DEBUG_TRACE1("BS"); vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - 1); } static void vt100_parser_handle_tab(VT100Screen *vt) { DEBUG_TRACE1("TAB"); vt100_screen_move_to( vt, vt->grid->cur.row, vt->grid->cur.col - (vt->grid->cur.col % 8) + 8); } static void vt100_parser_handle_lf(VT100Screen *vt) { DEBUG_TRACE1("LF"); vt100_screen_move_down_or_scroll(vt); } static void vt100_parser_handle_cr(VT100Screen *vt) { DEBUG_TRACE1("CR"); vt100_screen_move_to(vt, vt->grid->cur.row, 0); } static void vt100_parser_handle_deckpam(VT100Screen *vt) { DEBUG_TRACE1("DECKPAM"); vt100_screen_set_application_keypad(vt); } static void vt100_parser_handle_deckpnm(VT100Screen *vt) { DEBUG_TRACE1("DECKPNM"); vt100_screen_reset_application_keypad(vt); } static void vt100_parser_handle_ri(VT100Screen *vt) { DEBUG_TRACE1("RI"); vt100_screen_move_up_or_scroll(vt); } static void vt100_parser_handle_ris(VT100Screen *vt) { DEBUG_TRACE1("RIS"); vt100_screen_use_normal_buffer(vt); vt100_screen_set_scroll_region( vt, 0, vt->grid->max.row - 1, 0, vt->grid->max.col - 1); vt100_screen_move_to(vt, 0, 0); vt100_screen_clear_screen(vt); vt100_screen_save_cursor(vt); vt100_screen_reset_text_attributes(vt); vt100_screen_show_cursor(vt); vt100_screen_reset_application_keypad(vt); vt100_screen_reset_application_cursor(vt); vt100_screen_reset_mouse_reporting_press(vt); vt100_screen_reset_mouse_reporting_press_release(vt); vt100_screen_reset_mouse_reporting_button_motion(vt); vt100_screen_reset_mouse_reporting_sgr_mode(vt); vt100_screen_reset_bracketed_paste(vt); } static void vt100_parser_handle_vb(VT100Screen *vt) { DEBUG_TRACE1("VB"); vt100_screen_visual_bell(vt); } static void vt100_parser_handle_decsc(VT100Screen *vt) { DEBUG_TRACE1("DECSC"); vt100_screen_save_cursor(vt); } static void vt100_parser_handle_decrc(VT100Screen *vt) { DEBUG_TRACE1("DECRC"); vt100_screen_restore_cursor(vt); } static void vt100_parser_extract_csi_params( char *buf, size_t len, int *params, int *nparams) { vt100_parser_extract_sm_params(buf, len, NULL, params, nparams); } static void vt100_parser_extract_sm_params( char *buf, size_t len, char *modes, int *params, int *nparams) { char *pos = buf; /* this assumes that it will only ever be called on a fully matched CSI * sequence: accessing one character beyond the end is safe because CSI * sequences always have one character after the parameters (to determine * the type of sequence), and the parameters can only ever be digits, * separated by semicolons. */ buf[len] = '\0'; *nparams = 0; while ((size_t)(pos - buf) < len) { if (*nparams >= VT100_PARSER_CSI_MAX_PARAMS) { fprintf(stderr, "max CSI parameter length exceeded\n"); break; } if (modes && (size_t)(pos - buf) < len) { if (strspn(pos, "0123456789")) { modes[*nparams] = '\0'; } else { modes[*nparams] = *pos++; } } params[(*nparams)++] = atoi(pos); pos = strchr(pos, ';'); if (pos) { pos++; } else { break; } } } static void vt100_parser_handle_ich(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("ICH", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_insert_characters(vt, params[0]); } static void vt100_parser_handle_cuu(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; int row = vt->grid->cur.row, new_row; DEBUG_TRACE3("CUU", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); new_row = row - params[0]; if (row >= vt->grid->scroll_top && new_row < vt->grid->scroll_top) { new_row = vt->grid->scroll_top; } vt100_screen_move_to(vt, new_row, vt->grid->cur.col); } static void vt100_parser_handle_cud(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; int row = vt->grid->cur.row, new_row; DEBUG_TRACE3("CUD", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); new_row = row + params[0]; if (row <= vt->grid->scroll_bottom && new_row > vt->grid->scroll_bottom) { new_row = vt->grid->scroll_bottom; } vt100_screen_move_to(vt, new_row, vt->grid->cur.col); } static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("CUF", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col + params[0]); } static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("CUB", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - params[0]); } static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("CHA", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to(vt, vt->grid->cur.row, params[0] - 1); } static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 0, 0 }, nparams; DEBUG_TRACE3("CUP", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); if (params[0] == 0) { params[0] = 1; } if (params[1] == 0) { params[1] = 1; } vt100_screen_move_to(vt, params[0] - 1, params[1] - 1); } static void vt100_parser_handle_ed(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams; /* this also gets called by handle_decsed, which will pass it something * of the form \e[?1J instead of \e[1J */ buf += 2; len -= 3; if (*buf == '?') { buf++; len--; DEBUG_TRACE3("DECSED", buf, len); } else { DEBUG_TRACE3("ED", buf, len); } vt100_parser_extract_csi_params(buf, len, params, &nparams); switch (params[0]) { case 0: vt100_screen_clear_screen_forward(vt); break; case 1: vt100_screen_clear_screen_backward(vt); break; case 2: vt100_screen_clear_screen(vt); break; default: fprintf(stderr, "unknown ED parameter %d\n", params[0]); break; } } static void vt100_parser_handle_el(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams; /* this also gets called by handle_decsel, which will pass it something * of the form \e[?1J instead of \e[1J */ buf += 2; len -= 3; if (*buf == '?') { buf++; len--; DEBUG_TRACE3("DECSEL", buf, len); } else { DEBUG_TRACE3("EL", buf, len); } vt100_parser_extract_csi_params(buf, len, params, &nparams); switch (params[0]) { case 0: vt100_screen_kill_line_forward(vt); break; case 1: vt100_screen_kill_line_backward(vt); break; case 2: vt100_screen_kill_line(vt); break; default: fprintf(stderr, "unknown EL parameter %d\n", params[0]); break; } } static void vt100_parser_handle_il(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("IL", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_insert_lines(vt, params[0]); } static void vt100_parser_handle_dl(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("DL", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_delete_lines(vt, params[0]); } static void vt100_parser_handle_dch(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("DCH", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_delete_characters(vt, params[0]); } static void vt100_parser_handle_su(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("SU", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); if (params[0] == 0) { params[0] = 1; } vt100_screen_scroll_up(vt, params[0]); } static void vt100_parser_handle_sd(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("SD", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); if (params[0] == 0) { params[0] = 1; } vt100_screen_scroll_down(vt, params[0]); } static void vt100_parser_handle_ech(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("ECH", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_erase_characters(vt, params[0]); } static void vt100_parser_handle_vpa(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; DEBUG_TRACE3("VPA", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to(vt, params[0] - 1, vt->grid->cur.col); } static void vt100_parser_handle_sm(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS], nparams, i; char modes[VT100_PARSER_CSI_MAX_PARAMS] = { 0 }; DEBUG_TRACE3("SM", buf + 2, len - 3); vt100_parser_extract_sm_params(buf + 2, len - 3, modes, params, &nparams); for (i = 0; i < nparams; ++i) { switch (modes[i]) { case 0: switch (params[i]) { case 34: /* do nothing, no idea what this is even for */ break; default: fprintf(stderr, "unknown SM parameter: %d\n", params[i]); break; } break; case '?': switch (params[i]) { case 1: vt100_screen_set_application_cursor(vt); break; case 9: vt100_screen_set_mouse_reporting_press(vt); break; case 25: vt100_screen_show_cursor(vt); break; case 1000: vt100_screen_set_mouse_reporting_press_release(vt); break; case 1002: vt100_screen_set_mouse_reporting_button_motion(vt); break; case 1006: vt100_screen_set_mouse_reporting_sgr_mode(vt); break; case 47: case 1049: vt100_screen_use_alternate_buffer(vt); break; case 2004: vt100_screen_set_bracketed_paste(vt); break; case 12: // blinking cursor // not interested in blinking cursors case 1005: // UTF-8 mouse tracking mode // will just default this to always on. might break some // programs, but the programs that will break will already be // broken for terms with width greater than 223. case 1034: // interpret Meta key // not actually sure if ignoring this is correct - need to see // what exactly it does. don't think it's important though. break; default: fprintf(stderr, "unknown SM parameter: %c%d\n", modes[i], params[i]); break; } break; default: fprintf(stderr, "unknown SM parameter: %c%d\n", modes[i], params[i]); break; } } } static void vt100_parser_handle_rm(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS], nparams, i; char modes[VT100_PARSER_CSI_MAX_PARAMS] = { 0 }; DEBUG_TRACE3("RM", buf + 2, len - 3); vt100_parser_extract_sm_params(buf + 2, len - 3, modes, params, &nparams); for (i = 0; i < nparams; ++i) { switch (modes[i]) { case 0: switch (params[i]) { case 34: /* do nothing, no idea what this is even for */ break; default: fprintf(stderr, "unknown RM parameter: %d\n", params[i]); break; } break; case '?': switch (params[i]) { case 1: vt100_screen_reset_application_cursor(vt); break; case 9: vt100_screen_reset_mouse_reporting_press(vt); break; case 25: vt100_screen_hide_cursor(vt); break; case 1000: vt100_screen_reset_mouse_reporting_press_release(vt); break; case 1002: vt100_screen_reset_mouse_reporting_button_motion(vt); break; case 1006: vt100_screen_reset_mouse_reporting_sgr_mode(vt); break; case 47: case 1049: vt100_screen_use_normal_buffer(vt); break; case 2004: vt100_screen_reset_bracketed_paste(vt); break; case 12: // blinking cursor // not interested in blinking cursors case 1005: // UTF-8 mouse tracking mode // will just default this to always on. might break some // programs, but the programs that will break will already be // broken for terms with width greater than 223. case 1034: // interpret Meta key // not actually sure if ignoring this is correct - need to see // what exactly it does. don't think it's important though. break; default: fprintf(stderr, "unknown RM parameter: %c%d\n", modes[i], params[i]); break; } break; default: fprintf(stderr, "unknown RM parameter: %c%d\n", modes[i], params[i]); break; } } } static void vt100_parser_handle_sgr(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams, i; DEBUG_TRACE3("SGR", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); if (nparams < 1) { nparams = 1; } for (i = 0; i < nparams; ++i) { switch (params[i]) { case 0: vt100_screen_reset_text_attributes(vt); break; case 1: vt100_screen_set_bold(vt); break; case 3: vt100_screen_set_italic(vt); break; case 4: vt100_screen_set_underline(vt); break; case 7: vt100_screen_set_inverse(vt); break; case 22: vt100_screen_reset_bold(vt); break; case 23: vt100_screen_reset_italic(vt); break; case 24: vt100_screen_reset_underline(vt); break; case 27: vt100_screen_reset_inverse(vt); break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: vt100_screen_set_fg_color(vt, params[i] - 30); break; case 38: { i++; if (i >= nparams) { fprintf(stderr, "unknown SGR parameter: %d (too few parameters)\n", params[i - 1]); break; } switch (params[i]) { case 2: i += 3; if (i >= nparams) { fprintf(stderr, "unknown SGR parameter: %d;%d (too few parameters)\n", params[i - 4], params[i - 3]); break; } vt100_screen_set_fg_color_rgb( vt, params[i - 2], params[i - 1], params[i]); break; case 5: i++; if (i >= nparams) { fprintf(stderr, "unknown SGR parameter: %d;%d (too few parameters)\n", params[i - 2], params[i - 1]); break; } vt100_screen_set_fg_color(vt, params[i]); break; default: i++; fprintf(stderr, "unknown SGR parameter: %d;%d\n", params[i - 2], params[i - 1]); break; } break; } case 39: vt100_screen_reset_fg_color(vt); break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: vt100_screen_set_bg_color(vt, params[i] - 40); break; case 48: { i++; if (i >= nparams) { fprintf(stderr, "unknown SGR parameter: %d (too few parameters)\n", params[i - 1]); break; } switch (params[i]) { case 2: i += 3; if (i >= nparams) { fprintf(stderr, "unknown SGR parameter: %d;%d (too few parameters)\n", params[i - 4], params[i - 3]); break; } vt100_screen_set_bg_color_rgb( vt, params[i - 2], params[i - 1], params[i]); break; case 5: i++; if (i >= nparams) { fprintf(stderr, "unknown SGR parameter: %d;%d (too few parameters)\n", params[i - 2], params[i - 1]); break; } vt100_screen_set_bg_color(vt, params[i]); break; default: i++; fprintf(stderr, "unknown SGR parameter: %d;%d\n", params[i - 2], params[i - 1]); break; } break; } case 49: vt100_screen_reset_bg_color(vt); break; case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97: vt100_screen_set_fg_color(vt, params[i] - 82); break; case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: vt100_screen_set_bg_color(vt, params[i] - 92); break; case 5: // blink mode // blinking terminals are awful break; default: fprintf(stderr, "unknown SGR parameter: %d\n", params[i]); break; } } } static void vt100_parser_handle_csr(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1, vt->grid->max.row, 1, vt->grid->max.col }; int nparams; DEBUG_TRACE3("CSR", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_set_scroll_region( vt, params[0] - 1, params[1] - 1, params[2] - 1, params[3] - 1); } static void vt100_parser_handle_decsed(VT100Screen *vt, char *buf, size_t len) { /* XXX not quite correct, but i don't think programs really use anything * that would show a difference */ vt100_parser_handle_ed(vt, buf, len); } static void vt100_parser_handle_decsel(VT100Screen *vt, char *buf, size_t len) { /* XXX not quite correct, but i don't think programs really use anything * that would show a difference */ vt100_parser_handle_el(vt, buf, len); } static void vt100_parser_handle_osc0(VT100Screen *vt, char *buf, size_t len) { DEBUG_TRACE3("OSC0", buf + 4, len - 5); vt100_screen_set_icon_name(vt, buf + 4, len - 5); vt100_screen_set_window_title(vt, buf + 4, len - 5); } static void vt100_parser_handle_osc1(VT100Screen *vt, char *buf, size_t len) { DEBUG_TRACE3("OSC1", buf + 4, len - 5); vt100_screen_set_icon_name(vt, buf + 4, len - 5); } static void vt100_parser_handle_osc2(VT100Screen *vt, char *buf, size_t len) { DEBUG_TRACE3("OSC2", buf + 4, len - 5); vt100_screen_set_window_title(vt, buf + 4, len - 5); } static void vt100_parser_handle_ascii(VT100Screen *vt, char *text, size_t len) { DEBUG_TRACE3("TEXT", text, len); vt100_screen_show_string_ascii(vt, text, len); } static void vt100_parser_handle_text(VT100Screen *vt, char *text, size_t len) { DEBUG_TRACE3("UTF8", text, len); vt100_screen_show_string_utf8(vt, text, len); } static void vt100_parser_ignore(VT100Screen *vt) { DEBUG_TRACE1("ignoring"); UNUSED(vt); } // vim:ft=c