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…
	
		Reference in New Issue