xref: /csrg-svn/usr.bin/window/main.c (revision 16443)
113920Sedward #ifndef lint
2*16443Sedward static	char *sccsid = "@(#)main.c	3.25 84/05/06";
313920Sedward #endif
413920Sedward 
513969Sedward #include "defs.h"
616110Sedward #include <sys/signal.h>
716110Sedward #include <stdio.h>
816313Sedward #include "string.h"
916309Sedward #include "char.h"
1016398Sedward #include "local.h"
1113920Sedward 
1214286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
1314169Sedward 
1414407Sedward /*ARGSUSED*/
1514169Sedward main(argc, argv)
1614169Sedward char **argv;
1713920Sedward {
1813920Sedward 	register char *p;
1914677Sedward 	char fflag = 0;
2014677Sedward 	char dflag = 0;
2114846Sedward 	char xflag = 0;
2216280Sedward 	char *cmd = 0;
2316280Sedward 	char tflag = 0;
2413920Sedward 
2514286Sedward 	if (p = rindex(*argv, '/'))
2614286Sedward 		p++;
2714286Sedward 	else
2814286Sedward 		p = *argv;
2914286Sedward 	debug = strcmp(p, "a.out") == 0;
3014169Sedward 	while (*++argv) {
3114169Sedward 		if (**argv == '-') {
3214169Sedward 			switch (*++*argv) {
3314286Sedward 			case 'f':
3414677Sedward 				fflag++;
3514286Sedward 				break;
3616280Sedward 			case 'c':
3716280Sedward 				if (cmd != 0) {
3816280Sedward 					(void) fprintf(stderr,
3916280Sedward 						"Only one -c allowed.\n");
4016280Sedward 					(void) usage();
4116280Sedward 				}
4216280Sedward 				cmd = next(argv);
4316280Sedward 				break;
4414169Sedward 			case 'e':
4514169Sedward 				setescape(next(argv));
4614169Sedward 				break;
4714169Sedward 			case 't':
4816280Sedward 				tflag++;
4914169Sedward 				break;
5014286Sedward 			case 'd':
5114677Sedward 				dflag++;
5214677Sedward 				break;
5314677Sedward 			case 'D':
5415025Sedward 				debug = !debug;
5514286Sedward 				break;
5614846Sedward 			case 'x':
5714846Sedward 				xflag++;
5814846Sedward 				break;
5914169Sedward 			default:
6014407Sedward 				(void) usage();
6114169Sedward 			}
6214169Sedward 		} else
6314407Sedward 			(void) usage();
6414169Sedward 	}
6516398Sedward 	nbufline = NLINE;
6616398Sedward 	escapec = ESCAPEC;
6716313Sedward 	if ((p = getenv("SHELL")) == 0)
6816398Sedward 		p = SHELL;
6916313Sedward 	if ((shellfile = str_cpy(p)) == 0)
7016313Sedward 		nomem();
7116313Sedward 	if (p = rindex(shellfile, '/'))
7216313Sedward 		p++;
7314286Sedward 	else
7416313Sedward 		p = shellfile;
7516313Sedward 	shell[0] = p;
7616313Sedward 	shell[1] = 0;
7716110Sedward 	(void) gettimeofday(&starttime, (struct timezone *)0);
7813962Sedward 	if (wwinit() < 0) {
7914895Sedward 		(void) fprintf(stderr, "%s.\n", wwerror());
8013962Sedward 		exit(1);
8113962Sedward 	}
8214846Sedward 	if (debug)
8314286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
8414846Sedward 	if (xflag) {
8514846Sedward 		wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
8614846Sedward 		wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
8714846Sedward 	}
8814846Sedward 	if (debug || xflag)
8914407Sedward 		(void) wwsettty(0, &wwnewtty);
9014407Sedward 
9114407Sedward 	if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
9214407Sedward 		(void) wwflush();
9314895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
9413962Sedward 		goto bad;
9513962Sedward 	}
9616312Sedward 	cmdwin->ww_mapnl = 1;
9716110Sedward 	cmdwin->ww_nointr = 1;
9816309Sedward 	cmdwin->ww_noupdate = 1;
9916313Sedward 	cmdwin->ww_unctrl = 1;
10014772Sedward 	if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
10114772Sedward 	    == 0) {
10214407Sedward 		(void) wwflush();
10314895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
10414407Sedward 		goto bad;
10514407Sedward 	}
10614407Sedward 	wwadd(framewin, &wwhead);
10714720Sedward 	if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
10814720Sedward 		(void) wwflush();
10914895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
11014720Sedward 		goto bad;
11114720Sedward 	}
11216253Sedward 	fgwin = framewin;
11314407Sedward 
11414407Sedward 	wwupdate();
11513969Sedward 	wwflush();
11613920Sedward 	(void) signal(SIGCHLD, wwchild);
11715671Sedward 	setvars();
11816280Sedward 
11916280Sedward 	setterse(tflag);
12016280Sedward 	setcmd(1);
12116280Sedward 	if (cmd != 0)
122*16443Sedward 		(void) dolongcmd(cmd, (struct value *)0, 0);
12316280Sedward 	if (!fflag) {
12414677Sedward 		if (dflag || doconfig() < 0)
12514286Sedward 			dodefault();
12616280Sedward 		if (selwin != 0)
12716280Sedward 			setcmd(0);
12814286Sedward 	}
12914895Sedward 
13014895Sedward 	mloop();
13114895Sedward 
13214407Sedward 	wwupdate();
13314407Sedward 	wwflush();
13413920Sedward bad:
13513920Sedward 	wwend();
13613920Sedward 	return 0;
13713920Sedward }
13814169Sedward 
13914169Sedward usage()
14014169Sedward {
14116313Sedward 	(void) fprintf(stderr, "Usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n");
14214454Sedward 	exit(1);
14314454Sedward 	return 0;			/* for lint */
14414169Sedward }
14516313Sedward 
14616313Sedward nomem()
14716313Sedward {
14816313Sedward 	(void) fprintf(stderr, "Out of memory.\n");
14916313Sedward 	exit(1);
15016313Sedward }
151