116125Sedward #ifndef lint 2*24959Sedward static char sccsid[] = "@(#)ttoutput.c 3.4 09/19/85"; 316125Sedward #endif 416125Sedward 518756Sedward /* 618756Sedward * Copyright (c) 1983 Regents of the University of California, 718756Sedward * All rights reserved. Redistribution permitted subject to 818756Sedward * the terms of the Berkeley Software License Agreement. 918756Sedward */ 1018756Sedward 1116125Sedward #include "ww.h" 1216125Sedward #include "tt.h" 1316125Sedward #include <sys/errno.h> 1416125Sedward 1516125Sedward /* 1616125Sedward * Buffered output package. 1716125Sedward * We need this because stdio fails on non-blocking writes. 1816125Sedward */ 1916125Sedward 2016125Sedward ttflush() 2116125Sedward { 2216125Sedward register char *p; 2316125Sedward register n; 2416125Sedward extern errno; 2516125Sedward 2616125Sedward wwnflush++; 2716125Sedward for (p = tt_ob; p < tt_obp;) { 2816125Sedward wwnwr++; 2916125Sedward n = write(1, p, tt_obp - p); 3016125Sedward if (n < 0) { 3116125Sedward wwnwre++; 3216125Sedward if (errno != EWOULDBLOCK) { 3316125Sedward /* can't deal with this */ 3416125Sedward p = tt_obp; 3516125Sedward } 3616125Sedward } else if (n == 0) { 3716125Sedward /* what to do? */ 3816125Sedward wwnwrz++; 3916125Sedward } else { 4016125Sedward wwnwrc += n; 4116125Sedward p += n; 4216125Sedward } 4316125Sedward } 4416125Sedward tt_obp = tt_ob; 4516125Sedward } 4616125Sedward 4716125Sedward ttputs(s) 4816125Sedward register char *s; 4916125Sedward { 5016125Sedward while (*s) 5116125Sedward ttputc(*s++); 5216125Sedward } 53*24959Sedward 54*24959Sedward ttwrite(s, n) 55*24959Sedward register char *s; 56*24959Sedward register n; 57*24959Sedward { 58*24959Sedward switch (n) { 59*24959Sedward case 0: 60*24959Sedward break; 61*24959Sedward case 1: 62*24959Sedward ttputc(*s); 63*24959Sedward break; 64*24959Sedward case 2: 65*24959Sedward if (tt_obe - tt_obp < 2) 66*24959Sedward ttflush(); 67*24959Sedward *tt_obp++ = *s++; 68*24959Sedward *tt_obp++ = *s; 69*24959Sedward break; 70*24959Sedward case 3: 71*24959Sedward if (tt_obe - tt_obp < 3) 72*24959Sedward ttflush(); 73*24959Sedward *tt_obp++ = *s++; 74*24959Sedward *tt_obp++ = *s++; 75*24959Sedward *tt_obp++ = *s; 76*24959Sedward break; 77*24959Sedward case 4: 78*24959Sedward if (tt_obe - tt_obp < 4) 79*24959Sedward ttflush(); 80*24959Sedward *tt_obp++ = *s++; 81*24959Sedward *tt_obp++ = *s++; 82*24959Sedward *tt_obp++ = *s++; 83*24959Sedward *tt_obp++ = *s; 84*24959Sedward break; 85*24959Sedward case 5: 86*24959Sedward if (tt_obe - tt_obp < 5) 87*24959Sedward ttflush(); 88*24959Sedward *tt_obp++ = *s++; 89*24959Sedward *tt_obp++ = *s++; 90*24959Sedward *tt_obp++ = *s++; 91*24959Sedward *tt_obp++ = *s++; 92*24959Sedward *tt_obp++ = *s; 93*24959Sedward break; 94*24959Sedward default: 95*24959Sedward while (n > 0) { 96*24959Sedward register m; 97*24959Sedward 98*24959Sedward while ((m = tt_obe - tt_obp) == 0) 99*24959Sedward ttflush(); 100*24959Sedward if ((m = tt_obe - tt_obp) > n) 101*24959Sedward m = n; 102*24959Sedward bcopy(s, tt_obp, m); 103*24959Sedward tt_obp += m; 104*24959Sedward s += m; 105*24959Sedward n -= m; 106*24959Sedward } 107*24959Sedward } 108*24959Sedward } 109