xref: /csrg-svn/usr.bin/window/main.c (revision 14720)
113920Sedward #ifndef lint
2*14720Sedward static	char *sccsid = "@(#)main.c	3.3 83/08/18";
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;
1714677Sedward 	char fflag = 0;
1814677Sedward 	char dflag = 0;
1913920Sedward 	int imask;
2014407Sedward 	struct timezone timezone;
2113920Sedward 
2214286Sedward 	if (p = rindex(*argv, '/'))
2314286Sedward 		p++;
2414286Sedward 	else
2514286Sedward 		p = *argv;
2614286Sedward 	debug = strcmp(p, "a.out") == 0;
2714169Sedward 	while (*++argv) {
2814169Sedward 		if (**argv == '-') {
2914169Sedward 			switch (*++*argv) {
3014286Sedward 			case 'f':
3114677Sedward 				fflag++;
3214286Sedward 				break;
3314169Sedward 			case 'e':
3414169Sedward 				setescape(next(argv));
3514169Sedward 				break;
3614169Sedward 			case 't':
3714169Sedward 				terse++;
3814169Sedward 				break;
3914286Sedward 			case 'd':
4014677Sedward 				dflag++;
4114677Sedward 				break;
4214677Sedward 			case 'D':
4314286Sedward 				debug++;
4414286Sedward 				break;
4514169Sedward 			default:
4614407Sedward 				(void) usage();
4714169Sedward 			}
4814169Sedward 		} else
4914407Sedward 			(void) usage();
5014169Sedward 	}
5114286Sedward 	if ((shell = getenv("SHELL")) == 0)
5214286Sedward 		shell = "/bin/csh";
5314286Sedward 	if (shellname = rindex(shell, '/'))
5414286Sedward 		shellname++;
5514286Sedward 	else
5614286Sedward 		shellname = shell;
5714407Sedward 	(void) gettimeofday(&starttime, &timezone);
5813962Sedward 	if (wwinit() < 0) {
5914407Sedward 		(void) fflush(stdout);
6014407Sedward 		(void) fprintf(stderr, "Can't do windows on this terminal.\n");
6113962Sedward 		exit(1);
6213962Sedward 	}
6314286Sedward 	if (debug) {
6414286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
6514407Sedward 		(void) wwsettty(0, &wwnewtty);
6614286Sedward 	}
6714407Sedward 
6814407Sedward 	if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
6914407Sedward 		(void) wwflush();
7014407Sedward 		(void) fprintf(stderr, "Can't open command window.\r\n");
7113962Sedward 		goto bad;
7213962Sedward 	}
7314407Sedward 	if ((framewin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
7414407Sedward 		(void) wwflush();
7514407Sedward 		(void) fprintf(stderr, "Can't open frame window.\r\n");
7614407Sedward 		goto bad;
7714407Sedward 	}
7814407Sedward 	wwadd(framewin, &wwhead);
79*14720Sedward 	if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
80*14720Sedward 		(void) wwflush();
81*14720Sedward 		(void) fprintf(stderr, "Can't open box window.\r\n");
82*14720Sedward 		goto bad;
83*14720Sedward 	}
8414407Sedward 
8514407Sedward 	curwin = cmdwin;
8614407Sedward 	wwupdate();
8713969Sedward 	wwflush();
8813920Sedward 	(void) signal(SIGCHLD, wwchild);
8914677Sedward 	if (!fflag) {
9014407Sedward 		if (!terse)
9114407Sedward 			wwadd(cmdwin, &wwhead);
9214677Sedward 		if (dflag || doconfig() < 0)
9314286Sedward 			dodefault();
9414294Sedward 		if (selwin != 0) {
9514407Sedward 			curwin = selwin;
9614407Sedward 			/*
9714294Sedward 			Woncursor(selwin->ww_win, 0);
9814407Sedward 			*/
9914294Sedward 		}
10014407Sedward 		if (!terse) {
10114407Sedward 			wwdelete(cmdwin);
10214407Sedward 			reframe();
10314407Sedward 		}
10414286Sedward 	}
10513969Sedward 	while (!quit) {
10613969Sedward 		if (curwin == cmdwin) {
10713969Sedward 			docmd();
10813962Sedward 			continue;
10913969Sedward 		}
11013994Sedward 		/*
11113994Sedward 		 * Loop until we get some keyboard input.
11213994Sedward 		 */
11313969Sedward 		while (ibufc == 0) {
11414407Sedward 			wwcurtowin(curwin);
11514407Sedward 			wwupdate();
11613969Sedward 			wwflush();
11713994Sedward 			imask = 1 << 0;
11813994Sedward 			while (wwforce(&imask) < 0)
11913994Sedward 				;
12013994Sedward 			if ((imask & 1 << 0) == 0)
12113962Sedward 				continue;
12213994Sedward 			/* NOTE: ibufc == 0 */
12313994Sedward 			ibufp = ibuf;
12414153Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
12513994Sedward 				ibufc = 0;
12614153Sedward 				nreade++;
12714153Sedward 			} else if (ibufc == 0)
12814153Sedward 				nreadz++;
12914153Sedward 			else
13014153Sedward 				nreadc += ibufc;
13114153Sedward 			nread++;
13213994Sedward 		}
13313994Sedward 		/*
13414407Sedward 		 * Weird loop.  Copy the buffer to the pty
13514407Sedward 		 * and stopping on the escape character
13614407Sedward 		 * in a hopefully efficient way.
13713994Sedward 		 * Probably a good thing to make ibufc == 1 a special
13813994Sedward 		 * case.
13913994Sedward 		 */
14013994Sedward 		for (p = ibufp, n = ibufc;;) {
14113994Sedward 			if (--n < 0) {
14214407Sedward 				(void) write(curwin->ww_pty, ibufp, ibufc);
14313969Sedward 				ibufp = ibuf;
14413994Sedward 				ibufc = 0;
14513994Sedward 				break;
14614169Sedward 			} else if (*p++ == escapec) {
14713994Sedward 				if ((n = p - ibufp) > 1)
14814407Sedward 					(void) write(curwin->ww_pty,
14914407Sedward 						ibufp, n - 1);
15013994Sedward 				ibufp = p;
15113994Sedward 				ibufc -= n;
15214407Sedward 				curwin = cmdwin;
15313994Sedward 				break;
15413994Sedward 			}
15513920Sedward 		}
15613920Sedward 	}
15714407Sedward 	wwupdate();
15814407Sedward 	wwflush();
15913920Sedward bad:
16013920Sedward 	wwend();
16113920Sedward 	return 0;
16213920Sedward }
16314169Sedward 
16414169Sedward usage()
16514169Sedward {
16614677Sedward 	(void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n");
16714454Sedward 	exit(1);
16814454Sedward 	return 0;			/* for lint */
16914169Sedward }
170