xref: /csrg-svn/usr.bin/window/main.c (revision 14286)
113920Sedward #ifndef lint
2*14286Sedward static	char *sccsid = "@(#)main.c	1.9 83/07/29";
313920Sedward #endif
413920Sedward 
513969Sedward #include "defs.h"
613920Sedward 
7*14286Sedward char escapec = CTRL(p);
814169Sedward 
9*14286Sedward #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;
17*14286Sedward 	char fast = 0;
1813920Sedward 	int wwchild();
1913920Sedward 	int imask;
20*14286Sedward 	char *rindex();
21*14286Sedward 	char *getenv();
2213920Sedward 
23*14286Sedward 	if (p = rindex(*argv, '/'))
24*14286Sedward 		p++;
25*14286Sedward 	else
26*14286Sedward 		p = *argv;
27*14286Sedward 	debug = strcmp(p, "a.out") == 0;
2814169Sedward 	while (*++argv) {
2914169Sedward 		if (**argv == '-') {
3014169Sedward 			switch (*++*argv) {
31*14286Sedward 			case 'f':
32*14286Sedward 				fast++;
33*14286Sedward 				break;
3414169Sedward 			case 'e':
3514169Sedward 				setescape(next(argv));
3614169Sedward 				break;
3714169Sedward 			case 't':
3814169Sedward 				terse++;
3914169Sedward 				break;
40*14286Sedward 			case 'd':
41*14286Sedward 				debug++;
42*14286Sedward 				break;
4314169Sedward 			default:
4414169Sedward 				usage();
4514169Sedward 			}
4614169Sedward 		} else
4714169Sedward 			usage();
4814169Sedward 	}
49*14286Sedward 	if ((shell = getenv("SHELL")) == 0)
50*14286Sedward 		shell = "/bin/csh";
51*14286Sedward 	if (shellname = rindex(shell, '/'))
52*14286Sedward 		shellname++;
53*14286Sedward 	else
54*14286Sedward 		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 	}
61*14286Sedward 	if (debug) {
62*14286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
63*14286Sedward 		wwsettty(0, &wwnewtty);
64*14286Sedward 	}
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);
77*14286Sedward 	if (!fast) {
78*14286Sedward 		if (doconfig() < 0)
79*14286Sedward 			dodefault();
80*14286Sedward 		if (selwin != 0)
81*14286Sedward 			wwsetcurwin(selwin);
82*14286Sedward 	}
8313969Sedward 	while (!quit) {
8413969Sedward 		if (curwin == cmdwin) {
8513969Sedward 			docmd();
8613962Sedward 			continue;
8713969Sedward 		}
8813994Sedward 		/*
8913994Sedward 		 * Loop until we get some keyboard input.
9013994Sedward 		 */
9113969Sedward 		while (ibufc == 0) {
9213969Sedward 			wwsetcursor(WCurRow(curwin->ww_win),
9313969Sedward 				WCurCol(curwin->ww_win));
9413969Sedward 			wwflush();
9513994Sedward 			imask = 1 << 0;
9613994Sedward 			while (wwforce(&imask) < 0)
9713994Sedward 				;
9813994Sedward 			if ((imask & 1 << 0) == 0)
9913962Sedward 				continue;
10013994Sedward 			/* NOTE: ibufc == 0 */
10113994Sedward 			ibufp = ibuf;
10214153Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
10313994Sedward 				ibufc = 0;
10414153Sedward 				nreade++;
10514153Sedward 			} else if (ibufc == 0)
10614153Sedward 				nreadz++;
10714153Sedward 			else
10814153Sedward 				nreadc += ibufc;
10914153Sedward 			nread++;
11013994Sedward 		}
11113994Sedward 		/*
11213994Sedward 		 * Weird loop.  Copy the buffer to the pty stopping
11313994Sedward 		 * on the escape character in a hopefully efficient
11413994Sedward 		 * way.
11513994Sedward 		 * Probably a good thing to make ibufc == 1 a special
11613994Sedward 		 * case.
11713994Sedward 		 */
11813994Sedward 		for (p = ibufp, n = ibufc;;) {
11913994Sedward 			if (--n < 0) {
12013994Sedward 				write(curwin->ww_pty, ibufp, ibufc);
12113969Sedward 				ibufp = ibuf;
12213994Sedward 				ibufc = 0;
12313994Sedward 				break;
12414169Sedward 			} else if (*p++ == escapec) {
12513994Sedward 				if ((n = p - ibufp) > 1)
12613994Sedward 					write(curwin->ww_pty, ibufp, n - 1);
12713994Sedward 				ibufp = p;
12813994Sedward 				ibufc -= n;
12914024Sedward 				wwsetcurwin(cmdwin);
13013994Sedward 				break;
13113994Sedward 			}
13213920Sedward 		}
13313920Sedward 	}
13413920Sedward bad:
13513920Sedward 	wwend();
13613920Sedward 	return 0;
13713920Sedward }
13814169Sedward 
13914169Sedward usage()
14014169Sedward {
14114169Sedward 	fprintf(stderr, "window: [-e escape] [-t]\n");
14214169Sedward 	exit(1);
14314169Sedward }
144