xref: /csrg-svn/usr.bin/window/ttoutput.c (revision 24959)
116125Sedward #ifndef lint
2*24959Sedward static char sccsid[] = "@(#)ttoutput.c	3.4 09/19/85";
316125Sedward #endif
416125Sedward 
518756Sedward /*
618756Sedward  * Copyright (c) 1983 Regents of the University of California,
718756Sedward  * All rights reserved.  Redistribution permitted subject to
818756Sedward  * the terms of the Berkeley Software License Agreement.
918756Sedward  */
1018756Sedward 
1116125Sedward #include "ww.h"
1216125Sedward #include "tt.h"
1316125Sedward #include <sys/errno.h>
1416125Sedward 
1516125Sedward /*
1616125Sedward  * Buffered output package.
1716125Sedward  * We need this because stdio fails on non-blocking writes.
1816125Sedward  */
1916125Sedward 
2016125Sedward ttflush()
2116125Sedward {
2216125Sedward 	register char *p;
2316125Sedward 	register n;
2416125Sedward 	extern errno;
2516125Sedward 
2616125Sedward 	wwnflush++;
2716125Sedward 	for (p = tt_ob; p < tt_obp;) {
2816125Sedward 		wwnwr++;
2916125Sedward 		n = write(1, p, tt_obp - p);
3016125Sedward 		if (n < 0) {
3116125Sedward 			wwnwre++;
3216125Sedward 			if (errno != EWOULDBLOCK) {
3316125Sedward 				/* can't deal with this */
3416125Sedward 				p = tt_obp;
3516125Sedward 			}
3616125Sedward 		} else if (n == 0) {
3716125Sedward 			/* what to do? */
3816125Sedward 			wwnwrz++;
3916125Sedward 		} else {
4016125Sedward 			wwnwrc += n;
4116125Sedward 			p += n;
4216125Sedward 		}
4316125Sedward 	}
4416125Sedward 	tt_obp = tt_ob;
4516125Sedward }
4616125Sedward 
4716125Sedward ttputs(s)
4816125Sedward register char *s;
4916125Sedward {
5016125Sedward 	while (*s)
5116125Sedward 		ttputc(*s++);
5216125Sedward }
53*24959Sedward 
54*24959Sedward ttwrite(s, n)
55*24959Sedward 	register char *s;
56*24959Sedward 	register n;
57*24959Sedward {
58*24959Sedward 	switch (n) {
59*24959Sedward 	case 0:
60*24959Sedward 		break;
61*24959Sedward 	case 1:
62*24959Sedward 		ttputc(*s);
63*24959Sedward 		break;
64*24959Sedward 	case 2:
65*24959Sedward 		if (tt_obe - tt_obp < 2)
66*24959Sedward 			ttflush();
67*24959Sedward 		*tt_obp++ = *s++;
68*24959Sedward 		*tt_obp++ = *s;
69*24959Sedward 		break;
70*24959Sedward 	case 3:
71*24959Sedward 		if (tt_obe - tt_obp < 3)
72*24959Sedward 			ttflush();
73*24959Sedward 		*tt_obp++ = *s++;
74*24959Sedward 		*tt_obp++ = *s++;
75*24959Sedward 		*tt_obp++ = *s;
76*24959Sedward 		break;
77*24959Sedward 	case 4:
78*24959Sedward 		if (tt_obe - tt_obp < 4)
79*24959Sedward 			ttflush();
80*24959Sedward 		*tt_obp++ = *s++;
81*24959Sedward 		*tt_obp++ = *s++;
82*24959Sedward 		*tt_obp++ = *s++;
83*24959Sedward 		*tt_obp++ = *s;
84*24959Sedward 		break;
85*24959Sedward 	case 5:
86*24959Sedward 		if (tt_obe - tt_obp < 5)
87*24959Sedward 			ttflush();
88*24959Sedward 		*tt_obp++ = *s++;
89*24959Sedward 		*tt_obp++ = *s++;
90*24959Sedward 		*tt_obp++ = *s++;
91*24959Sedward 		*tt_obp++ = *s++;
92*24959Sedward 		*tt_obp++ = *s;
93*24959Sedward 		break;
94*24959Sedward 	default:
95*24959Sedward 		while (n > 0) {
96*24959Sedward 			register m;
97*24959Sedward 
98*24959Sedward 			while ((m = tt_obe - tt_obp) == 0)
99*24959Sedward 				ttflush();
100*24959Sedward 			if ((m = tt_obe - tt_obp) > n)
101*24959Sedward 				m = n;
102*24959Sedward 			bcopy(s, tt_obp, m);
103*24959Sedward 			tt_obp += m;
104*24959Sedward 			s += m;
105*24959Sedward 			n -= m;
106*24959Sedward 		}
107*24959Sedward 	}
108*24959Sedward }
109