xref: /csrg-svn/usr.bin/window/ttoutput.c (revision 42954)
118756Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
5*42954Sbostic  * This code is derived from software contributed to Berkeley by
6*42954Sbostic  * Edward Wang at The University of California, Berkeley.
7*42954Sbostic  *
842835Sbostic  * %sccs.include.redist.c%
918756Sedward  */
1018756Sedward 
1133514Sbostic #ifndef lint
12*42954Sbostic static char sccsid[] = "@(#)ttoutput.c	3.9 (Berkeley) 06/06/90";
1333514Sbostic #endif /* not lint */
1433514Sbostic 
1516125Sedward #include "ww.h"
1616125Sedward #include "tt.h"
1716125Sedward #include <sys/errno.h>
1816125Sedward 
1916125Sedward /*
2016125Sedward  * Buffered output package.
2116125Sedward  * We need this because stdio fails on non-blocking writes.
2216125Sedward  */
2316125Sedward 
2416125Sedward ttflush()
2516125Sedward {
2616125Sedward 	register char *p;
2716125Sedward 	register n;
2816125Sedward 	extern errno;
2916125Sedward 
3016125Sedward 	wwnflush++;
3116125Sedward 	for (p = tt_ob; p < tt_obp;) {
3216125Sedward 		wwnwr++;
3316125Sedward 		n = write(1, p, tt_obp - p);
3416125Sedward 		if (n < 0) {
3516125Sedward 			wwnwre++;
3616125Sedward 			if (errno != EWOULDBLOCK) {
3716125Sedward 				/* can't deal with this */
3816125Sedward 				p = tt_obp;
3916125Sedward 			}
4016125Sedward 		} else if (n == 0) {
4116125Sedward 			/* what to do? */
4216125Sedward 			wwnwrz++;
4316125Sedward 		} else {
4416125Sedward 			wwnwrc += n;
4516125Sedward 			p += n;
4616125Sedward 		}
4716125Sedward 	}
4816125Sedward 	tt_obp = tt_ob;
4916125Sedward }
5016125Sedward 
5116125Sedward ttputs(s)
5216125Sedward register char *s;
5316125Sedward {
5416125Sedward 	while (*s)
5516125Sedward 		ttputc(*s++);
5616125Sedward }
5724959Sedward 
5824959Sedward ttwrite(s, n)
5924959Sedward 	register char *s;
6024959Sedward 	register n;
6124959Sedward {
6224959Sedward 	switch (n) {
6324959Sedward 	case 0:
6424959Sedward 		break;
6524959Sedward 	case 1:
6624959Sedward 		ttputc(*s);
6724959Sedward 		break;
6824959Sedward 	case 2:
6924959Sedward 		if (tt_obe - tt_obp < 2)
7039159Sedward 			(*tt.tt_flush)();
7124959Sedward 		*tt_obp++ = *s++;
7224959Sedward 		*tt_obp++ = *s;
7324959Sedward 		break;
7424959Sedward 	case 3:
7524959Sedward 		if (tt_obe - tt_obp < 3)
7639159Sedward 			(*tt.tt_flush)();
7724959Sedward 		*tt_obp++ = *s++;
7824959Sedward 		*tt_obp++ = *s++;
7924959Sedward 		*tt_obp++ = *s;
8024959Sedward 		break;
8124959Sedward 	case 4:
8224959Sedward 		if (tt_obe - tt_obp < 4)
8339159Sedward 			(*tt.tt_flush)();
8424959Sedward 		*tt_obp++ = *s++;
8524959Sedward 		*tt_obp++ = *s++;
8624959Sedward 		*tt_obp++ = *s++;
8724959Sedward 		*tt_obp++ = *s;
8824959Sedward 		break;
8924959Sedward 	case 5:
9024959Sedward 		if (tt_obe - tt_obp < 5)
9139159Sedward 			(*tt.tt_flush)();
9224959Sedward 		*tt_obp++ = *s++;
9324959Sedward 		*tt_obp++ = *s++;
9424959Sedward 		*tt_obp++ = *s++;
9524959Sedward 		*tt_obp++ = *s++;
9624959Sedward 		*tt_obp++ = *s;
9724959Sedward 		break;
9824959Sedward 	default:
9924959Sedward 		while (n > 0) {
10024959Sedward 			register m;
10124959Sedward 
10224959Sedward 			while ((m = tt_obe - tt_obp) == 0)
10339159Sedward 				(*tt.tt_flush)();
10424959Sedward 			if ((m = tt_obe - tt_obp) > n)
10524959Sedward 				m = n;
10624959Sedward 			bcopy(s, tt_obp, m);
10724959Sedward 			tt_obp += m;
10824959Sedward 			s += m;
10924959Sedward 			n -= m;
11024959Sedward 		}
11124959Sedward 	}
11224959Sedward }
113