xref: /csrg-svn/usr.bin/window/main.c (revision 18727)
113920Sedward #ifndef lint
2*18727Sedward static char sccsid[] = "@(#)main.c	3.29 04/24/85";
313920Sedward #endif
413920Sedward 
5*18727Sedward /*
6*18727Sedward  * Copyright (c) 1983 Regents of the University of California,
7*18727Sedward  * All rights reserved.  Redistribution permitted subject to
8*18727Sedward  * the terms of the Berkeley Software License Agreement.
9*18727Sedward  */
10*18727Sedward 
1113969Sedward #include "defs.h"
1216110Sedward #include <sys/signal.h>
1316110Sedward #include <stdio.h>
1416313Sedward #include "string.h"
1516309Sedward #include "char.h"
1616398Sedward #include "local.h"
1713920Sedward 
1814286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
1914169Sedward 
2014407Sedward /*ARGSUSED*/
2114169Sedward main(argc, argv)
2214169Sedward char **argv;
2313920Sedward {
2413920Sedward 	register char *p;
2514677Sedward 	char fflag = 0;
2614677Sedward 	char dflag = 0;
2714846Sedward 	char xflag = 0;
2816280Sedward 	char *cmd = 0;
2916280Sedward 	char tflag = 0;
3013920Sedward 
3117734Sedward 	nbufline = NLINE;
3217734Sedward 	escapec = ESCAPEC;
3314286Sedward 	if (p = rindex(*argv, '/'))
3414286Sedward 		p++;
3514286Sedward 	else
3614286Sedward 		p = *argv;
3714286Sedward 	debug = strcmp(p, "a.out") == 0;
3814169Sedward 	while (*++argv) {
3914169Sedward 		if (**argv == '-') {
4014169Sedward 			switch (*++*argv) {
4114286Sedward 			case 'f':
4214677Sedward 				fflag++;
4314286Sedward 				break;
4416280Sedward 			case 'c':
4516280Sedward 				if (cmd != 0) {
4616280Sedward 					(void) fprintf(stderr,
4716280Sedward 						"Only one -c allowed.\n");
4816280Sedward 					(void) usage();
4916280Sedward 				}
5016280Sedward 				cmd = next(argv);
5116280Sedward 				break;
5214169Sedward 			case 'e':
5314169Sedward 				setescape(next(argv));
5414169Sedward 				break;
5514169Sedward 			case 't':
5616280Sedward 				tflag++;
5714169Sedward 				break;
5814286Sedward 			case 'd':
5914677Sedward 				dflag++;
6014677Sedward 				break;
6114677Sedward 			case 'D':
6215025Sedward 				debug = !debug;
6314286Sedward 				break;
6414846Sedward 			case 'x':
6514846Sedward 				xflag++;
6614846Sedward 				break;
6714169Sedward 			default:
6814407Sedward 				(void) usage();
6914169Sedward 			}
7014169Sedward 		} else
7114407Sedward 			(void) usage();
7214169Sedward 	}
7316313Sedward 	if ((p = getenv("SHELL")) == 0)
7416398Sedward 		p = SHELL;
7516313Sedward 	if ((shellfile = str_cpy(p)) == 0)
7616313Sedward 		nomem();
7716313Sedward 	if (p = rindex(shellfile, '/'))
7816313Sedward 		p++;
7914286Sedward 	else
8016313Sedward 		p = shellfile;
8116313Sedward 	shell[0] = p;
8216313Sedward 	shell[1] = 0;
8316110Sedward 	(void) gettimeofday(&starttime, (struct timezone *)0);
8413962Sedward 	if (wwinit() < 0) {
8514895Sedward 		(void) fprintf(stderr, "%s.\n", wwerror());
8613962Sedward 		exit(1);
8713962Sedward 	}
8814846Sedward 	if (debug)
8914286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
9014846Sedward 	if (xflag) {
9114846Sedward 		wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
9214846Sedward 		wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
9314846Sedward 	}
9414846Sedward 	if (debug || xflag)
9517407Sedward 		(void) wwsettty(0, &wwnewtty, &wwoldtty);
9614407Sedward 
9714407Sedward 	if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
9814407Sedward 		(void) wwflush();
9914895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
10013962Sedward 		goto bad;
10113962Sedward 	}
10216312Sedward 	cmdwin->ww_mapnl = 1;
10316110Sedward 	cmdwin->ww_nointr = 1;
10416309Sedward 	cmdwin->ww_noupdate = 1;
10516313Sedward 	cmdwin->ww_unctrl = 1;
10614772Sedward 	if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
10714772Sedward 	    == 0) {
10814407Sedward 		(void) wwflush();
10914895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
11014407Sedward 		goto bad;
11114407Sedward 	}
11214407Sedward 	wwadd(framewin, &wwhead);
11314720Sedward 	if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
11414720Sedward 		(void) wwflush();
11514895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
11614720Sedward 		goto bad;
11714720Sedward 	}
11816253Sedward 	fgwin = framewin;
11914407Sedward 
12014407Sedward 	wwupdate();
12113969Sedward 	wwflush();
12213920Sedward 	(void) signal(SIGCHLD, wwchild);
12315671Sedward 	setvars();
12416280Sedward 
12516280Sedward 	setterse(tflag);
12616280Sedward 	setcmd(1);
12716280Sedward 	if (cmd != 0)
12816443Sedward 		(void) dolongcmd(cmd, (struct value *)0, 0);
12916280Sedward 	if (!fflag) {
13014677Sedward 		if (dflag || doconfig() < 0)
13114286Sedward 			dodefault();
13216280Sedward 		if (selwin != 0)
13316280Sedward 			setcmd(0);
13414286Sedward 	}
13514895Sedward 
13614895Sedward 	mloop();
13714895Sedward 
13814407Sedward 	wwupdate();
13914407Sedward 	wwflush();
14013920Sedward bad:
14113920Sedward 	wwend();
14213920Sedward 	return 0;
14313920Sedward }
14414169Sedward 
14514169Sedward usage()
14614169Sedward {
14716313Sedward 	(void) fprintf(stderr, "Usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n");
14814454Sedward 	exit(1);
14914454Sedward 	return 0;			/* for lint */
15014169Sedward }
15116313Sedward 
15216313Sedward nomem()
15316313Sedward {
15416313Sedward 	(void) fprintf(stderr, "Out of memory.\n");
15516313Sedward 	exit(1);
15616313Sedward }
157