| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -16,6 +16,7 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void buffer(char c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void cmd(const char *cmdstr, ...); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int getch(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void getpty(void); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void movea(int x, int y); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void mover(int x, int y); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -24,6 +25,7 @@ void scroll(int l); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void shell(void); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void sigchld(int n); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					char unbuffer(void); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void ungetch(int c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					typedef struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned char data[BUFSIZ]; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -31,14 +33,19 @@ typedef struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int n; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} RingBuffer; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					typedef struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned char data[BUFSIZ]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int i, n; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} ReadBuffer; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int cols = 80, lines = 25; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int cx = 0, cy = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					FILE *fptm = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int ptm, pts; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					_Bool bold, digit, qmark; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					pid_t pid; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					RingBuffer buf; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					ReadBuffer rbuf; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					buffer(char c) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -61,6 +68,17 @@ cmd(const char *cmdstr, ...) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						va_end(ap); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					getch() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(rbuf.i++ >= rbuf.n) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							rbuf.n = read(ptm, rbuf.data, LENGTH(rbuf.data)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(rbuf.n == -1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								eprintn("error, cannot read from slave pty"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							rbuf.i = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return rbuf.data[rbuf.i]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					movea(int x, int y) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						x = MAX(x, cols); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -81,10 +99,10 @@ parseesc(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int arg[16]; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						memset(arg, 0, LENGTH(arg)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c = getc(fptm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c = getch(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						switch(c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						case '[': | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c = getc(fptm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c = getch(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(j = 0; j < LENGTH(arg);) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(isdigit(c)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									digit = 1; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -106,7 +124,7 @@ parseesc(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c = getc(fptm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c = getch(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							switch(c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							case '@': | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -180,7 +198,7 @@ parseesc(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						default: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							putchar('\033'); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							ungetc(c, fptm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							ungetch(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -236,6 +254,13 @@ unbuffer(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					ungetch(int c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(rbuf.i + 1 >= rbuf.n) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("error, read buffer full\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						rbuf.data[rbuf.i++] = c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(argc == 2 && !strcmp("-v", argv[1])) | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -244,11 +269,8 @@ main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("usage: st [-v]\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						getpty(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						shell(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						fptm = fdopen(ptm, "r+"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!fptm) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprintn("cannot open slave pty"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(;;) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c = getc(fptm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c = getch(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							switch(c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							case '\033': | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								parseesc(); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |