xref: /csrg-svn/usr.bin/window/ttoutput.c (revision 56710)
118756Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
542954Sbostic  * This code is derived from software contributed to Berkeley by
642954Sbostic  * Edward Wang at The University of California, Berkeley.
742954Sbostic  *
842835Sbostic  * %sccs.include.redist.c%
918756Sedward  */
1018756Sedward 
1133514Sbostic #ifndef lint
12*56710Sedward static char sccsid[] = "@(#)ttoutput.c	3.10 (Berkeley) 11/10/92";
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;
27*56710Sedward 	register n = tt_obp - tt_ob;
2816125Sedward 	extern errno;
2916125Sedward 
30*56710Sedward 	if (n == 0)
31*56710Sedward 		return;
32*56710Sedward 	if (tt.tt_checksum)
33*56710Sedward 		(*tt.tt_checksum)(tt_ob, n);
34*56710Sedward 	if (tt.tt_flush) {
35*56710Sedward 		(*tt.tt_flush)();
36*56710Sedward 		return;
37*56710Sedward 	}
3816125Sedward 	wwnflush++;
3916125Sedward 	for (p = tt_ob; p < tt_obp;) {
4016125Sedward 		wwnwr++;
4116125Sedward 		n = write(1, p, tt_obp - p);
4216125Sedward 		if (n < 0) {
4316125Sedward 			wwnwre++;
4416125Sedward 			if (errno != EWOULDBLOCK) {
4516125Sedward 				/* can't deal with this */
4616125Sedward 				p = tt_obp;
4716125Sedward 			}
4816125Sedward 		} else if (n == 0) {
4916125Sedward 			/* what to do? */
5016125Sedward 			wwnwrz++;
5116125Sedward 		} else {
5216125Sedward 			wwnwrc += n;
5316125Sedward 			p += n;
5416125Sedward 		}
5516125Sedward 	}
5616125Sedward 	tt_obp = tt_ob;
5716125Sedward }
5816125Sedward 
5916125Sedward ttputs(s)
6016125Sedward register char *s;
6116125Sedward {
6216125Sedward 	while (*s)
6316125Sedward 		ttputc(*s++);
6416125Sedward }
6524959Sedward 
6624959Sedward ttwrite(s, n)
6724959Sedward 	register char *s;
6824959Sedward 	register n;
6924959Sedward {
7024959Sedward 	switch (n) {
7124959Sedward 	case 0:
7224959Sedward 		break;
7324959Sedward 	case 1:
7424959Sedward 		ttputc(*s);
7524959Sedward 		break;
7624959Sedward 	case 2:
7724959Sedward 		if (tt_obe - tt_obp < 2)
78*56710Sedward 			ttflush();
7924959Sedward 		*tt_obp++ = *s++;
8024959Sedward 		*tt_obp++ = *s;
8124959Sedward 		break;
8224959Sedward 	case 3:
8324959Sedward 		if (tt_obe - tt_obp < 3)
84*56710Sedward 			ttflush();
8524959Sedward 		*tt_obp++ = *s++;
8624959Sedward 		*tt_obp++ = *s++;
8724959Sedward 		*tt_obp++ = *s;
8824959Sedward 		break;
8924959Sedward 	case 4:
9024959Sedward 		if (tt_obe - tt_obp < 4)
91*56710Sedward 			ttflush();
9224959Sedward 		*tt_obp++ = *s++;
9324959Sedward 		*tt_obp++ = *s++;
9424959Sedward 		*tt_obp++ = *s++;
9524959Sedward 		*tt_obp++ = *s;
9624959Sedward 		break;
9724959Sedward 	case 5:
9824959Sedward 		if (tt_obe - tt_obp < 5)
99*56710Sedward 			ttflush();
10024959Sedward 		*tt_obp++ = *s++;
10124959Sedward 		*tt_obp++ = *s++;
10224959Sedward 		*tt_obp++ = *s++;
10324959Sedward 		*tt_obp++ = *s++;
10424959Sedward 		*tt_obp++ = *s;
10524959Sedward 		break;
10624959Sedward 	default:
10724959Sedward 		while (n > 0) {
10824959Sedward 			register m;
10924959Sedward 
11024959Sedward 			while ((m = tt_obe - tt_obp) == 0)
111*56710Sedward 				ttflush();
11224959Sedward 			if ((m = tt_obe - tt_obp) > n)
11324959Sedward 				m = n;
11424959Sedward 			bcopy(s, tt_obp, m);
11524959Sedward 			tt_obp += m;
11624959Sedward 			s += m;
11724959Sedward 			n -= m;
11824959Sedward 		}
11924959Sedward 	}
12024959Sedward }
121