xref: /csrg-svn/usr.bin/window/main.c (revision 16313)
113920Sedward #ifndef lint
2*16313Sedward static	char *sccsid = "@(#)main.c	3.23 84/04/08";
313920Sedward #endif
413920Sedward 
513969Sedward #include "defs.h"
616110Sedward #include <sys/signal.h>
716110Sedward #include <stdio.h>
8*16313Sedward #include "string.h"
916309Sedward #include "char.h"
1013920Sedward 
1114286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
1214169Sedward 
1314407Sedward /*ARGSUSED*/
1414169Sedward main(argc, argv)
1514169Sedward char **argv;
1613920Sedward {
1713920Sedward 	register char *p;
1814677Sedward 	char fflag = 0;
1914677Sedward 	char dflag = 0;
2014846Sedward 	char xflag = 0;
2116280Sedward 	char *cmd = 0;
2216280Sedward 	char tflag = 0;
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;
3516280Sedward 			case 'c':
3616280Sedward 				if (cmd != 0) {
3716280Sedward 					(void) fprintf(stderr,
3816280Sedward 						"Only one -c allowed.\n");
3916280Sedward 					(void) usage();
4016280Sedward 				}
4116280Sedward 				cmd = next(argv);
4216280Sedward 				break;
4314169Sedward 			case 'e':
4414169Sedward 				setescape(next(argv));
4514169Sedward 				break;
4614169Sedward 			case 't':
4716280Sedward 				tflag++;
4814169Sedward 				break;
4914286Sedward 			case 'd':
5014677Sedward 				dflag++;
5114677Sedward 				break;
5214677Sedward 			case 'D':
5315025Sedward 				debug = !debug;
5414286Sedward 				break;
5514846Sedward 			case 'x':
5614846Sedward 				xflag++;
5714846Sedward 				break;
5814169Sedward 			default:
5914407Sedward 				(void) usage();
6014169Sedward 			}
6114169Sedward 		} else
6214407Sedward 			(void) usage();
6314169Sedward 	}
6416231Sedward 	nbufline = 48;				/* compatible */
6516309Sedward 	escapec = ctrl(p);
66*16313Sedward 	if ((p = getenv("SHELL")) == 0)
67*16313Sedward 		p = "/bin/csh";
68*16313Sedward 	if ((shellfile = str_cpy(p)) == 0)
69*16313Sedward 		nomem();
70*16313Sedward 	if (p = rindex(shellfile, '/'))
71*16313Sedward 		p++;
7214286Sedward 	else
73*16313Sedward 		p = shellfile;
74*16313Sedward 	shell[0] = p;
75*16313Sedward 	shell[1] = 0;
7615360Sedward #ifndef O_4_1A
7716110Sedward 	(void) gettimeofday(&starttime, (struct timezone *)0);
7815360Sedward #endif
7913962Sedward 	if (wwinit() < 0) {
8014895Sedward 		(void) fprintf(stderr, "%s.\n", wwerror());
8113962Sedward 		exit(1);
8213962Sedward 	}
8314846Sedward 	if (debug)
8414286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
8514846Sedward 	if (xflag) {
8614846Sedward 		wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
8714846Sedward 		wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
8814846Sedward 	}
8914846Sedward 	if (debug || xflag)
9014407Sedward 		(void) wwsettty(0, &wwnewtty);
9114407Sedward 
9214407Sedward 	if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
9314407Sedward 		(void) wwflush();
9414895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
9513962Sedward 		goto bad;
9613962Sedward 	}
9716312Sedward 	cmdwin->ww_mapnl = 1;
9816110Sedward 	cmdwin->ww_nointr = 1;
9916309Sedward 	cmdwin->ww_noupdate = 1;
100*16313Sedward 	cmdwin->ww_unctrl = 1;
10114772Sedward 	if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
10214772Sedward 	    == 0) {
10314407Sedward 		(void) wwflush();
10414895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
10514407Sedward 		goto bad;
10614407Sedward 	}
10714407Sedward 	wwadd(framewin, &wwhead);
10814720Sedward 	if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
10914720Sedward 		(void) wwflush();
11014895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
11114720Sedward 		goto bad;
11214720Sedward 	}
11316253Sedward 	fgwin = framewin;
11414407Sedward 
11514407Sedward 	wwupdate();
11613969Sedward 	wwflush();
11713920Sedward 	(void) signal(SIGCHLD, wwchild);
11815671Sedward 	setvars();
11916280Sedward 
12016280Sedward 	setterse(tflag);
12116280Sedward 	setcmd(1);
12216280Sedward 	if (cmd != 0)
12316299Sedward 		(void) dolongcmd(cmd);
12416280Sedward 	if (!fflag) {
12514677Sedward 		if (dflag || doconfig() < 0)
12614286Sedward 			dodefault();
12716280Sedward 		if (selwin != 0)
12816280Sedward 			setcmd(0);
12914286Sedward 	}
13014895Sedward 
13114895Sedward 	mloop();
13214895Sedward 
13314407Sedward 	wwupdate();
13414407Sedward 	wwflush();
13513920Sedward bad:
13613920Sedward 	wwend();
13713920Sedward 	return 0;
13813920Sedward }
13914169Sedward 
14014169Sedward usage()
14114169Sedward {
142*16313Sedward 	(void) fprintf(stderr, "Usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n");
14314454Sedward 	exit(1);
14414454Sedward 	return 0;			/* for lint */
14514169Sedward }
146*16313Sedward 
147*16313Sedward nomem()
148*16313Sedward {
149*16313Sedward 	(void) fprintf(stderr, "Out of memory.\n");
150*16313Sedward 	exit(1);
151*16313Sedward }
152