118756Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42835Sbostic * %sccs.include.redist.c% 618756Sedward */ 718756Sedward 833514Sbostic #ifndef lint 9*42835Sbostic static char sccsid[] = "@(#)ttoutput.c 3.8 (Berkeley) 06/02/90"; 1033514Sbostic #endif /* not lint */ 1133514Sbostic 1216125Sedward #include "ww.h" 1316125Sedward #include "tt.h" 1416125Sedward #include <sys/errno.h> 1516125Sedward 1616125Sedward /* 1716125Sedward * Buffered output package. 1816125Sedward * We need this because stdio fails on non-blocking writes. 1916125Sedward */ 2016125Sedward 2116125Sedward ttflush() 2216125Sedward { 2316125Sedward register char *p; 2416125Sedward register n; 2516125Sedward extern errno; 2616125Sedward 2716125Sedward wwnflush++; 2816125Sedward for (p = tt_ob; p < tt_obp;) { 2916125Sedward wwnwr++; 3016125Sedward n = write(1, p, tt_obp - p); 3116125Sedward if (n < 0) { 3216125Sedward wwnwre++; 3316125Sedward if (errno != EWOULDBLOCK) { 3416125Sedward /* can't deal with this */ 3516125Sedward p = tt_obp; 3616125Sedward } 3716125Sedward } else if (n == 0) { 3816125Sedward /* what to do? */ 3916125Sedward wwnwrz++; 4016125Sedward } else { 4116125Sedward wwnwrc += n; 4216125Sedward p += n; 4316125Sedward } 4416125Sedward } 4516125Sedward tt_obp = tt_ob; 4616125Sedward } 4716125Sedward 4816125Sedward ttputs(s) 4916125Sedward register char *s; 5016125Sedward { 5116125Sedward while (*s) 5216125Sedward ttputc(*s++); 5316125Sedward } 5424959Sedward 5524959Sedward ttwrite(s, n) 5624959Sedward register char *s; 5724959Sedward register n; 5824959Sedward { 5924959Sedward switch (n) { 6024959Sedward case 0: 6124959Sedward break; 6224959Sedward case 1: 6324959Sedward ttputc(*s); 6424959Sedward break; 6524959Sedward case 2: 6624959Sedward if (tt_obe - tt_obp < 2) 6739159Sedward (*tt.tt_flush)(); 6824959Sedward *tt_obp++ = *s++; 6924959Sedward *tt_obp++ = *s; 7024959Sedward break; 7124959Sedward case 3: 7224959Sedward if (tt_obe - tt_obp < 3) 7339159Sedward (*tt.tt_flush)(); 7424959Sedward *tt_obp++ = *s++; 7524959Sedward *tt_obp++ = *s++; 7624959Sedward *tt_obp++ = *s; 7724959Sedward break; 7824959Sedward case 4: 7924959Sedward if (tt_obe - tt_obp < 4) 8039159Sedward (*tt.tt_flush)(); 8124959Sedward *tt_obp++ = *s++; 8224959Sedward *tt_obp++ = *s++; 8324959Sedward *tt_obp++ = *s++; 8424959Sedward *tt_obp++ = *s; 8524959Sedward break; 8624959Sedward case 5: 8724959Sedward if (tt_obe - tt_obp < 5) 8839159Sedward (*tt.tt_flush)(); 8924959Sedward *tt_obp++ = *s++; 9024959Sedward *tt_obp++ = *s++; 9124959Sedward *tt_obp++ = *s++; 9224959Sedward *tt_obp++ = *s++; 9324959Sedward *tt_obp++ = *s; 9424959Sedward break; 9524959Sedward default: 9624959Sedward while (n > 0) { 9724959Sedward register m; 9824959Sedward 9924959Sedward while ((m = tt_obe - tt_obp) == 0) 10039159Sedward (*tt.tt_flush)(); 10124959Sedward if ((m = tt_obe - tt_obp) > n) 10224959Sedward m = n; 10324959Sedward bcopy(s, tt_obp, m); 10424959Sedward tt_obp += m; 10524959Sedward s += m; 10624959Sedward n -= m; 10724959Sedward } 10824959Sedward } 10924959Sedward } 110