xref: /original-bsd/usr.bin/window/main.c (revision 6386612b)
1 #ifndef lint
2 static char sccsid[] = "@(#)main.c	3.29 04/24/85";
3 #endif
4 
5 /*
6  * Copyright (c) 1983 Regents of the University of California,
7  * All rights reserved.  Redistribution permitted subject to
8  * the terms of the Berkeley Software License Agreement.
9  */
10 
11 #include "defs.h"
12 #include <sys/signal.h>
13 #include <stdio.h>
14 #include "string.h"
15 #include "char.h"
16 #include "local.h"
17 
18 #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
19 
20 /*ARGSUSED*/
21 main(argc, argv)
22 char **argv;
23 {
24 	register char *p;
25 	char fflag = 0;
26 	char dflag = 0;
27 	char xflag = 0;
28 	char *cmd = 0;
29 	char tflag = 0;
30 
31 	nbufline = NLINE;
32 	escapec = ESCAPEC;
33 	if (p = rindex(*argv, '/'))
34 		p++;
35 	else
36 		p = *argv;
37 	debug = strcmp(p, "a.out") == 0;
38 	while (*++argv) {
39 		if (**argv == '-') {
40 			switch (*++*argv) {
41 			case 'f':
42 				fflag++;
43 				break;
44 			case 'c':
45 				if (cmd != 0) {
46 					(void) fprintf(stderr,
47 						"Only one -c allowed.\n");
48 					(void) usage();
49 				}
50 				cmd = next(argv);
51 				break;
52 			case 'e':
53 				setescape(next(argv));
54 				break;
55 			case 't':
56 				tflag++;
57 				break;
58 			case 'd':
59 				dflag++;
60 				break;
61 			case 'D':
62 				debug = !debug;
63 				break;
64 			case 'x':
65 				xflag++;
66 				break;
67 			default:
68 				(void) usage();
69 			}
70 		} else
71 			(void) usage();
72 	}
73 	if ((p = getenv("SHELL")) == 0)
74 		p = SHELL;
75 	if ((shellfile = str_cpy(p)) == 0)
76 		nomem();
77 	if (p = rindex(shellfile, '/'))
78 		p++;
79 	else
80 		p = shellfile;
81 	shell[0] = p;
82 	shell[1] = 0;
83 	(void) gettimeofday(&starttime, (struct timezone *)0);
84 	if (wwinit() < 0) {
85 		(void) fprintf(stderr, "%s.\n", wwerror());
86 		exit(1);
87 	}
88 	if (debug)
89 		wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
90 	if (xflag) {
91 		wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
92 		wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
93 	}
94 	if (debug || xflag)
95 		(void) wwsettty(0, &wwnewtty, &wwoldtty);
96 
97 	if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
98 		(void) wwflush();
99 		(void) fprintf(stderr, "%s.\r\n", wwerror());
100 		goto bad;
101 	}
102 	cmdwin->ww_mapnl = 1;
103 	cmdwin->ww_nointr = 1;
104 	cmdwin->ww_noupdate = 1;
105 	cmdwin->ww_unctrl = 1;
106 	if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
107 	    == 0) {
108 		(void) wwflush();
109 		(void) fprintf(stderr, "%s.\r\n", wwerror());
110 		goto bad;
111 	}
112 	wwadd(framewin, &wwhead);
113 	if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
114 		(void) wwflush();
115 		(void) fprintf(stderr, "%s.\r\n", wwerror());
116 		goto bad;
117 	}
118 	fgwin = framewin;
119 
120 	wwupdate();
121 	wwflush();
122 	(void) signal(SIGCHLD, wwchild);
123 	setvars();
124 
125 	setterse(tflag);
126 	setcmd(1);
127 	if (cmd != 0)
128 		(void) dolongcmd(cmd, (struct value *)0, 0);
129 	if (!fflag) {
130 		if (dflag || doconfig() < 0)
131 			dodefault();
132 		if (selwin != 0)
133 			setcmd(0);
134 	}
135 
136 	mloop();
137 
138 	wwupdate();
139 	wwflush();
140 bad:
141 	wwend();
142 	return 0;
143 }
144 
145 usage()
146 {
147 	(void) fprintf(stderr, "Usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n");
148 	exit(1);
149 	return 0;			/* for lint */
150 }
151 
152 nomem()
153 {
154 	(void) fprintf(stderr, "Out of memory.\n");
155 	exit(1);
156 }
157