add prototype for command parsing
This commit is contained in:
		
							
								
								
									
										81
									
								
								std.c
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								std.c
									
									
									
									
									
								
							| @@ -18,19 +18,6 @@ | |||||||
| #define MAX(a,b)	(((a) > (b)) ? (a) : (b)) | #define MAX(a,b)	(((a) > (b)) ? (a) : (b)) | ||||||
| #define MIN(a,b)	(((a) < (b)) ? (a) : (b)) | #define MIN(a,b)	(((a) < (b)) ? (a) : (b)) | ||||||
|  |  | ||||||
| static void buffer(char c); |  | ||||||
| static void cmd(const char *cmdstr, ...); |  | ||||||
| static int getch(); |  | ||||||
| static void getpty(void); |  | ||||||
| static void movea(int x, int y); |  | ||||||
| static void mover(int x, int y); |  | ||||||
| static void parseesc(void); |  | ||||||
| static void scroll(int l); |  | ||||||
| static void shell(void); |  | ||||||
| static void sigchld(int n); |  | ||||||
| static char unbuffer(void); |  | ||||||
| static void ungetch(int c); |  | ||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
| 	unsigned char data[BUFSIZ]; | 	unsigned char data[BUFSIZ]; | ||||||
| 	int s, e; | 	int s, e; | ||||||
| @@ -40,8 +27,23 @@ typedef struct { | |||||||
| typedef struct { | typedef struct { | ||||||
| 	unsigned char data[BUFSIZ]; | 	unsigned char data[BUFSIZ]; | ||||||
| 	int i, n; | 	int i, n; | ||||||
|  | 	int fd; | ||||||
| } ReadBuffer; | } ReadBuffer; | ||||||
|  |  | ||||||
|  | static void buffer(char c); | ||||||
|  | static void cmd(const char *cmdstr, ...); | ||||||
|  | static int getch(ReadBuffer *buf); | ||||||
|  | static void getpty(void); | ||||||
|  | static void movea(int x, int y); | ||||||
|  | static void mover(int x, int y); | ||||||
|  | static void parsecmd(void); | ||||||
|  | static void parseesc(void); | ||||||
|  | static void scroll(int l); | ||||||
|  | static void shell(void); | ||||||
|  | static void sigchld(int n); | ||||||
|  | static char unbuffer(void); | ||||||
|  | static void ungetch(ReadBuffer *buf, int c); | ||||||
|  |  | ||||||
| static int cols = 80, lines = 25; | static int cols = 80, lines = 25; | ||||||
| static int cx = 0, cy = 0; | static int cx = 0, cy = 0; | ||||||
| static int c; | static int c; | ||||||
| @@ -49,7 +51,7 @@ static int ptm, pts; | |||||||
| static _Bool bold, digit, qmark; | static _Bool bold, digit, qmark; | ||||||
| static pid_t pid; | static pid_t pid; | ||||||
| static RingBuffer buf; | static RingBuffer buf; | ||||||
| static ReadBuffer rbuf; | static ReadBuffer cmdbuf, ptmbuf; | ||||||
|  |  | ||||||
| void | void | ||||||
| buffer(char c) { | buffer(char c) { | ||||||
| @@ -73,14 +75,14 @@ cmd(const char *cmdstr, ...) { | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| getch() { | getch(ReadBuffer *buf) { | ||||||
| 	if(rbuf.i++ >= rbuf.n) { | 	if(buf->i++ >= buf->n) { | ||||||
| 		rbuf.n = read(ptm, rbuf.data, LENGTH(rbuf.data)); | 		buf->n = read(buf->fd, buf->data, BUFSIZ); | ||||||
| 		if(rbuf.n == -1) | 		if(buf->n == -1) | ||||||
| 			err(EXIT_FAILURE, "cannot read from slave pty"); | 			err(EXIT_FAILURE, "cannot read"); | ||||||
| 		rbuf.i = 0; | 		buf->i = 0; | ||||||
| 	} | 	} | ||||||
| 	return rbuf.data[rbuf.i]; | 	return buf->data[buf->i]; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @@ -97,16 +99,20 @@ mover(int x, int y) { | |||||||
| 	movea(cx + x, cy + y); | 	movea(cx + x, cy + y); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void | ||||||
|  | parsecmd(void) { | ||||||
|  | } | ||||||
|  |  | ||||||
| void | void | ||||||
| parseesc(void) { | parseesc(void) { | ||||||
| 	int i, j; | 	int i, j; | ||||||
| 	int arg[16]; | 	int arg[16]; | ||||||
|  |  | ||||||
| 	memset(arg, 0, LENGTH(arg)); | 	memset(arg, 0, LENGTH(arg)); | ||||||
| 	c = getch(); | 	c = getch(&ptmbuf); | ||||||
| 	switch(c) { | 	switch(c) { | ||||||
| 	case '[': | 	case '[': | ||||||
| 		c = getch(); | 		c = getch(&ptmbuf); | ||||||
| 		for(j = 0; j < LENGTH(arg);) { | 		for(j = 0; j < LENGTH(arg);) { | ||||||
| 			if(isdigit(c)) { | 			if(isdigit(c)) { | ||||||
| 				digit = 1; | 				digit = 1; | ||||||
| @@ -128,7 +134,7 @@ parseesc(void) { | |||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			c = getch(); | 			c = getch(&ptmbuf); | ||||||
| 		} | 		} | ||||||
| 		switch(c) { | 		switch(c) { | ||||||
| 		case '@': | 		case '@': | ||||||
| @@ -202,7 +208,7 @@ parseesc(void) { | |||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		putchar('\033'); | 		putchar('\033'); | ||||||
| 		ungetch(c); | 		ungetch(&ptmbuf, c); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -291,10 +297,10 @@ unbuffer(void) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| ungetch(int c) { | ungetch(ReadBuffer *buf, int c) { | ||||||
| 	if(rbuf.i + 1 >= rbuf.n) | 	if(buf->i + 1 >= buf->n) | ||||||
| 		errx(EXIT_FAILURE, "read buffer full"); | 		errx(EXIT_FAILURE, "buffer full"); | ||||||
| 	rbuf.data[rbuf.i++] = c; | 	buf->data[buf->i++] = c; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| @@ -307,15 +313,28 @@ main(int argc, char *argv[]) { | |||||||
| 		errx(EXIT_FAILURE, "usage: std [-v]"); | 		errx(EXIT_FAILURE, "usage: std [-v]"); | ||||||
| 	getpty(); | 	getpty(); | ||||||
| 	shell(); | 	shell(); | ||||||
|  | 	cmdbuf.fd = STDIN_FILENO; | ||||||
|  | 	ptmbuf.fd = ptm; | ||||||
| 	FD_ZERO(&rfds); | 	FD_ZERO(&rfds); | ||||||
| 	FD_SET(STDIN_FILENO, &rfds); | 	FD_SET(STDIN_FILENO, &rfds); | ||||||
| 	FD_SET(ptm, &rfds); | 	FD_SET(ptm, &rfds); | ||||||
| 	for(;;) { | 	for(;;) { | ||||||
| 		if(select(ptm + 1, &rfds, NULL, NULL, NULL) == -1) | 		if(select(ptm + 1, &rfds, NULL, NULL, NULL) == -1) | ||||||
| 			err(EXIT_FAILURE, "cannot select"); | 			err(EXIT_FAILURE, "cannot select"); | ||||||
|  | 		if(FD_ISSET(STDIN_FILENO, &rfds)) | ||||||
|  | 			do { | ||||||
|  | 				c = getch(&cmdbuf); | ||||||
|  | 				switch(c) { | ||||||
|  | 				case ':': | ||||||
|  | 					parsecmd(); | ||||||
|  | 					break; | ||||||
|  | 				default: | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
|  | 			} while(cmdbuf.i < cmdbuf.n); | ||||||
| 		if(FD_ISSET(ptm, &rfds)) { | 		if(FD_ISSET(ptm, &rfds)) { | ||||||
| 			do { | 			do { | ||||||
| 				c = getch(); | 				c = getch(&ptmbuf); | ||||||
| 				switch(c) { | 				switch(c) { | ||||||
| 				case '\033': | 				case '\033': | ||||||
| 					parseesc(); | 					parseesc(); | ||||||
| @@ -323,7 +342,7 @@ main(int argc, char *argv[]) { | |||||||
| 				default: | 				default: | ||||||
| 					putchar(c); | 					putchar(c); | ||||||
| 				} | 				} | ||||||
| 			} while(rbuf.i < rbuf.n); | 			} while(ptmbuf.i < ptmbuf.n); | ||||||
| 			fflush(stdout); | 			fflush(stdout); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user