xref: /csrg-svn/usr.bin/window/ttoutput.c (revision 42835)
118756Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
5*42835Sbostic  * %sccs.include.redist.c%
618756Sedward  */
718756Sedward 
833514Sbostic #ifndef lint
9*42835Sbostic static char sccsid[] = "@(#)ttoutput.c	3.8 (Berkeley) 06/02/90";
1033514Sbostic #endif /* not lint */
1133514Sbostic 
1216125Sedward #include "ww.h"
1316125Sedward #include "tt.h"
1416125Sedward #include <sys/errno.h>
1516125Sedward 
1616125Sedward /*
1716125Sedward  * Buffered output package.
1816125Sedward  * We need this because stdio fails on non-blocking writes.
1916125Sedward  */
2016125Sedward 
2116125Sedward ttflush()
2216125Sedward {
2316125Sedward 	register char *p;
2416125Sedward 	register n;
2516125Sedward 	extern errno;
2616125Sedward 
2716125Sedward 	wwnflush++;
2816125Sedward 	for (p = tt_ob; p < tt_obp;) {
2916125Sedward 		wwnwr++;
3016125Sedward 		n = write(1, p, tt_obp - p);
3116125Sedward 		if (n < 0) {
3216125Sedward 			wwnwre++;
3316125Sedward 			if (errno != EWOULDBLOCK) {
3416125Sedward 				/* can't deal with this */
3516125Sedward 				p = tt_obp;
3616125Sedward 			}
3716125Sedward 		} else if (n == 0) {
3816125Sedward 			/* what to do? */
3916125Sedward 			wwnwrz++;
4016125Sedward 		} else {
4116125Sedward 			wwnwrc += n;
4216125Sedward 			p += n;
4316125Sedward 		}
4416125Sedward 	}
4516125Sedward 	tt_obp = tt_ob;
4616125Sedward }
4716125Sedward 
4816125Sedward ttputs(s)
4916125Sedward register char *s;
5016125Sedward {
5116125Sedward 	while (*s)
5216125Sedward 		ttputc(*s++);
5316125Sedward }
5424959Sedward 
5524959Sedward ttwrite(s, n)
5624959Sedward 	register char *s;
5724959Sedward 	register n;
5824959Sedward {
5924959Sedward 	switch (n) {
6024959Sedward 	case 0:
6124959Sedward 		break;
6224959Sedward 	case 1:
6324959Sedward 		ttputc(*s);
6424959Sedward 		break;
6524959Sedward 	case 2:
6624959Sedward 		if (tt_obe - tt_obp < 2)
6739159Sedward 			(*tt.tt_flush)();
6824959Sedward 		*tt_obp++ = *s++;
6924959Sedward 		*tt_obp++ = *s;
7024959Sedward 		break;
7124959Sedward 	case 3:
7224959Sedward 		if (tt_obe - tt_obp < 3)
7339159Sedward 			(*tt.tt_flush)();
7424959Sedward 		*tt_obp++ = *s++;
7524959Sedward 		*tt_obp++ = *s++;
7624959Sedward 		*tt_obp++ = *s;
7724959Sedward 		break;
7824959Sedward 	case 4:
7924959Sedward 		if (tt_obe - tt_obp < 4)
8039159Sedward 			(*tt.tt_flush)();
8124959Sedward 		*tt_obp++ = *s++;
8224959Sedward 		*tt_obp++ = *s++;
8324959Sedward 		*tt_obp++ = *s++;
8424959Sedward 		*tt_obp++ = *s;
8524959Sedward 		break;
8624959Sedward 	case 5:
8724959Sedward 		if (tt_obe - tt_obp < 5)
8839159Sedward 			(*tt.tt_flush)();
8924959Sedward 		*tt_obp++ = *s++;
9024959Sedward 		*tt_obp++ = *s++;
9124959Sedward 		*tt_obp++ = *s++;
9224959Sedward 		*tt_obp++ = *s++;
9324959Sedward 		*tt_obp++ = *s;
9424959Sedward 		break;
9524959Sedward 	default:
9624959Sedward 		while (n > 0) {
9724959Sedward 			register m;
9824959Sedward 
9924959Sedward 			while ((m = tt_obe - tt_obp) == 0)
10039159Sedward 				(*tt.tt_flush)();
10124959Sedward 			if ((m = tt_obe - tt_obp) > n)
10224959Sedward 				m = n;
10324959Sedward 			bcopy(s, tt_obp, m);
10424959Sedward 			tt_obp += m;
10524959Sedward 			s += m;
10624959Sedward 			n -= m;
10724959Sedward 		}
10824959Sedward 	}
10924959Sedward }
110