Annotation of src/usr.bin/window/ttoutput.c, Revision 1.5
1.5 ! millert 1: /* $OpenBSD: ttoutput.c,v 1.4 2001/11/19 19:02:18 mpech Exp $ */
1.1 deraadt 2: /* $NetBSD: ttoutput.c,v 1.3 1995/09/28 10:34:51 tls Exp $ */
3:
4: /*
5: * Copyright (c) 1983, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * This code is derived from software contributed to Berkeley by
9: * Edward Wang at The University of California, Berkeley.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
1.5 ! millert 19: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: */
35:
36: #ifndef lint
37: #if 0
38: static char sccsid[] = "@(#)ttoutput.c 8.1 (Berkeley) 6/6/93";
39: #else
1.5 ! millert 40: static char rcsid[] = "$OpenBSD: ttoutput.c,v 1.4 2001/11/19 19:02:18 mpech Exp $";
1.1 deraadt 41: #endif
42: #endif /* not lint */
43:
44: #include "ww.h"
45: #include "tt.h"
46: #include <sys/errno.h>
47:
48: /*
49: * Buffered output package.
50: * We need this because stdio fails on non-blocking writes.
51: */
52:
53: ttflush()
54: {
1.4 mpech 55: char *p;
56: int n = tt_obp - tt_ob;
1.1 deraadt 57: extern errno;
58:
59: if (n == 0)
60: return;
61: if (tt.tt_checksum)
62: (*tt.tt_checksum)(tt_ob, n);
63: if (tt.tt_flush) {
64: (*tt.tt_flush)();
65: return;
66: }
67: wwnflush++;
68: for (p = tt_ob; p < tt_obp;) {
69: wwnwr++;
70: n = write(1, p, tt_obp - p);
71: if (n < 0) {
72: wwnwre++;
73: if (errno != EWOULDBLOCK) {
74: /* can't deal with this */
75: p = tt_obp;
76: }
77: } else if (n == 0) {
78: /* what to do? */
79: wwnwrz++;
80: } else {
81: wwnwrc += n;
82: p += n;
83: }
84: }
85: tt_obp = tt_ob;
86: }
87:
88: ttputs(s)
1.4 mpech 89: char *s;
1.1 deraadt 90: {
91: while (*s)
92: ttputc(*s++);
93: }
94:
95: ttwrite(s, n)
1.4 mpech 96: char *s;
97: int n;
1.1 deraadt 98: {
99: switch (n) {
100: case 0:
101: break;
102: case 1:
103: ttputc(*s);
104: break;
105: case 2:
106: if (tt_obe - tt_obp < 2)
107: ttflush();
108: *tt_obp++ = *s++;
109: *tt_obp++ = *s;
110: break;
111: case 3:
112: if (tt_obe - tt_obp < 3)
113: ttflush();
114: *tt_obp++ = *s++;
115: *tt_obp++ = *s++;
116: *tt_obp++ = *s;
117: break;
118: case 4:
119: if (tt_obe - tt_obp < 4)
120: ttflush();
121: *tt_obp++ = *s++;
122: *tt_obp++ = *s++;
123: *tt_obp++ = *s++;
124: *tt_obp++ = *s;
125: break;
126: case 5:
127: if (tt_obe - tt_obp < 5)
128: ttflush();
129: *tt_obp++ = *s++;
130: *tt_obp++ = *s++;
131: *tt_obp++ = *s++;
132: *tt_obp++ = *s++;
133: *tt_obp++ = *s;
134: break;
135: default:
136: while (n > 0) {
1.4 mpech 137: int m;
1.1 deraadt 138:
139: while ((m = tt_obe - tt_obp) == 0)
140: ttflush();
141: if ((m = tt_obe - tt_obp) > n)
142: m = n;
143: bcopy(s, tt_obp, m);
144: tt_obp += m;
145: s += m;
146: n -= m;
147: }
148: }
149: }