X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=std.c;h=fcfead924b3f87d122c68dd5279465ec5101f887;hb=0dedee5de8e35f4bab3d707d63be31943715264e;hp=53cbd2dde0f78be662ac4ea5705638bb990889de;hpb=0b3510df45057bf63f0e3b5ce225ff4491912bb8;p=st.git diff --git a/std.c b/std.c index 53cbd2d..fcfead9 100644 --- a/std.c +++ b/std.c @@ -6,6 +6,9 @@ #include #include #include +#if !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) +#include +#endif #include #include #include @@ -13,7 +16,7 @@ #include #include -#define LENGTH(x) (sizeof (x) / sizeof (x)[0]) +#define LENGTH(x) (sizeof(x) / sizeof((x)[0])) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define MIN(a,b) (((a) < (b)) ? (a) : (b)) @@ -25,14 +28,12 @@ void eprintn(const char *errstr, ...); void getpty(void); void movea(int x, int y); void mover(int x, int y); -void parse(void); +void parseesc(void); void scroll(int l); void shell(void); void sigchld(int n); char unbuffer(void); -enum { QuestionMark = 1, Digit = 2 }; - typedef struct { unsigned char data[BUFSIZ]; int s, e; @@ -41,10 +42,10 @@ typedef struct { int cols = 80, lines = 25; int cx = 0, cy = 0; -int c, s; +int c; FILE *fptm = NULL; int ptm, pts; -_Bool bold; +_Bool bold, digit, qmark; pid_t pid; RingBuffer buf; @@ -109,11 +110,9 @@ getpty(void) { ptm = posix_openpt(O_RDWR); #else ptm = open("/dev/ptmx", O_RDWR); - if(ptm == -1) { + if(ptm == -1) if(openpty(&ptm, &pts, NULL, NULL, NULL) == -1) eprintn("error, cannot open pty"); - return; - } #endif #if defined(_XOPEN_SOURCE) if(ptm != -1) { @@ -153,28 +152,27 @@ parseesc(void) { int arg[16]; memset(arg, 0, LENGTH(arg)); - s = 0; c = getc(fptm); switch(c) { case '[': c = getc(fptm); for(j = 0; j < LENGTH(arg);) { if(isdigit(c)) { - s |= Digit; + digit = 1; arg[j] *= 10; arg[j] += c - '0'; } else if(c == '?') - s |= QuestionMark; + qmark = 1; else if(c == ';') { - if(!(s & Digit)) - eprint("syntax error"); - s &= ~Digit; + if(!digit) + eprint("syntax error\n"); + digit = 0; j++; } else { - if(s & Digit) { - s &= ~Digit; + if(digit) { + digit = 0; j++; } break; @@ -311,12 +309,24 @@ unbuffer(void) { int main(int argc, char *argv[]) { - fd_set rd; if(argc == 2 && !strcmp("-v", argv[1])) eprint("std-"VERSION", © 2008 Matthias-Christian Ott\n"); else if(argc == 1) eprint("usage: st [-v]\n"); getpty(); shell(); + fptm = fdopen(ptm, "r+"); + if(!fptm) + eprintn("cannot open slave pty"); + for(;;) { + c = getc(fptm); + switch(c) { + case '\033': + parseesc(); + break; + default: + putchar(c); + } + } return 0; }