xref: /csrg-svn/usr.bin/window/main.c (revision 14169)
113920Sedward #ifndef lint
2*14169Sedward static	char *sccsid = "@(#)main.c	1.8 83/07/28";
313920Sedward #endif
413920Sedward 
513969Sedward #include "defs.h"
613920Sedward 
7*14169Sedward char escapec = CTRL(l);
8*14169Sedward 
9*14169Sedward #define next(a) (**(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
10*14169Sedward 
11*14169Sedward /*ARGUSED*/
12*14169Sedward main(argc, argv)
13*14169Sedward char **argv;
1413920Sedward {
1513920Sedward 	register n;
1613920Sedward 	register char *p;
1713920Sedward 	int wwchild();
1813920Sedward 	int imask;
1913920Sedward 
20*14169Sedward 	while (*++argv) {
21*14169Sedward 		if (**argv == '-') {
22*14169Sedward 			switch (*++*argv) {
23*14169Sedward 			case 'e':
24*14169Sedward 				setescape(next(argv));
25*14169Sedward 				break;
26*14169Sedward 			case 't':
27*14169Sedward 				terse++;
28*14169Sedward 				break;
29*14169Sedward 			default:
30*14169Sedward 				usage();
31*14169Sedward 			}
32*14169Sedward 		} else
33*14169Sedward 			usage();
34*14169Sedward 	}
3513969Sedward 	gettimeofday(&starttime, &timezone);
3613962Sedward 	if (wwinit() < 0) {
3713962Sedward 		fflush(stdout);
3813962Sedward 		fprintf("Can't do windows on this terminal.\n");
3913962Sedward 		exit(1);
4013962Sedward 	}
4114065Sedward 	if ((cmdwin = wwopen(WW_NONE, 0, 1, wwncol, 0, 0)) == 0) {
4213962Sedward 		fflush(stdout);
4313969Sedward 		fprintf(stderr, "Can't open command window.\r\n");
4413962Sedward 		goto bad;
4513962Sedward 	}
46*14169Sedward 	if (terse)
47*14169Sedward 		Whide(cmdwin->ww_win);
4814024Sedward 	wwsetcurwin(cmdwin);
4914065Sedward 	for (n = 0; n < wwncol; n++)			/* XXX */
5013969Sedward 		Waputc(0, WINVERSE|WBUF, cmdwin->ww_win);
5113969Sedward 	wwflush();
5213920Sedward 	(void) signal(SIGCHLD, wwchild);
5314024Sedward 	if (doconfig() < 0)
5414024Sedward 		dodefault();
5514024Sedward 	if (selwin != 0)
5614024Sedward 		wwsetcurwin(selwin);
5713969Sedward 	while (!quit) {
5813969Sedward 		if (curwin == cmdwin) {
5913969Sedward 			docmd();
6013962Sedward 			continue;
6113969Sedward 		}
6213994Sedward 		/*
6313994Sedward 		 * Loop until we get some keyboard input.
6413994Sedward 		 */
6513969Sedward 		while (ibufc == 0) {
6613969Sedward 			wwsetcursor(WCurRow(curwin->ww_win),
6713969Sedward 				WCurCol(curwin->ww_win));
6813969Sedward 			wwflush();
6913994Sedward 			imask = 1 << 0;
7013994Sedward 			while (wwforce(&imask) < 0)
7113994Sedward 				;
7213994Sedward 			if ((imask & 1 << 0) == 0)
7313962Sedward 				continue;
7413994Sedward 			/* NOTE: ibufc == 0 */
7513994Sedward 			ibufp = ibuf;
7614153Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
7713994Sedward 				ibufc = 0;
7814153Sedward 				nreade++;
7914153Sedward 			} else if (ibufc == 0)
8014153Sedward 				nreadz++;
8114153Sedward 			else
8214153Sedward 				nreadc += ibufc;
8314153Sedward 			nread++;
8413994Sedward 		}
8513994Sedward 		/*
8613994Sedward 		 * Weird loop.  Copy the buffer to the pty stopping
8713994Sedward 		 * on the escape character in a hopefully efficient
8813994Sedward 		 * way.
8913994Sedward 		 * Probably a good thing to make ibufc == 1 a special
9013994Sedward 		 * case.
9113994Sedward 		 */
9213994Sedward 		for (p = ibufp, n = ibufc;;) {
9313994Sedward 			if (--n < 0) {
9413994Sedward 				write(curwin->ww_pty, ibufp, ibufc);
9513969Sedward 				ibufp = ibuf;
9613994Sedward 				ibufc = 0;
9713994Sedward 				break;
98*14169Sedward 			} else if (*p++ == escapec) {
9913994Sedward 				if ((n = p - ibufp) > 1)
10013994Sedward 					write(curwin->ww_pty, ibufp, n - 1);
10113994Sedward 				ibufp = p;
10213994Sedward 				ibufc -= n;
10314024Sedward 				wwsetcurwin(cmdwin);
10413994Sedward 				break;
10513994Sedward 			}
10613920Sedward 		}
10713920Sedward 	}
10813920Sedward bad:
10913920Sedward 	wwend();
11013920Sedward 	return 0;
11113920Sedward }
112*14169Sedward 
113*14169Sedward usage()
114*14169Sedward {
115*14169Sedward 	fprintf(stderr, "window: [-e escape] [-t]\n");
116*14169Sedward 	exit(1);
117*14169Sedward }
118