xref: /csrg-svn/usr.bin/window/main.c (revision 14846)
113920Sedward #ifndef lint
2*14846Sedward static	char *sccsid = "@(#)main.c	3.7 83/08/26";
313920Sedward #endif
413920Sedward 
513969Sedward #include "defs.h"
613920Sedward 
714286Sedward char escapec = CTRL(p);
814841Sedward int nbufline = 48;			/* compatible */
914169Sedward 
1014286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
1114169Sedward 
1214407Sedward /*ARGSUSED*/
1314169Sedward main(argc, argv)
1414169Sedward char **argv;
1513920Sedward {
1613920Sedward 	register n;
1713920Sedward 	register char *p;
1814677Sedward 	char fflag = 0;
1914677Sedward 	char dflag = 0;
20*14846Sedward 	char xflag = 0;
2113920Sedward 	int imask;
2214407Sedward 	struct timezone timezone;
2313920Sedward 
2414286Sedward 	if (p = rindex(*argv, '/'))
2514286Sedward 		p++;
2614286Sedward 	else
2714286Sedward 		p = *argv;
2814286Sedward 	debug = strcmp(p, "a.out") == 0;
2914169Sedward 	while (*++argv) {
3014169Sedward 		if (**argv == '-') {
3114169Sedward 			switch (*++*argv) {
3214286Sedward 			case 'f':
3314677Sedward 				fflag++;
3414286Sedward 				break;
3514169Sedward 			case 'e':
3614169Sedward 				setescape(next(argv));
3714169Sedward 				break;
3814169Sedward 			case 't':
3914169Sedward 				terse++;
4014169Sedward 				break;
4114286Sedward 			case 'd':
4214677Sedward 				dflag++;
4314677Sedward 				break;
4414677Sedward 			case 'D':
4514286Sedward 				debug++;
4614286Sedward 				break;
47*14846Sedward 			case 'x':
48*14846Sedward 				xflag++;
49*14846Sedward 				break;
5014169Sedward 			default:
5114407Sedward 				(void) usage();
5214169Sedward 			}
5314169Sedward 		} else
5414407Sedward 			(void) usage();
5514169Sedward 	}
5614286Sedward 	if ((shell = getenv("SHELL")) == 0)
5714286Sedward 		shell = "/bin/csh";
5814286Sedward 	if (shellname = rindex(shell, '/'))
5914286Sedward 		shellname++;
6014286Sedward 	else
6114286Sedward 		shellname = shell;
6214407Sedward 	(void) gettimeofday(&starttime, &timezone);
6313962Sedward 	if (wwinit() < 0) {
6414407Sedward 		(void) fflush(stdout);
6514407Sedward 		(void) fprintf(stderr, "Can't do windows on this terminal.\n");
6613962Sedward 		exit(1);
6713962Sedward 	}
68*14846Sedward 	if (debug)
6914286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
70*14846Sedward 	if (xflag) {
71*14846Sedward 		wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
72*14846Sedward 		wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
73*14846Sedward 	}
74*14846Sedward 	if (debug || xflag)
7514407Sedward 		(void) wwsettty(0, &wwnewtty);
7614407Sedward 
7714407Sedward 	if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
7814407Sedward 		(void) wwflush();
7914407Sedward 		(void) fprintf(stderr, "Can't open command window.\r\n");
8013962Sedward 		goto bad;
8113962Sedward 	}
8214772Sedward 	if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
8314772Sedward 	    == 0) {
8414407Sedward 		(void) wwflush();
8514407Sedward 		(void) fprintf(stderr, "Can't open frame window.\r\n");
8614407Sedward 		goto bad;
8714407Sedward 	}
8814407Sedward 	wwadd(framewin, &wwhead);
8914720Sedward 	if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
9014720Sedward 		(void) wwflush();
9114720Sedward 		(void) fprintf(stderr, "Can't open box window.\r\n");
9214720Sedward 		goto bad;
9314720Sedward 	}
9414407Sedward 
9514407Sedward 	curwin = cmdwin;
9614407Sedward 	wwupdate();
9713969Sedward 	wwflush();
9813920Sedward 	(void) signal(SIGCHLD, wwchild);
9914677Sedward 	if (!fflag) {
10014407Sedward 		if (!terse)
10114407Sedward 			wwadd(cmdwin, &wwhead);
10214677Sedward 		if (dflag || doconfig() < 0)
10314286Sedward 			dodefault();
10414294Sedward 		if (selwin != 0) {
10514407Sedward 			curwin = selwin;
10614762Sedward 			wwcursor(selwin, 0);
10714294Sedward 		}
10814407Sedward 		if (!terse) {
10914407Sedward 			wwdelete(cmdwin);
11014407Sedward 			reframe();
11114407Sedward 		}
11214286Sedward 	}
11313969Sedward 	while (!quit) {
11413969Sedward 		if (curwin == cmdwin) {
11513969Sedward 			docmd();
11613962Sedward 			continue;
11713969Sedward 		}
11813994Sedward 		/*
11913994Sedward 		 * Loop until we get some keyboard input.
12013994Sedward 		 */
12113969Sedward 		while (ibufc == 0) {
12214407Sedward 			wwcurtowin(curwin);
12314407Sedward 			wwupdate();
12413969Sedward 			wwflush();
12513994Sedward 			imask = 1 << 0;
12613994Sedward 			while (wwforce(&imask) < 0)
12713994Sedward 				;
12813994Sedward 			if ((imask & 1 << 0) == 0)
12913962Sedward 				continue;
13013994Sedward 			/* NOTE: ibufc == 0 */
13113994Sedward 			ibufp = ibuf;
13214153Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
13313994Sedward 				ibufc = 0;
13414153Sedward 				nreade++;
13514153Sedward 			} else if (ibufc == 0)
13614153Sedward 				nreadz++;
13714153Sedward 			else
13814153Sedward 				nreadc += ibufc;
13914153Sedward 			nread++;
14013994Sedward 		}
14113994Sedward 		/*
14214407Sedward 		 * Weird loop.  Copy the buffer to the pty
14314407Sedward 		 * and stopping on the escape character
14414407Sedward 		 * in a hopefully efficient way.
14513994Sedward 		 * Probably a good thing to make ibufc == 1 a special
14613994Sedward 		 * case.
14713994Sedward 		 */
14813994Sedward 		for (p = ibufp, n = ibufc;;) {
14913994Sedward 			if (--n < 0) {
15014407Sedward 				(void) write(curwin->ww_pty, ibufp, ibufc);
15113969Sedward 				ibufp = ibuf;
15213994Sedward 				ibufc = 0;
15313994Sedward 				break;
15414169Sedward 			} else if (*p++ == escapec) {
15513994Sedward 				if ((n = p - ibufp) > 1)
15614407Sedward 					(void) write(curwin->ww_pty,
15714407Sedward 						ibufp, n - 1);
15813994Sedward 				ibufp = p;
15913994Sedward 				ibufc -= n;
16014407Sedward 				curwin = cmdwin;
16113994Sedward 				break;
16213994Sedward 			}
16313920Sedward 		}
16413920Sedward 	}
16514407Sedward 	wwupdate();
16614407Sedward 	wwflush();
16713920Sedward bad:
16813920Sedward 	wwend();
16913920Sedward 	return 0;
17013920Sedward }
17114169Sedward 
17214169Sedward usage()
17314169Sedward {
17414677Sedward 	(void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n");
17514454Sedward 	exit(1);
17614454Sedward 	return 0;			/* for lint */
17714169Sedward }
178