|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)ttoutput.c 3.6 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "ww.h"
23: #include "tt.h"
24: #include <sys/errno.h>
25:
26: /*
27: * Buffered output package.
28: * We need this because stdio fails on non-blocking writes.
29: */
30:
31: ttflush()
32: {
33: register char *p;
34: register n;
35: extern errno;
36:
37: wwnflush++;
38: for (p = tt_ob; p < tt_obp;) {
39: wwnwr++;
40: n = write(1, p, tt_obp - p);
41: if (n < 0) {
42: wwnwre++;
43: if (errno != EWOULDBLOCK) {
44: /* can't deal with this */
45: p = tt_obp;
46: }
47: } else if (n == 0) {
48: /* what to do? */
49: wwnwrz++;
50: } else {
51: wwnwrc += n;
52: p += n;
53: }
54: }
55: tt_obp = tt_ob;
56: }
57:
58: ttputs(s)
59: register char *s;
60: {
61: while (*s)
62: ttputc(*s++);
63: }
64:
65: ttwrite(s, n)
66: register char *s;
67: register n;
68: {
69: switch (n) {
70: case 0:
71: break;
72: case 1:
73: ttputc(*s);
74: break;
75: case 2:
76: if (tt_obe - tt_obp < 2)
77: ttflush();
78: *tt_obp++ = *s++;
79: *tt_obp++ = *s;
80: break;
81: case 3:
82: if (tt_obe - tt_obp < 3)
83: ttflush();
84: *tt_obp++ = *s++;
85: *tt_obp++ = *s++;
86: *tt_obp++ = *s;
87: break;
88: case 4:
89: if (tt_obe - tt_obp < 4)
90: ttflush();
91: *tt_obp++ = *s++;
92: *tt_obp++ = *s++;
93: *tt_obp++ = *s++;
94: *tt_obp++ = *s;
95: break;
96: case 5:
97: if (tt_obe - tt_obp < 5)
98: ttflush();
99: *tt_obp++ = *s++;
100: *tt_obp++ = *s++;
101: *tt_obp++ = *s++;
102: *tt_obp++ = *s++;
103: *tt_obp++ = *s;
104: break;
105: default:
106: while (n > 0) {
107: register m;
108:
109: while ((m = tt_obe - tt_obp) == 0)
110: ttflush();
111: if ((m = tt_obe - tt_obp) > n)
112: m = n;
113: bcopy(s, tt_obp, m);
114: tt_obp += m;
115: s += m;
116: n -= m;
117: }
118: }
119: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.