xref: /csrg-svn/usr.bin/window/main.c (revision 14294)
113920Sedward #ifndef lint
2*14294Sedward static	char *sccsid = "@(#)main.c	1.10 83/07/29";
313920Sedward #endif
413920Sedward 
513969Sedward #include "defs.h"
613920Sedward 
714286Sedward char escapec = CTRL(p);
814169Sedward 
914286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
1014169Sedward 
1114169Sedward /*ARGUSED*/
1214169Sedward main(argc, argv)
1314169Sedward char **argv;
1413920Sedward {
1513920Sedward 	register n;
1613920Sedward 	register char *p;
1714286Sedward 	char fast = 0;
1813920Sedward 	int wwchild();
1913920Sedward 	int imask;
2014286Sedward 	char *rindex();
2114286Sedward 	char *getenv();
2213920Sedward 
2314286Sedward 	if (p = rindex(*argv, '/'))
2414286Sedward 		p++;
2514286Sedward 	else
2614286Sedward 		p = *argv;
2714286Sedward 	debug = strcmp(p, "a.out") == 0;
2814169Sedward 	while (*++argv) {
2914169Sedward 		if (**argv == '-') {
3014169Sedward 			switch (*++*argv) {
3114286Sedward 			case 'f':
3214286Sedward 				fast++;
3314286Sedward 				break;
3414169Sedward 			case 'e':
3514169Sedward 				setescape(next(argv));
3614169Sedward 				break;
3714169Sedward 			case 't':
3814169Sedward 				terse++;
3914169Sedward 				break;
4014286Sedward 			case 'd':
4114286Sedward 				debug++;
4214286Sedward 				break;
4314169Sedward 			default:
4414169Sedward 				usage();
4514169Sedward 			}
4614169Sedward 		} else
4714169Sedward 			usage();
4814169Sedward 	}
4914286Sedward 	if ((shell = getenv("SHELL")) == 0)
5014286Sedward 		shell = "/bin/csh";
5114286Sedward 	if (shellname = rindex(shell, '/'))
5214286Sedward 		shellname++;
5314286Sedward 	else
5414286Sedward 		shellname = shell;
5513969Sedward 	gettimeofday(&starttime, &timezone);
5613962Sedward 	if (wwinit() < 0) {
5713962Sedward 		fflush(stdout);
5813962Sedward 		fprintf("Can't do windows on this terminal.\n");
5913962Sedward 		exit(1);
6013962Sedward 	}
6114286Sedward 	if (debug) {
6214286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
6314286Sedward 		wwsettty(0, &wwnewtty);
6414286Sedward 	}
6514065Sedward 	if ((cmdwin = wwopen(WW_NONE, 0, 1, wwncol, 0, 0)) == 0) {
6613962Sedward 		fflush(stdout);
6713969Sedward 		fprintf(stderr, "Can't open command window.\r\n");
6813962Sedward 		goto bad;
6913962Sedward 	}
7014169Sedward 	if (terse)
7114169Sedward 		Whide(cmdwin->ww_win);
7214024Sedward 	wwsetcurwin(cmdwin);
7314065Sedward 	for (n = 0; n < wwncol; n++)			/* XXX */
7413969Sedward 		Waputc(0, WINVERSE|WBUF, cmdwin->ww_win);
7513969Sedward 	wwflush();
7613920Sedward 	(void) signal(SIGCHLD, wwchild);
7714286Sedward 	if (!fast) {
7814286Sedward 		if (doconfig() < 0)
7914286Sedward 			dodefault();
80*14294Sedward 		if (selwin != 0) {
8114286Sedward 			wwsetcurwin(selwin);
82*14294Sedward 			Woncursor(selwin->ww_win, 0);
83*14294Sedward 		}
8414286Sedward 	}
8513969Sedward 	while (!quit) {
8613969Sedward 		if (curwin == cmdwin) {
8713969Sedward 			docmd();
8813962Sedward 			continue;
8913969Sedward 		}
9013994Sedward 		/*
9113994Sedward 		 * Loop until we get some keyboard input.
9213994Sedward 		 */
9313969Sedward 		while (ibufc == 0) {
9413969Sedward 			wwsetcursor(WCurRow(curwin->ww_win),
9513969Sedward 				WCurCol(curwin->ww_win));
9613969Sedward 			wwflush();
9713994Sedward 			imask = 1 << 0;
9813994Sedward 			while (wwforce(&imask) < 0)
9913994Sedward 				;
10013994Sedward 			if ((imask & 1 << 0) == 0)
10113962Sedward 				continue;
10213994Sedward 			/* NOTE: ibufc == 0 */
10313994Sedward 			ibufp = ibuf;
10414153Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
10513994Sedward 				ibufc = 0;
10614153Sedward 				nreade++;
10714153Sedward 			} else if (ibufc == 0)
10814153Sedward 				nreadz++;
10914153Sedward 			else
11014153Sedward 				nreadc += ibufc;
11114153Sedward 			nread++;
11213994Sedward 		}
11313994Sedward 		/*
11413994Sedward 		 * Weird loop.  Copy the buffer to the pty stopping
11513994Sedward 		 * on the escape character in a hopefully efficient
11613994Sedward 		 * way.
11713994Sedward 		 * Probably a good thing to make ibufc == 1 a special
11813994Sedward 		 * case.
11913994Sedward 		 */
12013994Sedward 		for (p = ibufp, n = ibufc;;) {
12113994Sedward 			if (--n < 0) {
12213994Sedward 				write(curwin->ww_pty, ibufp, ibufc);
12313969Sedward 				ibufp = ibuf;
12413994Sedward 				ibufc = 0;
12513994Sedward 				break;
12614169Sedward 			} else if (*p++ == escapec) {
12713994Sedward 				if ((n = p - ibufp) > 1)
12813994Sedward 					write(curwin->ww_pty, ibufp, n - 1);
12913994Sedward 				ibufp = p;
13013994Sedward 				ibufc -= n;
13114024Sedward 				wwsetcurwin(cmdwin);
13213994Sedward 				break;
13313994Sedward 			}
13413920Sedward 		}
13513920Sedward 	}
13613920Sedward bad:
13713920Sedward 	wwend();
13813920Sedward 	return 0;
13913920Sedward }
14014169Sedward 
14114169Sedward usage()
14214169Sedward {
14314169Sedward 	fprintf(stderr, "window: [-e escape] [-t]\n");
14414169Sedward 	exit(1);
14514169Sedward }
146