st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit e5f6736ee0a0f29a14afec5494a5b3f204cedc1c
parent a3549c2eecf12b3453e6c86ba1721e7837f23746
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Wed, 20 Aug 2014 09:56:24 +0200

Add eschandle()

We already have a csihandle() function, where is located code about
CSI sequences, so it is logical do the same with ESC sequences.
This change helps to simplify tcontrol(), which has a complex flow
and should be rewritten.

Diffstat:
Mst.c | 169+++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 91 insertions(+), 78 deletions(-)
diff --git a/st.c b/st.c
@@ -356,6 +356,7 @@ static void csidump(void);
 static void csihandle(void);
 static void csiparse(void);
 static void csireset(void);
+static int eschandle(uchar ascii);
 static void strdump(void);
 static void strhandle(void);
 static void strparse(void);
@@ -2348,6 +2349,19 @@ tdeftran(char ascii) {
 }
 
 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
 tstrsequence(uchar c) {
     if (c & 0x80) {
         switch (c) {
@@ -2455,17 +2469,83 @@ tcontrolcode(uchar ascii) {
     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);
+/*
+ * returns 1 when the sequence is finished and it hasn't to read
+ * more characters for this sequence, otherwise 0
+ */
+int
+eschandle(uchar ascii) {
+    switch(ascii) {
+    case '[':
+        term.esc |= ESC_CSI;
+        return 0;
+    case '#':
+        term.esc |= ESC_TEST;
+        return 0;
+    case 'P': /* DCS -- Device Control String */
+    case '_': /* APC -- Application Program Command */
+    case '^': /* PM -- Privacy Message */
+    case ']': /* OSC -- Operating System Command */
+    case 'k': /* old title set compatibility */
+        tstrsequence(ascii);
+        return 0;
+    case '(': /* set primary charset G0 */
+    case ')': /* set secondary charset G1 */
+    case '*': /* set tertiary charset G2 */
+    case '+': /* set quaternary charset G3 */
+        term.icharset = ascii - '(';
+        term.esc |= ESC_ALTCHARSET;
+        return 0;
+    case 'D': /* IND -- Linefeed */
+        if(term.c.y == term.bot) {
+            tscrollup(term.top, 1);
+        } else {
+            tmoveto(term.c.x, term.c.y+1);
         }
+        break;
+    case 'E': /* NEL -- Next line */
+        tnewline(1); /* always go to first col */
+        break;
+    case 'H': /* HTS -- Horizontal tab stop */
+        term.tabs[term.c.x] = 1;
+        break;
+    case 'M': /* RI -- Reverse index */
+        if(term.c.y == term.top) {
+            tscrolldown(term.top, 1);
+        } else {
+            tmoveto(term.c.x, term.c.y-1);
+        }
+        break;
+    case 'Z': /* DECID -- Identify Terminal */
+        ttywrite(vtiden, sizeof(vtiden) - 1);
+        break;
+    case 'c': /* RIS -- Reset to inital state */
+        treset();
+        xresettitle();
+        xloadcols();
+        break;
+    case '=': /* DECPAM -- Application keypad */
+        term.mode |= MODE_APPKEYPAD;
+        break;
+    case '>': /* DECPNM -- Normal keypad */
+        term.mode &= ~MODE_APPKEYPAD;
+        break;
+    case '7': /* DECSC -- Save Cursor */
+        tcursor(CURSOR_SAVE);
+        break;
+    case '8': /* DECRC -- Restore Cursor */
+        tcursor(CURSOR_LOAD);
+        break;
+    case '\\': /* ST -- String Terminator */
+        if(term.esc & ESC_STR_END)
+            strhandle();
+        break;
+    default:
+        fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n",
+            (uchar) ascii, isprint(ascii)? ascii:'.');
+        break;
     }
+    return 1;
 }
 
 void
@@ -2552,76 +2632,9 @@ tputc(char *c, int len) {
         } else if(term.esc & ESC_TEST) {
             tdectest(ascii);
         } else {
-            switch(ascii) {
-            case '[':
-                term.esc |= ESC_CSI;
-                return;
-            case '#':
-                term.esc |= ESC_TEST;
-                return;
-            case 'P': /* DCS -- Device Control String */
-            case '_': /* APC -- Application Program Command */
-            case '^': /* PM -- Privacy Message */
-            case ']': /* OSC -- Operating System Command */
-            case 'k': /* old title set compatibility */
-                tstrsequence(ascii);
+            if (!eschandle(ascii))
                 return;
-            case '(': /* set primary charset G0 */
-            case ')': /* set secondary charset G1 */
-            case '*': /* set tertiary charset G2 */
-            case '+': /* set quaternary charset G3 */
-                term.icharset = ascii - '(';
-                term.esc |= ESC_ALTCHARSET;
-                return;
-            case 'D': /* IND -- Linefeed */
-                if(term.c.y == term.bot) {
-                    tscrollup(term.top, 1);
-                } else {
-                    tmoveto(term.c.x, term.c.y+1);
-                }
-                break;
-            case 'E': /* NEL -- Next line */
-                tnewline(1); /* always go to first col */
-                break;
-            case 'H': /* HTS -- Horizontal tab stop */
-                term.tabs[term.c.x] = 1;
-                break;
-            case 'M': /* RI -- Reverse index */
-                if(term.c.y == term.top) {
-                    tscrolldown(term.top, 1);
-                } else {
-                    tmoveto(term.c.x, term.c.y-1);
-                }
-                break;
-            case 'Z': /* DECID -- Identify Terminal */
-                ttywrite(vtiden, sizeof(vtiden) - 1);
-                break;
-            case 'c': /* RIS -- Reset to inital state */
-                treset();
-                xresettitle();
-                xloadcols();
-                break;
-            case '=': /* DECPAM -- Application keypad */
-                term.mode |= MODE_APPKEYPAD;
-                break;
-            case '>': /* DECPNM -- Normal keypad */
-                term.mode &= ~MODE_APPKEYPAD;
-                break;
-            case '7': /* DECSC -- Save Cursor */
-                tcursor(CURSOR_SAVE);
-                break;
-            case '8': /* DECRC -- Restore Cursor */
-                tcursor(CURSOR_LOAD);
-                break;
-            case '\\': /* ST -- String Terminator */
-                if(term.esc & ESC_STR_END)
-                    strhandle();
-                break;
-            default:
-                fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n",
-                    (uchar) ascii, isprint(ascii)? ascii:'.');
-                break;
-            }
+            /* sequence already finished */
         }
         term.esc = 0;
         /*