xref: /csrg-svn/usr.bin/window/main.c (revision 14454)
113920Sedward #ifndef lint
2*14454Sedward static	char *sccsid = "@(#)main.c	3.1 83/08/11";
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 
1114407Sedward /*ARGSUSED*/
1214169Sedward main(argc, argv)
1314169Sedward char **argv;
1413920Sedward {
1513920Sedward 	register n;
1613920Sedward 	register char *p;
1714286Sedward 	char fast = 0;
1813920Sedward 	int imask;
1914407Sedward 	struct timezone timezone;
2013920Sedward 
2114286Sedward 	if (p = rindex(*argv, '/'))
2214286Sedward 		p++;
2314286Sedward 	else
2414286Sedward 		p = *argv;
2514286Sedward 	debug = strcmp(p, "a.out") == 0;
2614169Sedward 	while (*++argv) {
2714169Sedward 		if (**argv == '-') {
2814169Sedward 			switch (*++*argv) {
2914286Sedward 			case 'f':
3014286Sedward 				fast++;
3114286Sedward 				break;
3214169Sedward 			case 'e':
3314169Sedward 				setescape(next(argv));
3414169Sedward 				break;
3514169Sedward 			case 't':
3614169Sedward 				terse++;
3714169Sedward 				break;
3814286Sedward 			case 'd':
3914286Sedward 				debug++;
4014286Sedward 				break;
4114169Sedward 			default:
4214407Sedward 				(void) usage();
4314169Sedward 			}
4414169Sedward 		} else
4514407Sedward 			(void) usage();
4614169Sedward 	}
4714286Sedward 	if ((shell = getenv("SHELL")) == 0)
4814286Sedward 		shell = "/bin/csh";
4914286Sedward 	if (shellname = rindex(shell, '/'))
5014286Sedward 		shellname++;
5114286Sedward 	else
5214286Sedward 		shellname = shell;
5314407Sedward 	(void) gettimeofday(&starttime, &timezone);
5413962Sedward 	if (wwinit() < 0) {
5514407Sedward 		(void) fflush(stdout);
5614407Sedward 		(void) fprintf(stderr, "Can't do windows on this terminal.\n");
5713962Sedward 		exit(1);
5813962Sedward 	}
5914286Sedward 	if (debug) {
6014286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
6114407Sedward 		(void) wwsettty(0, &wwnewtty);
6214286Sedward 	}
6314407Sedward 
6414407Sedward 	if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
6514407Sedward 		(void) wwflush();
6614407Sedward 		(void) fprintf(stderr, "Can't open command window.\r\n");
6713962Sedward 		goto bad;
6813962Sedward 	}
6914407Sedward 	if ((framewin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
7014407Sedward 		(void) wwflush();
7114407Sedward 		(void) fprintf(stderr, "Can't open frame window.\r\n");
7214407Sedward 		goto bad;
7314407Sedward 	}
7414407Sedward 	wwadd(framewin, &wwhead);
7514407Sedward 
7614407Sedward 	curwin = cmdwin;
7714407Sedward 	wwupdate();
7813969Sedward 	wwflush();
7913920Sedward 	(void) signal(SIGCHLD, wwchild);
8014286Sedward 	if (!fast) {
8114407Sedward 		if (!terse)
8214407Sedward 			wwadd(cmdwin, &wwhead);
8314286Sedward 		if (doconfig() < 0)
8414286Sedward 			dodefault();
8514294Sedward 		if (selwin != 0) {
8614407Sedward 			curwin = selwin;
8714407Sedward 			/*
8814294Sedward 			Woncursor(selwin->ww_win, 0);
8914407Sedward 			*/
9014294Sedward 		}
9114407Sedward 		if (!terse) {
9214407Sedward 			wwdelete(cmdwin);
9314407Sedward 			reframe();
9414407Sedward 		}
9514286Sedward 	}
9613969Sedward 	while (!quit) {
9713969Sedward 		if (curwin == cmdwin) {
9813969Sedward 			docmd();
9913962Sedward 			continue;
10013969Sedward 		}
10113994Sedward 		/*
10213994Sedward 		 * Loop until we get some keyboard input.
10313994Sedward 		 */
10413969Sedward 		while (ibufc == 0) {
10514407Sedward 			wwcurtowin(curwin);
10614407Sedward 			wwupdate();
10713969Sedward 			wwflush();
10813994Sedward 			imask = 1 << 0;
10913994Sedward 			while (wwforce(&imask) < 0)
11013994Sedward 				;
11113994Sedward 			if ((imask & 1 << 0) == 0)
11213962Sedward 				continue;
11313994Sedward 			/* NOTE: ibufc == 0 */
11413994Sedward 			ibufp = ibuf;
11514153Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
11613994Sedward 				ibufc = 0;
11714153Sedward 				nreade++;
11814153Sedward 			} else if (ibufc == 0)
11914153Sedward 				nreadz++;
12014153Sedward 			else
12114153Sedward 				nreadc += ibufc;
12214153Sedward 			nread++;
12313994Sedward 		}
12413994Sedward 		/*
12514407Sedward 		 * Weird loop.  Copy the buffer to the pty
12614407Sedward 		 * and stopping on the escape character
12714407Sedward 		 * in a hopefully efficient way.
12813994Sedward 		 * Probably a good thing to make ibufc == 1 a special
12913994Sedward 		 * case.
13013994Sedward 		 */
13113994Sedward 		for (p = ibufp, n = ibufc;;) {
13213994Sedward 			if (--n < 0) {
13314407Sedward 				(void) write(curwin->ww_pty, ibufp, ibufc);
13413969Sedward 				ibufp = ibuf;
13513994Sedward 				ibufc = 0;
13613994Sedward 				break;
13714169Sedward 			} else if (*p++ == escapec) {
13813994Sedward 				if ((n = p - ibufp) > 1)
13914407Sedward 					(void) write(curwin->ww_pty,
14014407Sedward 						ibufp, n - 1);
14113994Sedward 				ibufp = p;
14213994Sedward 				ibufc -= n;
14314407Sedward 				curwin = cmdwin;
14413994Sedward 				break;
14513994Sedward 			}
14613920Sedward 		}
14713920Sedward 	}
14814407Sedward 	wwupdate();
14914407Sedward 	wwflush();
15013920Sedward bad:
15113920Sedward 	wwend();
15213920Sedward 	return 0;
15313920Sedward }
15414169Sedward 
15514169Sedward usage()
15614169Sedward {
15714407Sedward 	(void) fprintf(stderr, "window: [-e escape] [-t] [-f]\n");
158*14454Sedward 	exit(1);
159*14454Sedward 	return 0;			/* for lint */
16014169Sedward }
161