xref: /csrg-svn/usr.bin/window/main.c (revision 42834)
118727Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
533514Sbostic  * Redistribution and use in source and binary forms are permitted
634909Sbostic  * provided that the above copyright notice and this paragraph are
734909Sbostic  * duplicated in all such forms and that any documentation,
834909Sbostic  * advertising materials, and other materials related to such
934909Sbostic  * distribution and use acknowledge that the software was developed
1034909Sbostic  * by the University of California, Berkeley.  The name of the
1134909Sbostic  * University may not be used to endorse or promote products derived
1234909Sbostic  * from this software without specific prior written permission.
1334909Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1434909Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1534909Sbostic  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1618727Sedward  */
1718727Sedward 
1833514Sbostic #ifndef lint
19*42834Sedward static char sccsid[] = "@(#)main.c	3.39 (Berkeley) 06/02/90";
2033514Sbostic #endif /* not lint */
2133514Sbostic 
2213969Sedward #include "defs.h"
2337862Sbostic #include <paths.h>
2416110Sedward #include <stdio.h>
2516313Sedward #include "string.h"
2616309Sedward #include "char.h"
2716398Sedward #include "local.h"
2813920Sedward 
2914286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
3014169Sedward 
3114407Sedward /*ARGSUSED*/
3214169Sedward main(argc, argv)
3314169Sedward char **argv;
3413920Sedward {
3513920Sedward 	register char *p;
3614677Sedward 	char fflag = 0;
3714677Sedward 	char dflag = 0;
3814846Sedward 	char xflag = 0;
3916280Sedward 	char *cmd = 0;
4016280Sedward 	char tflag = 0;
4113920Sedward 
4217734Sedward 	escapec = ESCAPEC;
4314286Sedward 	if (p = rindex(*argv, '/'))
4414286Sedward 		p++;
4514286Sedward 	else
4614286Sedward 		p = *argv;
4714286Sedward 	debug = strcmp(p, "a.out") == 0;
4814169Sedward 	while (*++argv) {
4914169Sedward 		if (**argv == '-') {
5014169Sedward 			switch (*++*argv) {
5114286Sedward 			case 'f':
5214677Sedward 				fflag++;
5314286Sedward 				break;
5416280Sedward 			case 'c':
5516280Sedward 				if (cmd != 0) {
5616280Sedward 					(void) fprintf(stderr,
5716280Sedward 						"Only one -c allowed.\n");
5816280Sedward 					(void) usage();
5916280Sedward 				}
6016280Sedward 				cmd = next(argv);
6116280Sedward 				break;
6214169Sedward 			case 'e':
6314169Sedward 				setescape(next(argv));
6414169Sedward 				break;
6514169Sedward 			case 't':
6616280Sedward 				tflag++;
6714169Sedward 				break;
6814286Sedward 			case 'd':
6914677Sedward 				dflag++;
7014677Sedward 				break;
7114677Sedward 			case 'D':
7215025Sedward 				debug = !debug;
7314286Sedward 				break;
7414846Sedward 			case 'x':
7514846Sedward 				xflag++;
7614846Sedward 				break;
7714169Sedward 			default:
7814407Sedward 				(void) usage();
7914169Sedward 			}
8014169Sedward 		} else
8114407Sedward 			(void) usage();
8214169Sedward 	}
8316313Sedward 	if ((p = getenv("SHELL")) == 0)
8437461Sbostic 		p = _PATH_BSHELL;
8539293Sedward 	if ((default_shellfile = str_cpy(p)) == 0) {
8639293Sedward 		(void) fprintf(stderr, "Out of memory.\n");
8739293Sedward 		exit(1);
8839293Sedward 	}
8935330Sedward 	if (p = rindex(default_shellfile, '/'))
9016313Sedward 		p++;
9114286Sedward 	else
9235330Sedward 		p = default_shellfile;
9335330Sedward 	default_shell[0] = p;
9435330Sedward 	default_shell[1] = 0;
9535330Sedward 	default_nline = NLINE;
9635330Sedward 	default_smooth = 1;
9716110Sedward 	(void) gettimeofday(&starttime, (struct timezone *)0);
9813962Sedward 	if (wwinit() < 0) {
9914895Sedward 		(void) fprintf(stderr, "%s.\n", wwerror());
10013962Sedward 		exit(1);
10113962Sedward 	}
102*42834Sedward 
103*42834Sedward #ifndef POSIX_TTY
10414846Sedward 	if (debug)
10514286Sedward 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
10614846Sedward 	if (xflag) {
10714846Sedward 		wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
10814846Sedward 		wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
10914846Sedward 	}
110*42834Sedward #else
111*42834Sedward 	if (debug) {
112*42834Sedward 		wwnewtty.ww_termios.c_cc[VQUIT] =
113*42834Sedward 			wwoldtty.ww_termios.c_cc[VQUIT];
114*42834Sedward 		wwnewtty.ww_termios.c_lflag |= ISIG;
115*42834Sedward 	}
116*42834Sedward 	if (xflag) {
117*42834Sedward 		wwnewtty.ww_termios.c_cc[VSTOP] =
118*42834Sedward 			wwoldtty.ww_termios.c_cc[VSTOP];
119*42834Sedward 		wwnewtty.ww_termios.c_cc[VSTART] =
120*42834Sedward 			wwoldtty.ww_termios.c_cc[VSTART];
121*42834Sedward 		wwnewtty.ww_termios.c_iflag |= IXON;
122*42834Sedward 	}
123*42834Sedward #endif
12414846Sedward 	if (debug || xflag)
12517407Sedward 		(void) wwsettty(0, &wwnewtty, &wwoldtty);
12614407Sedward 
12731137Sedward 	if ((cmdwin = wwopen(wwbaud > 2400 ? WWO_REVERSE : 0, 1, wwncol,
12831137Sedward 			     0, 0, 0)) == 0) {
12938563Sedward 		wwflush();
13014895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
13113962Sedward 		goto bad;
13213962Sedward 	}
13316312Sedward 	cmdwin->ww_mapnl = 1;
13416110Sedward 	cmdwin->ww_nointr = 1;
13516309Sedward 	cmdwin->ww_noupdate = 1;
13616313Sedward 	cmdwin->ww_unctrl = 1;
13714772Sedward 	if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
13814772Sedward 	    == 0) {
13938563Sedward 		wwflush();
14014895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
14114407Sedward 		goto bad;
14214407Sedward 	}
14314407Sedward 	wwadd(framewin, &wwhead);
14414720Sedward 	if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
14538563Sedward 		wwflush();
14614895Sedward 		(void) fprintf(stderr, "%s.\r\n", wwerror());
14714720Sedward 		goto bad;
14814720Sedward 	}
14916253Sedward 	fgwin = framewin;
15014407Sedward 
15114407Sedward 	wwupdate();
15213969Sedward 	wwflush();
15315671Sedward 	setvars();
15416280Sedward 
15516280Sedward 	setterse(tflag);
15616280Sedward 	setcmd(1);
15716280Sedward 	if (cmd != 0)
15816443Sedward 		(void) dolongcmd(cmd, (struct value *)0, 0);
15935330Sedward 	if (!fflag)
16014677Sedward 		if (dflag || doconfig() < 0)
16114286Sedward 			dodefault();
16235330Sedward 	if (selwin != 0)
16335330Sedward 		setcmd(0);
16414895Sedward 
16514895Sedward 	mloop();
16614895Sedward 
16713920Sedward bad:
16813920Sedward 	wwend();
16913920Sedward 	return 0;
17013920Sedward }
17114169Sedward 
17214169Sedward usage()
17314169Sedward {
17416313Sedward 	(void) fprintf(stderr, "Usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n");
17514454Sedward 	exit(1);
17614454Sedward 	return 0;			/* for lint */
17714169Sedward }
178