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.
This commit is contained in:
		
							parent
							
								
									a3549c2eec
								
							
						
					
					
						commit
						e5f6736ee0
					
				
							
								
								
									
										169
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								st.c
									
									
									
									
									
								
							| @ -356,6 +356,7 @@ static void csidump(void); | |||||||
| static void csihandle(void); | static void csihandle(void); | ||||||
| static void csiparse(void); | static void csiparse(void); | ||||||
| static void csireset(void); | static void csireset(void); | ||||||
|  | static int eschandle(uchar ascii); | ||||||
| static void strdump(void); | static void strdump(void); | ||||||
| static void strhandle(void); | static void strhandle(void); | ||||||
| static void strparse(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 | void | ||||||
| tstrsequence(uchar c) { | tstrsequence(uchar c) { | ||||||
| 	if (c & 0x80) { | 	if (c & 0x80) { | ||||||
| @ -2455,17 +2469,83 @@ tcontrolcode(uchar ascii) { | |||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | /*
 | ||||||
| tdectest(char c) { |  * returns 1 when the sequence is finished and it hasn't to read | ||||||
| 	static char E[UTF_SIZ] = "E"; |  * more characters for this sequence, otherwise 0 | ||||||
| 	int x, y; |  */ | ||||||
| 
 | int | ||||||
| 	if(c == '8') { /* DEC screen alignment test. */ | eschandle(uchar ascii) { | ||||||
| 		for(x = 0; x < term.col; ++x) { | 	switch(ascii) { | ||||||
| 			for(y = 0; y < term.row; ++y) | 	case '[': | ||||||
| 				tsetchar(E, &term.c.attr, x, y); | 		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 | void | ||||||
| @ -2552,76 +2632,9 @@ tputc(char *c, int len) { | |||||||
| 		} else if(term.esc & ESC_TEST) { | 		} else if(term.esc & ESC_TEST) { | ||||||
| 			tdectest(ascii); | 			tdectest(ascii); | ||||||
| 		} else { | 		} else { | ||||||
| 			switch(ascii) { | 			if (!eschandle(ascii)) | ||||||
| 			case '[': |  | ||||||
| 				term.esc |= ESC_CSI; |  | ||||||
| 				return; | 				return; | ||||||
| 			case '#': | 			/* sequence already finished */ | ||||||
| 				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; |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 		term.esc = 0; | 		term.esc = 0; | ||||||
| 		/*
 | 		/*
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user