xref: /csrg-svn/usr.bin/window/main.c (revision 14677)
113920Sedward #ifndef lint
2*14677Sedward static	char *sccsid = "@(#)main.c	3.2 83/08/17";
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;
17*14677Sedward 	char fflag = 0;
18*14677Sedward 	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':
31*14677Sedward 				fflag++;
3214286Sedward 				break;
3314169Sedward 			case 'e':
3414169Sedward 				setescape(next(argv));
3514169Sedward 				break;
3614169Sedward 			case 't':
3714169Sedward 				terse++;
3814169Sedward 				break;
3914286Sedward 			case 'd':
40*14677Sedward 				dflag++;
41*14677Sedward 				break;
42*14677Sedward 			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);
7914407Sedward 
8014407Sedward 	curwin = cmdwin;
8114407Sedward 	wwupdate();
8213969Sedward 	wwflush();
8313920Sedward 	(void) signal(SIGCHLD, wwchild);
84*14677Sedward 	if (!fflag) {
8514407Sedward 		if (!terse)
8614407Sedward 			wwadd(cmdwin, &wwhead);
87*14677Sedward 		if (dflag || doconfig() < 0)
8814286Sedward 			dodefault();
8914294Sedward 		if (selwin != 0) {
9014407Sedward 			curwin = selwin;
9114407Sedward 			/*
9214294Sedward 			Woncursor(selwin->ww_win, 0);
9314407Sedward 			*/
9414294Sedward 		}
9514407Sedward 		if (!terse) {
9614407Sedward 			wwdelete(cmdwin);
9714407Sedward 			reframe();
9814407Sedward 		}
9914286Sedward 	}
10013969Sedward 	while (!quit) {
10113969Sedward 		if (curwin == cmdwin) {
10213969Sedward 			docmd();
10313962Sedward 			continue;
10413969Sedward 		}
10513994Sedward 		/*
10613994Sedward 		 * Loop until we get some keyboard input.
10713994Sedward 		 */
10813969Sedward 		while (ibufc == 0) {
10914407Sedward 			wwcurtowin(curwin);
11014407Sedward 			wwupdate();
11113969Sedward 			wwflush();
11213994Sedward 			imask = 1 << 0;
11313994Sedward 			while (wwforce(&imask) < 0)
11413994Sedward 				;
11513994Sedward 			if ((imask & 1 << 0) == 0)
11613962Sedward 				continue;
11713994Sedward 			/* NOTE: ibufc == 0 */
11813994Sedward 			ibufp = ibuf;
11914153Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
12013994Sedward 				ibufc = 0;
12114153Sedward 				nreade++;
12214153Sedward 			} else if (ibufc == 0)
12314153Sedward 				nreadz++;
12414153Sedward 			else
12514153Sedward 				nreadc += ibufc;
12614153Sedward 			nread++;
12713994Sedward 		}
12813994Sedward 		/*
12914407Sedward 		 * Weird loop.  Copy the buffer to the pty
13014407Sedward 		 * and stopping on the escape character
13114407Sedward 		 * in a hopefully efficient way.
13213994Sedward 		 * Probably a good thing to make ibufc == 1 a special
13313994Sedward 		 * case.
13413994Sedward 		 */
13513994Sedward 		for (p = ibufp, n = ibufc;;) {
13613994Sedward 			if (--n < 0) {
13714407Sedward 				(void) write(curwin->ww_pty, ibufp, ibufc);
13813969Sedward 				ibufp = ibuf;
13913994Sedward 				ibufc = 0;
14013994Sedward 				break;
14114169Sedward 			} else if (*p++ == escapec) {
14213994Sedward 				if ((n = p - ibufp) > 1)
14314407Sedward 					(void) write(curwin->ww_pty,
14414407Sedward 						ibufp, n - 1);
14513994Sedward 				ibufp = p;
14613994Sedward 				ibufc -= n;
14714407Sedward 				curwin = cmdwin;
14813994Sedward 				break;
14913994Sedward 			}
15013920Sedward 		}
15113920Sedward 	}
15214407Sedward 	wwupdate();
15314407Sedward 	wwflush();
15413920Sedward bad:
15513920Sedward 	wwend();
15613920Sedward 	return 0;
15713920Sedward }
15814169Sedward 
15914169Sedward usage()
16014169Sedward {
161*14677Sedward 	(void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n");
16214454Sedward 	exit(1);
16314454Sedward 	return 0;			/* for lint */
16414169Sedward }
165