drop stdio usage
Std requires I/O multiplexing which is very complicated with stdio, because it provides no transparent buffering.
This commit is contained in:
		
							parent
							
								
									0c0ada8a7f
								
							
						
					
					
						commit
						a49919a10c
					
				
							
								
								
									
										40
									
								
								std.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								std.c
									
									
									
									
									
								
							| @ -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(); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Matthias-Christian Ott
						Matthias-Christian Ott