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.dev
							parent
							
								
									a3549c2eec
								
							
						
					
					
						commit
						e5f6736ee0
					
				
							
								
								
									
										169
									
								
								st.c
								
								
								
								
							
							
						
						
									
										169
									
								
								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); | ||||
|  | @ -2347,6 +2348,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) { | ||||
|  | @ -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; | ||||
| 			if (!eschandle(ascii)) | ||||
| 				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); | ||||
| 				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; | ||||
| 		/*
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue