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