# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit a49919a10c11c141f1bfb8414d5c8d2ca9d4a90e
    parent 0c0ada8a7f6e916eb2b05ae5571e375e522d0a2e
    Author: Matthias-Christian Ott <ott@enolink.de>
    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:
    Mstd.c | 40+++++++++++++++++++++++++++++++---------

    1 file changed, 31 insertions(+), 9 deletions(-)
    diff --git a/std.c b/std.c
    @@ -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);
    @@ -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];
    @@ -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) {
    @@ -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);
    @@ -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;
    @@ -106,7 +124,7 @@ parseesc(void) {
     				}
     				break;
     			}
    -			c = getc(fptm);
    +			c = getch();
     		}
     		switch(c) {
     		case '@':
    @@ -180,7 +198,7 @@ parseesc(void) {
     		break;
     	default:
     		putchar('\033');
    -		ungetc(c, fptm);
    +		ungetch(c);
     	}
     }

    @@ -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]))
    @@ -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();