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.master
							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;
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in New Issue