118756Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42954Sbostic * This code is derived from software contributed to Berkeley by 6*42954Sbostic * Edward Wang at The University of California, Berkeley. 7*42954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918756Sedward */ 1018756Sedward 1133514Sbostic #ifndef lint 12*42954Sbostic static char sccsid[] = "@(#)ttoutput.c 3.9 (Berkeley) 06/06/90"; 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; 2716125Sedward register n; 2816125Sedward extern errno; 2916125Sedward 3016125Sedward wwnflush++; 3116125Sedward for (p = tt_ob; p < tt_obp;) { 3216125Sedward wwnwr++; 3316125Sedward n = write(1, p, tt_obp - p); 3416125Sedward if (n < 0) { 3516125Sedward wwnwre++; 3616125Sedward if (errno != EWOULDBLOCK) { 3716125Sedward /* can't deal with this */ 3816125Sedward p = tt_obp; 3916125Sedward } 4016125Sedward } else if (n == 0) { 4116125Sedward /* what to do? */ 4216125Sedward wwnwrz++; 4316125Sedward } else { 4416125Sedward wwnwrc += n; 4516125Sedward p += n; 4616125Sedward } 4716125Sedward } 4816125Sedward tt_obp = tt_ob; 4916125Sedward } 5016125Sedward 5116125Sedward ttputs(s) 5216125Sedward register char *s; 5316125Sedward { 5416125Sedward while (*s) 5516125Sedward ttputc(*s++); 5616125Sedward } 5724959Sedward 5824959Sedward ttwrite(s, n) 5924959Sedward register char *s; 6024959Sedward register n; 6124959Sedward { 6224959Sedward switch (n) { 6324959Sedward case 0: 6424959Sedward break; 6524959Sedward case 1: 6624959Sedward ttputc(*s); 6724959Sedward break; 6824959Sedward case 2: 6924959Sedward if (tt_obe - tt_obp < 2) 7039159Sedward (*tt.tt_flush)(); 7124959Sedward *tt_obp++ = *s++; 7224959Sedward *tt_obp++ = *s; 7324959Sedward break; 7424959Sedward case 3: 7524959Sedward if (tt_obe - tt_obp < 3) 7639159Sedward (*tt.tt_flush)(); 7724959Sedward *tt_obp++ = *s++; 7824959Sedward *tt_obp++ = *s++; 7924959Sedward *tt_obp++ = *s; 8024959Sedward break; 8124959Sedward case 4: 8224959Sedward if (tt_obe - tt_obp < 4) 8339159Sedward (*tt.tt_flush)(); 8424959Sedward *tt_obp++ = *s++; 8524959Sedward *tt_obp++ = *s++; 8624959Sedward *tt_obp++ = *s++; 8724959Sedward *tt_obp++ = *s; 8824959Sedward break; 8924959Sedward case 5: 9024959Sedward if (tt_obe - tt_obp < 5) 9139159Sedward (*tt.tt_flush)(); 9224959Sedward *tt_obp++ = *s++; 9324959Sedward *tt_obp++ = *s++; 9424959Sedward *tt_obp++ = *s++; 9524959Sedward *tt_obp++ = *s++; 9624959Sedward *tt_obp++ = *s; 9724959Sedward break; 9824959Sedward default: 9924959Sedward while (n > 0) { 10024959Sedward register m; 10124959Sedward 10224959Sedward while ((m = tt_obe - tt_obp) == 0) 10339159Sedward (*tt.tt_flush)(); 10424959Sedward if ((m = tt_obe - tt_obp) > n) 10524959Sedward m = n; 10624959Sedward bcopy(s, tt_obp, m); 10724959Sedward tt_obp += m; 10824959Sedward s += m; 10924959Sedward n -= m; 11024959Sedward } 11124959Sedward } 11224959Sedward } 113