diff options
| author | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2014-08-20 09:56:24 +0200 | 
|---|---|---|
| committer | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2014-08-20 21:52:33 +0200 | 
| commit | e5f6736ee0a0f29a14afec5494a5b3f204cedc1c (patch) | |
| tree | 5543bea5ce26bc67808f911f3785e94b5f909cc4 | |
| parent | a3549c2eecf12b3453e6c86ba1721e7837f23746 (diff) | |
| download | st-transparency-e5f6736ee0a0f29a14afec5494a5b3f204cedc1c.tar.gz st-transparency-e5f6736ee0a0f29a14afec5494a5b3f204cedc1c.tar.xz st-transparency-e5f6736ee0a0f29a14afec5494a5b3f204cedc1c.zip  | |
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.
| -rw-r--r-- | st.c | 169 | 
1 files changed, 91 insertions, 78 deletions
@@ -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;  		/*  | 
