118756Sedward /* 2*33514Sbostic * Copyright (c) 1983 Regents of the University of California. 3*33514Sbostic * All rights reserved. 4*33514Sbostic * 5*33514Sbostic * Redistribution and use in source and binary forms are permitted 6*33514Sbostic * provided that this notice is preserved and that due credit is given 7*33514Sbostic * to the University of California at Berkeley. The name of the University 8*33514Sbostic * may not be used to endorse or promote products derived from this 9*33514Sbostic * software without specific prior written permission. This software 10*33514Sbostic * is provided ``as is'' without express or implied warranty. 1118756Sedward */ 1218756Sedward 13*33514Sbostic #ifndef lint 14*33514Sbostic static char sccsid[] = "@(#)ttoutput.c 3.5 (Berkeley) 02/21/88"; 15*33514Sbostic #endif /* not lint */ 16*33514Sbostic 1716125Sedward #include "ww.h" 1816125Sedward #include "tt.h" 1916125Sedward #include <sys/errno.h> 2016125Sedward 2116125Sedward /* 2216125Sedward * Buffered output package. 2316125Sedward * We need this because stdio fails on non-blocking writes. 2416125Sedward */ 2516125Sedward 2616125Sedward ttflush() 2716125Sedward { 2816125Sedward register char *p; 2916125Sedward register n; 3016125Sedward extern errno; 3116125Sedward 3216125Sedward wwnflush++; 3316125Sedward for (p = tt_ob; p < tt_obp;) { 3416125Sedward wwnwr++; 3516125Sedward n = write(1, p, tt_obp - p); 3616125Sedward if (n < 0) { 3716125Sedward wwnwre++; 3816125Sedward if (errno != EWOULDBLOCK) { 3916125Sedward /* can't deal with this */ 4016125Sedward p = tt_obp; 4116125Sedward } 4216125Sedward } else if (n == 0) { 4316125Sedward /* what to do? */ 4416125Sedward wwnwrz++; 4516125Sedward } else { 4616125Sedward wwnwrc += n; 4716125Sedward p += n; 4816125Sedward } 4916125Sedward } 5016125Sedward tt_obp = tt_ob; 5116125Sedward } 5216125Sedward 5316125Sedward ttputs(s) 5416125Sedward register char *s; 5516125Sedward { 5616125Sedward while (*s) 5716125Sedward ttputc(*s++); 5816125Sedward } 5924959Sedward 6024959Sedward ttwrite(s, n) 6124959Sedward register char *s; 6224959Sedward register n; 6324959Sedward { 6424959Sedward switch (n) { 6524959Sedward case 0: 6624959Sedward break; 6724959Sedward case 1: 6824959Sedward ttputc(*s); 6924959Sedward break; 7024959Sedward case 2: 7124959Sedward if (tt_obe - tt_obp < 2) 7224959Sedward ttflush(); 7324959Sedward *tt_obp++ = *s++; 7424959Sedward *tt_obp++ = *s; 7524959Sedward break; 7624959Sedward case 3: 7724959Sedward if (tt_obe - tt_obp < 3) 7824959Sedward ttflush(); 7924959Sedward *tt_obp++ = *s++; 8024959Sedward *tt_obp++ = *s++; 8124959Sedward *tt_obp++ = *s; 8224959Sedward break; 8324959Sedward case 4: 8424959Sedward if (tt_obe - tt_obp < 4) 8524959Sedward ttflush(); 8624959Sedward *tt_obp++ = *s++; 8724959Sedward *tt_obp++ = *s++; 8824959Sedward *tt_obp++ = *s++; 8924959Sedward *tt_obp++ = *s; 9024959Sedward break; 9124959Sedward case 5: 9224959Sedward if (tt_obe - tt_obp < 5) 9324959Sedward ttflush(); 9424959Sedward *tt_obp++ = *s++; 9524959Sedward *tt_obp++ = *s++; 9624959Sedward *tt_obp++ = *s++; 9724959Sedward *tt_obp++ = *s++; 9824959Sedward *tt_obp++ = *s; 9924959Sedward break; 10024959Sedward default: 10124959Sedward while (n > 0) { 10224959Sedward register m; 10324959Sedward 10424959Sedward while ((m = tt_obe - tt_obp) == 0) 10524959Sedward ttflush(); 10624959Sedward if ((m = tt_obe - tt_obp) > n) 10724959Sedward m = n; 10824959Sedward bcopy(s, tt_obp, m); 10924959Sedward tt_obp += m; 11024959Sedward s += m; 11124959Sedward n -= m; 11224959Sedward } 11324959Sedward } 11424959Sedward } 115