xref: /csrg-svn/usr.bin/window/ttoutput.c (revision 62465)
118756Sedward /*
2*62465Sbostic  * Copyright (c) 1983, 1993
3*62465Sbostic  *	The Regents of the University of California.  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*62465Sbostic static char sccsid[] = "@(#)ttoutput.c	8.1 (Berkeley) 06/06/93";
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 
ttflush()2416125Sedward ttflush()
2516125Sedward {
2616125Sedward 	register char *p;
2756710Sedward 	register n = tt_obp - tt_ob;
2816125Sedward 	extern errno;
2916125Sedward 
3056710Sedward 	if (n == 0)
3156710Sedward 		return;
3256710Sedward 	if (tt.tt_checksum)
3356710Sedward 		(*tt.tt_checksum)(tt_ob, n);
3456710Sedward 	if (tt.tt_flush) {
3556710Sedward 		(*tt.tt_flush)();
3656710Sedward 		return;
3756710Sedward 	}
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 
ttputs(s)5916125Sedward ttputs(s)
6016125Sedward register char *s;
6116125Sedward {
6216125Sedward 	while (*s)
6316125Sedward 		ttputc(*s++);
6416125Sedward }
6524959Sedward 
ttwrite(s,n)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)
7856710Sedward 			ttflush();
7924959Sedward 		*tt_obp++ = *s++;
8024959Sedward 		*tt_obp++ = *s;
8124959Sedward 		break;
8224959Sedward 	case 3:
8324959Sedward 		if (tt_obe - tt_obp < 3)
8456710Sedward 			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)
9156710Sedward 			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)
9956710Sedward 			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)
11156710Sedward 				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