aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--st.c169
1 files changed, 91 insertions, 78 deletions
diff --git a/st.c b/st.c
index 009388c..f15e868 100644
--- a/st.c
+++ b/st.c
@@ -356,6 +356,7 @@ static void csidump(void);
356static void csihandle(void); 356static void csihandle(void);
357static void csiparse(void); 357static void csiparse(void);
358static void csireset(void); 358static void csireset(void);
359static int eschandle(uchar ascii);
359static void strdump(void); 360static void strdump(void);
360static void strhandle(void); 361static void strhandle(void);
361static void strparse(void); 362static void strparse(void);
@@ -2348,6 +2349,19 @@ tdeftran(char ascii) {
2348} 2349}
2349 2350
2350void 2351void
2352tdectest(char c) {
2353 static char E[UTF_SIZ] = "E";
2354 int x, y;
2355
2356 if(c == '8') { /* DEC screen alignment test. */
2357 for(x = 0; x < term.col; ++x) {
2358 for(y = 0; y < term.row; ++y)
2359 tsetchar(E, &term.c.attr, x, y);
2360 }
2361 }
2362}
2363
2364void
2351tstrsequence(uchar c) { 2365tstrsequence(uchar c) {
2352 if (c & 0x80) { 2366 if (c & 0x80) {
2353 switch (c) { 2367 switch (c) {
@@ -2455,17 +2469,83 @@ tcontrolcode(uchar ascii) {
2455 return; 2469 return;
2456} 2470}
2457 2471
2458void 2472/*
2459tdectest(char c) { 2473 * returns 1 when the sequence is finished and it hasn't to read
2460 static char E[UTF_SIZ] = "E"; 2474 * more characters for this sequence, otherwise 0
2461 int x, y; 2475 */
2462 2476int
2463 if(c == '8') { /* DEC screen alignment test. */ 2477eschandle(uchar ascii) {
2464 for(x = 0; x < term.col; ++x) { 2478 switch(ascii) {
2465 for(y = 0; y < term.row; ++y) 2479 case '[':
2466 tsetchar(E, &term.c.attr, x, y); 2480 term.esc |= ESC_CSI;
2481 return 0;
2482 case '#':
2483 term.esc |= ESC_TEST;
2484 return 0;
2485 case 'P': /* DCS -- Device Control String */
2486 case '_': /* APC -- Application Program Command */
2487 case '^': /* PM -- Privacy Message */
2488 case ']': /* OSC -- Operating System Command */
2489 case 'k': /* old title set compatibility */
2490 tstrsequence(ascii);
2491 return 0;
2492 case '(': /* set primary charset G0 */
2493 case ')': /* set secondary charset G1 */
2494 case '*': /* set tertiary charset G2 */
2495 case '+': /* set quaternary charset G3 */
2496 term.icharset = ascii - '(';
2497 term.esc |= ESC_ALTCHARSET;
2498 return 0;
2499 case 'D': /* IND -- Linefeed */
2500 if(term.c.y == term.bot) {
2501 tscrollup(term.top, 1);
2502 } else {
2503 tmoveto(term.c.x, term.c.y+1);
2467 } 2504 }
2505 break;
2506 case 'E': /* NEL -- Next line */
2507 tnewline(1); /* always go to first col */
2508 break;
2509 case 'H': /* HTS -- Horizontal tab stop */
2510 term.tabs[term.c.x] = 1;
2511 break;
2512 case 'M': /* RI -- Reverse index */
2513 if(term.c.y == term.top) {
2514 tscrolldown(term.top, 1);
2515 } else {
2516 tmoveto(term.c.x, term.c.y-1);
2517 }
2518 break;
2519 case 'Z': /* DECID -- Identify Terminal */
2520 ttywrite(vtiden, sizeof(vtiden) - 1);
2521 break;
2522 case 'c': /* RIS -- Reset to inital state */
2523 treset();
2524 xresettitle();
2525 xloadcols();
2526 break;
2527 case '=': /* DECPAM -- Application keypad */
2528 term.mode |= MODE_APPKEYPAD;
2529 break;
2530 case '>': /* DECPNM -- Normal keypad */
2531 term.mode &= ~MODE_APPKEYPAD;
2532 break;
2533 case '7': /* DECSC -- Save Cursor */
2534 tcursor(CURSOR_SAVE);
2535 break;
2536 case '8': /* DECRC -- Restore Cursor */
2537 tcursor(CURSOR_LOAD);
2538 break;
2539 case '\\': /* ST -- String Terminator */
2540 if(term.esc & ESC_STR_END)
2541 strhandle();
2542 break;
2543 default:
2544 fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n",
2545 (uchar) ascii, isprint(ascii)? ascii:'.');
2546 break;
2468 } 2547 }
2548 return 1;
2469} 2549}
2470 2550
2471void 2551void
@@ -2552,76 +2632,9 @@ tputc(char *c, int len) {
2552 } else if(term.esc & ESC_TEST) { 2632 } else if(term.esc & ESC_TEST) {
2553 tdectest(ascii); 2633 tdectest(ascii);
2554 } else { 2634 } else {
2555 switch(ascii) { 2635 if (!eschandle(ascii))
2556 case '[':
2557 term.esc |= ESC_CSI;
2558 return;
2559 case '#':
2560 term.esc |= ESC_TEST;
2561 return;
2562 case 'P': /* DCS -- Device Control String */
2563 case '_': /* APC -- Application Program Command */
2564 case '^': /* PM -- Privacy Message */
2565 case ']': /* OSC -- Operating System Command */
2566 case 'k': /* old title set compatibility */
2567 tstrsequence(ascii);
2568 return; 2636 return;
2569 case '(': /* set primary charset G0 */ 2637 /* sequence already finished */
2570 case ')': /* set secondary charset G1 */
2571 case '*': /* set tertiary charset G2 */
2572 case '+': /* set quaternary charset G3 */
2573 term.icharset = ascii - '(';
2574 term.esc |= ESC_ALTCHARSET;
2575 return;
2576 case 'D': /* IND -- Linefeed */
2577 if(term.c.y == term.bot) {
2578 tscrollup(term.top, 1);
2579 } else {
2580 tmoveto(term.c.x, term.c.y+1);
2581 }
2582 break;
2583 case 'E': /* NEL -- Next line */
2584 tnewline(1); /* always go to first col */
2585 break;
2586 case 'H': /* HTS -- Horizontal tab stop */
2587 term.tabs[term.c.x] = 1;
2588 break;
2589 case 'M': /* RI -- Reverse index */
2590 if(term.c.y == term.top) {
2591 tscrolldown(term.top, 1);
2592 } else {
2593 tmoveto(term.c.x, term.c.y-1);
2594 }
2595 break;
2596 case 'Z': /* DECID -- Identify Terminal */
2597 ttywrite(vtiden, sizeof(vtiden) - 1);
2598 break;
2599 case 'c': /* RIS -- Reset to inital state */
2600 treset();
2601 xresettitle();
2602 xloadcols();
2603 break;
2604 case '=': /* DECPAM -- Application keypad */
2605 term.mode |= MODE_APPKEYPAD;
2606 break;
2607 case '>': /* DECPNM -- Normal keypad */
2608 term.mode &= ~MODE_APPKEYPAD;
2609 break;
2610 case '7': /* DECSC -- Save Cursor */
2611 tcursor(CURSOR_SAVE);
2612 break;
2613 case '8': /* DECRC -- Restore Cursor */
2614 tcursor(CURSOR_LOAD);
2615 break;
2616 case '\\': /* ST -- String Terminator */
2617 if(term.esc & ESC_STR_END)
2618 strhandle();
2619 break;
2620 default:
2621 fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n",
2622 (uchar) ascii, isprint(ascii)? ascii:'.');
2623 break;
2624 }
2625 } 2638 }
2626 term.esc = 0; 2639 term.esc = 0;
2627 /* 2640 /*