118756Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * 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*56710Sedward static char sccsid[] = "@(#)ttoutput.c 3.10 (Berkeley) 11/10/92"; 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 2416125Sedward ttflush() 2516125Sedward { 2616125Sedward register char *p; 27*56710Sedward register n = tt_obp - tt_ob; 2816125Sedward extern errno; 2916125Sedward 30*56710Sedward if (n == 0) 31*56710Sedward return; 32*56710Sedward if (tt.tt_checksum) 33*56710Sedward (*tt.tt_checksum)(tt_ob, n); 34*56710Sedward if (tt.tt_flush) { 35*56710Sedward (*tt.tt_flush)(); 36*56710Sedward return; 37*56710Sedward } 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 5916125Sedward ttputs(s) 6016125Sedward register char *s; 6116125Sedward { 6216125Sedward while (*s) 6316125Sedward ttputc(*s++); 6416125Sedward } 6524959Sedward 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) 78*56710Sedward ttflush(); 7924959Sedward *tt_obp++ = *s++; 8024959Sedward *tt_obp++ = *s; 8124959Sedward break; 8224959Sedward case 3: 8324959Sedward if (tt_obe - tt_obp < 3) 84*56710Sedward 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) 91*56710Sedward 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) 99*56710Sedward 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) 111*56710Sedward 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