add prototype for command parsing - st - Simple Terminal
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d61a2a8fce2638594644feb664ce04398825b0f3
 (DIR) parent 240411e7d08006f181afbf70930f748d7585ce85
 (HTM) Author: Matthias-Christian Ott <ott@enolink.de>
       Date:   Thu,  7 Aug 2008 10:38:54 +0200
       
       add prototype for command parsing
       
       Diffstat:
         std.c                               |      81 +++++++++++++++++++------------
       
       1 file changed, 50 insertions(+), 31 deletions(-)
       ---
 (DIR) diff --git a/std.c b/std.c
       @@ -18,19 +18,6 @@
        #define MAX(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);
       -
        ttypedef struct {
                unsigned char data[BUFSIZ];
                int s, e;
       @@ -40,8 +27,23 @@ typedef struct {
        ttypedef struct {
                unsigned char data[BUFSIZ];
                int i, n;
       +        int fd;
        } 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 cx = 0, cy = 0;
        static int c;
       @@ -49,7 +51,7 @@ static int ptm, pts;
        static _Bool bold, digit, qmark;
        static pid_t pid;
        static RingBuffer buf;
       -static ReadBuffer rbuf;
       +static ReadBuffer cmdbuf, ptmbuf;
        
        void
        buffer(char c) {
       @@ -73,14 +75,14 @@ cmd(const char *cmdstr, ...) {
        }
        
        int
       -getch() {
       -        if(rbuf.i++ >= rbuf.n) {
       -                rbuf.n = read(ptm, rbuf.data, LENGTH(rbuf.data));
       -                if(rbuf.n == -1)
       -                        err(EXIT_FAILURE, "cannot read from slave pty");
       -                rbuf.i = 0;
       +getch(ReadBuffer *buf) {
       +        if(buf->i++ >= buf->n) {
       +                buf->n = read(buf->fd, buf->data, BUFSIZ);
       +                if(buf->n == -1)
       +                        err(EXIT_FAILURE, "cannot read");
       +                buf->i = 0;
                }
       -        return rbuf.data[rbuf.i];
       +        return buf->data[buf->i];
        }
        
        void
       @@ -98,15 +100,19 @@ mover(int x, int y) {
        }
        
        void
       +parsecmd(void) {
       +}
       +
       +void
        parseesc(void) {
                int i, j;
                int arg[16];
        
                memset(arg, 0, LENGTH(arg));
       -        c = getch();
       +        c = getch(&ptmbuf);
                switch(c) {
                case '[':
       -                c = getch();
       +                c = getch(&ptmbuf);
                        for(j = 0; j < LENGTH(arg);) {
                                if(isdigit(c)) {
                                        digit = 1;
       @@ -128,7 +134,7 @@ parseesc(void) {
                                        }
                                        break;
                                }
       -                        c = getch();
       +                        c = getch(&ptmbuf);
                        }
                        switch(c) {
                        case '@':
       @@ -202,7 +208,7 @@ parseesc(void) {
                        break;
                default:
                        putchar('\033');
       -                ungetch(c);
       +                ungetch(&ptmbuf, c);
                }
        }
        
       @@ -291,10 +297,10 @@ unbuffer(void) {
        }
        
        void
       -ungetch(int c) {
       -        if(rbuf.i + 1 >= rbuf.n)
       -                errx(EXIT_FAILURE, "read buffer full");
       -        rbuf.data[rbuf.i++] = c;
       +ungetch(ReadBuffer *buf, int c) {
       +        if(buf->i + 1 >= buf->n)
       +                errx(EXIT_FAILURE, "buffer full");
       +        buf->data[buf->i++] = c;
        }
        
        int
       @@ -307,15 +313,28 @@ main(int argc, char *argv[]) {
                        errx(EXIT_FAILURE, "usage: std [-v]");
                getpty();
                shell();
       +        cmdbuf.fd = STDIN_FILENO;
       +        ptmbuf.fd = ptm;
                FD_ZERO(&rfds);
                FD_SET(STDIN_FILENO, &rfds);
                FD_SET(ptm, &rfds);
                for(;;) {
                        if(select(ptm + 1, &rfds, NULL, NULL, NULL) == -1)
                                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)) {
                                do {
       -                                c = getch();
       +                                c = getch(&ptmbuf);
                                        switch(c) {
                                        case '\033':
                                                parseesc();
       @@ -323,7 +342,7 @@ main(int argc, char *argv[]) {
                                        default:
                                                putchar(c);
                                        }
       -                        } while(rbuf.i < rbuf.n);
       +                        } while(ptmbuf.i < ptmbuf.n);
                                fflush(stdout);
                        }
                }