aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--std.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/std.c b/std.c
index a7b2f4a..961ca55 100644
--- a/std.c
+++ b/std.c
@@ -16,6 +16,7 @@
16 16
17void buffer(char c); 17void buffer(char c);
18void cmd(const char *cmdstr, ...); 18void cmd(const char *cmdstr, ...);
19int getch();
19void getpty(void); 20void getpty(void);
20void movea(int x, int y); 21void movea(int x, int y);
21void mover(int x, int y); 22void mover(int x, int y);
@@ -24,6 +25,7 @@ void scroll(int l);
24void shell(void); 25void shell(void);
25void sigchld(int n); 26void sigchld(int n);
26char unbuffer(void); 27char unbuffer(void);
28void ungetch(int c);
27 29
28typedef struct { 30typedef struct {
29 unsigned char data[BUFSIZ]; 31 unsigned char data[BUFSIZ];
@@ -31,14 +33,19 @@ typedef struct {
31 int n; 33 int n;
32} RingBuffer; 34} RingBuffer;
33 35
36typedef struct {
37 unsigned char data[BUFSIZ];
38 int i, n;
39} ReadBuffer;
40
34int cols = 80, lines = 25; 41int cols = 80, lines = 25;
35int cx = 0, cy = 0; 42int cx = 0, cy = 0;
36int c; 43int c;
37FILE *fptm = NULL;
38int ptm, pts; 44int ptm, pts;
39_Bool bold, digit, qmark; 45_Bool bold, digit, qmark;
40pid_t pid; 46pid_t pid;
41RingBuffer buf; 47RingBuffer buf;
48ReadBuffer rbuf;
42 49
43void 50void
44buffer(char c) { 51buffer(char c) {
@@ -61,6 +68,17 @@ cmd(const char *cmdstr, ...) {
61 va_end(ap); 68 va_end(ap);
62} 69}
63 70
71int
72getch() {
73 if(rbuf.i++ >= rbuf.n) {
74 rbuf.n = read(ptm, rbuf.data, LENGTH(rbuf.data));
75 if(rbuf.n == -1)
76 eprintn("error, cannot read from slave pty");
77 rbuf.i = 0;
78 }
79 return rbuf.data[rbuf.i];
80}
81
64void 82void
65movea(int x, int y) { 83movea(int x, int y) {
66 x = MAX(x, cols); 84 x = MAX(x, cols);
@@ -81,10 +99,10 @@ parseesc(void) {
81 int arg[16]; 99 int arg[16];
82 100
83 memset(arg, 0, LENGTH(arg)); 101 memset(arg, 0, LENGTH(arg));
84 c = getc(fptm); 102 c = getch();
85 switch(c) { 103 switch(c) {
86 case '[': 104 case '[':
87 c = getc(fptm); 105 c = getch();
88 for(j = 0; j < LENGTH(arg);) { 106 for(j = 0; j < LENGTH(arg);) {
89 if(isdigit(c)) { 107 if(isdigit(c)) {
90 digit = 1; 108 digit = 1;
@@ -106,7 +124,7 @@ parseesc(void) {
106 } 124 }
107 break; 125 break;
108 } 126 }
109 c = getc(fptm); 127 c = getch();
110 } 128 }
111 switch(c) { 129 switch(c) {
112 case '@': 130 case '@':
@@ -180,7 +198,7 @@ parseesc(void) {
180 break; 198 break;
181 default: 199 default:
182 putchar('\033'); 200 putchar('\033');
183 ungetc(c, fptm); 201 ungetch(c);
184 } 202 }
185} 203}
186 204
@@ -236,6 +254,13 @@ unbuffer(void) {
236 return c; 254 return c;
237} 255}
238 256
257void
258ungetch(int c) {
259 if(rbuf.i + 1 >= rbuf.n)
260 eprint("error, read buffer full\n");
261 rbuf.data[rbuf.i++] = c;
262}
263
239int 264int
240main(int argc, char *argv[]) { 265main(int argc, char *argv[]) {
241 if(argc == 2 && !strcmp("-v", argv[1])) 266 if(argc == 2 && !strcmp("-v", argv[1]))
@@ -244,11 +269,8 @@ main(int argc, char *argv[]) {
244 eprint("usage: st [-v]\n"); 269 eprint("usage: st [-v]\n");
245 getpty(); 270 getpty();
246 shell(); 271 shell();
247 fptm = fdopen(ptm, "r+");
248 if(!fptm)
249 eprintn("cannot open slave pty");
250 for(;;) { 272 for(;;) {
251 c = getc(fptm); 273 c = getch();
252 switch(c) { 274 switch(c) {
253 case '\033': 275 case '\033':
254 parseesc(); 276 parseesc();