Allow control characters inside escape sequences
Taken from vt100 manual programmer: Control characters (codes \0 to \37 inclusive) are specifically excluded from the control sequence syntax, but may be embedded within a control sequence. Embedded control characters are executed as soon as they are encountered by the VT100. The processing of the control sequence then continues with the next character received. --- st.c | 68 +++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 34 insertions(+), 34 deletions(-)
This commit is contained in:
		
							
								
								
									
										68
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								st.c
									
									
									
									
									
								
							@ -1668,6 +1668,32 @@ tputc(char *c, int len) {
 | 
				
			|||||||
	if(iofd != -1)
 | 
						if(iofd != -1)
 | 
				
			||||||
		write(iofd, c, len);
 | 
							write(iofd, c, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch(ascii) {
 | 
				
			||||||
 | 
						case '\t':
 | 
				
			||||||
 | 
							tputtab(1);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						case '\b':
 | 
				
			||||||
 | 
							tmoveto(term.c.x-1, term.c.y);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						case '\r':
 | 
				
			||||||
 | 
							tmoveto(0, term.c.y);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						case '\f':
 | 
				
			||||||
 | 
						case '\v':
 | 
				
			||||||
 | 
						case '\n':
 | 
				
			||||||
 | 
							/* go to first col if the mode is set */
 | 
				
			||||||
 | 
							tnewline(IS_SET(MODE_CRLF));
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						case '\a':
 | 
				
			||||||
 | 
							if(!(xw.state & WIN_FOCUSED))
 | 
				
			||||||
 | 
								xseturgency(1);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						case '\033':
 | 
				
			||||||
 | 
							csireset();
 | 
				
			||||||
 | 
							term.esc = ESC_START;
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(term.esc & ESC_START) {
 | 
						if(term.esc & ESC_START) {
 | 
				
			||||||
		if(term.esc & ESC_CSI) {
 | 
							if(term.esc & ESC_CSI) {
 | 
				
			||||||
			csiescseq.buf[csiescseq.len++] = ascii;
 | 
								csiescseq.buf[csiescseq.len++] = ascii;
 | 
				
			||||||
@ -1791,40 +1817,14 @@ tputc(char *c, int len) {
 | 
				
			|||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
 | 
							if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
 | 
				
			||||||
			sel.bx = -1;
 | 
								sel.bx = -1;
 | 
				
			||||||
		switch(ascii) {
 | 
							if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
 | 
				
			||||||
		case '\t':
 | 
								if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
 | 
				
			||||||
			tputtab(1);
 | 
									tnewline(1); /* always go to first col */
 | 
				
			||||||
			break;
 | 
								tsetchar(c);
 | 
				
			||||||
		case '\b':
 | 
								if(term.c.x+1 < term.col)
 | 
				
			||||||
			tmoveto(term.c.x-1, term.c.y);
 | 
									tmoveto(term.c.x+1, term.c.y);
 | 
				
			||||||
			break;
 | 
								else
 | 
				
			||||||
		case '\r':
 | 
									term.c.state |= CURSOR_WRAPNEXT;
 | 
				
			||||||
			tmoveto(0, term.c.y);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		case '\f':
 | 
					 | 
				
			||||||
		case '\v':
 | 
					 | 
				
			||||||
		case '\n':
 | 
					 | 
				
			||||||
			/* go to first col if the mode is set */
 | 
					 | 
				
			||||||
			tnewline(IS_SET(MODE_CRLF));
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		case '\a':
 | 
					 | 
				
			||||||
			if(!(xw.state & WIN_FOCUSED))
 | 
					 | 
				
			||||||
				xseturgency(1);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		case '\033':
 | 
					 | 
				
			||||||
			csireset();
 | 
					 | 
				
			||||||
			term.esc = ESC_START;
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
 | 
					 | 
				
			||||||
				if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
 | 
					 | 
				
			||||||
					tnewline(1); /* always go to first col */
 | 
					 | 
				
			||||||
				tsetchar(c);
 | 
					 | 
				
			||||||
				if(term.c.x+1 < term.col)
 | 
					 | 
				
			||||||
					tmoveto(term.c.x+1, term.c.y);
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
					term.c.state |= CURSOR_WRAPNEXT;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user