diff options
| -rw-r--r-- | std.c | 40 |
1 files changed, 31 insertions, 9 deletions
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | void buffer(char c); | 17 | void buffer(char c); |
| 18 | void cmd(const char *cmdstr, ...); | 18 | void cmd(const char *cmdstr, ...); |
| 19 | int getch(); | ||
| 19 | void getpty(void); | 20 | void getpty(void); |
| 20 | void movea(int x, int y); | 21 | void movea(int x, int y); |
| 21 | void mover(int x, int y); | 22 | void mover(int x, int y); |
| @@ -24,6 +25,7 @@ void scroll(int l); | |||
| 24 | void shell(void); | 25 | void shell(void); |
| 25 | void sigchld(int n); | 26 | void sigchld(int n); |
| 26 | char unbuffer(void); | 27 | char unbuffer(void); |
| 28 | void ungetch(int c); | ||
| 27 | 29 | ||
| 28 | typedef struct { | 30 | typedef 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 | ||
| 36 | typedef struct { | ||
| 37 | unsigned char data[BUFSIZ]; | ||
| 38 | int i, n; | ||
| 39 | } ReadBuffer; | ||
| 40 | |||
| 34 | int cols = 80, lines = 25; | 41 | int cols = 80, lines = 25; |
| 35 | int cx = 0, cy = 0; | 42 | int cx = 0, cy = 0; |
| 36 | int c; | 43 | int c; |
| 37 | FILE *fptm = NULL; | ||
| 38 | int ptm, pts; | 44 | int ptm, pts; |
| 39 | _Bool bold, digit, qmark; | 45 | _Bool bold, digit, qmark; |
| 40 | pid_t pid; | 46 | pid_t pid; |
| 41 | RingBuffer buf; | 47 | RingBuffer buf; |
| 48 | ReadBuffer rbuf; | ||
| 42 | 49 | ||
| 43 | void | 50 | void |
| 44 | buffer(char c) { | 51 | buffer(char c) { |
| @@ -61,6 +68,17 @@ cmd(const char *cmdstr, ...) { | |||
| 61 | va_end(ap); | 68 | va_end(ap); |
| 62 | } | 69 | } |
| 63 | 70 | ||
| 71 | int | ||
| 72 | getch() { | ||
| 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 | |||
| 64 | void | 82 | void |
| 65 | movea(int x, int y) { | 83 | movea(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 | ||
| 257 | void | ||
| 258 | ungetch(int c) { | ||
| 259 | if(rbuf.i + 1 >= rbuf.n) | ||
| 260 | eprint("error, read buffer full\n"); | ||
| 261 | rbuf.data[rbuf.i++] = c; | ||
| 262 | } | ||
| 263 | |||
| 239 | int | 264 | int |
| 240 | main(int argc, char *argv[]) { | 265 | main(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(); |
