xref: /csrg-svn/usr.bin/window/ttoutput.c (revision 33514)
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