tAdd eschandle() - st - [fork] customized build of st, the simple terminal | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e5f6736ee0a0f29a14afec5494a5b3f204cedc1c | |
parent a3549c2eecf12b3453e6c86ba1721e7837f23746 | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
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: | |
M st.c | 169 +++++++++++++++++------------… | |
1 file changed, 91 insertions(+), 78 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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); | |
t@@ -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) { | |
t@@ -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 | |
t@@ -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 … | |
- (uchar) ascii, isprint(ascii)? ascii:'… | |
- break; | |
- } | |
+ /* sequence already finished */ | |
} | |
term.esc = 0; | |
/* |