|
|
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.