tdrop stdio usage - st - [fork] customized build of st, the simple terminal | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit a49919a10c11c141f1bfb8414d5c8d2ca9d4a90e | |
parent 0c0ada8a7f6e916eb2b05ae5571e375e522d0a2e | |
Author: Matthias-Christian Ott <[email protected]> | |
Date: Sat, 14 Jun 2008 23:12:07 +0200 | |
drop stdio usage | |
Std requires I/O multiplexing which is very complicated with | |
stdio, because it provides no transparent buffering. | |
Diffstat: | |
M std.c | 40 ++++++++++++++++++++++++-----… | |
1 file changed, 31 insertions(+), 9 deletions(-) | |
--- | |
diff --git a/std.c b/std.c | |
t@@ -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); | |
t@@ -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]; | |
t@@ -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) { | |
t@@ -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); | |
t@@ -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; | |
t@@ -106,7 +124,7 @@ parseesc(void) { | |
} | |
break; | |
} | |
- c = getc(fptm); | |
+ c = getch(); | |
} | |
switch(c) { | |
case '@': | |
t@@ -180,7 +198,7 @@ parseesc(void) { | |
break; | |
default: | |
putchar('\033'); | |
- ungetc(c, fptm); | |
+ ungetch(c); | |
} | |
} | |
t@@ -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])) | |
t@@ -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(); |