lint
[unix-history] / usr / src / usr.bin / window / main.c
CommitLineData
fc38b21b 1#ifndef lint
ec8d5bfb 2static char *sccsid = "@(#)main.c 3.8 83/08/26";
fc38b21b
EW
3#endif
4
2b44d852 5#include "defs.h"
fc38b21b 6
db4a5bb1 7char escapec = CTRL(p);
4cbe417d 8int nbufline = 48; /* compatible */
a9353152 9
db4a5bb1 10#define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
a9353152 11
bb05dfb5 12/*ARGSUSED*/
a9353152
EW
13main(argc, argv)
14char **argv;
fc38b21b
EW
15{
16 register n;
17 register char *p;
c8ec0306
EW
18 char fflag = 0;
19 char dflag = 0;
5a7d5d43 20 char xflag = 0;
fc38b21b 21 int imask;
bb05dfb5 22 struct timezone timezone;
fc38b21b 23
db4a5bb1
EW
24 if (p = rindex(*argv, '/'))
25 p++;
26 else
27 p = *argv;
28 debug = strcmp(p, "a.out") == 0;
a9353152
EW
29 while (*++argv) {
30 if (**argv == '-') {
31 switch (*++*argv) {
db4a5bb1 32 case 'f':
c8ec0306 33 fflag++;
db4a5bb1 34 break;
a9353152
EW
35 case 'e':
36 setescape(next(argv));
37 break;
38 case 't':
39 terse++;
40 break;
db4a5bb1 41 case 'd':
c8ec0306
EW
42 dflag++;
43 break;
44 case 'D':
db4a5bb1
EW
45 debug++;
46 break;
5a7d5d43
EW
47 case 'x':
48 xflag++;
49 break;
a9353152 50 default:
bb05dfb5 51 (void) usage();
a9353152
EW
52 }
53 } else
bb05dfb5 54 (void) usage();
a9353152 55 }
db4a5bb1
EW
56 if ((shell = getenv("SHELL")) == 0)
57 shell = "/bin/csh";
58 if (shellname = rindex(shell, '/'))
59 shellname++;
60 else
61 shellname = shell;
bb05dfb5 62 (void) gettimeofday(&starttime, &timezone);
4711df8b 63 if (wwinit() < 0) {
bb05dfb5
EW
64 (void) fflush(stdout);
65 (void) fprintf(stderr, "Can't do windows on this terminal.\n");
4711df8b
EW
66 exit(1);
67 }
5a7d5d43 68 if (debug)
db4a5bb1 69 wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
5a7d5d43
EW
70 if (xflag) {
71 wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
72 wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
db4a5bb1 73 }
5a7d5d43
EW
74 if (debug || xflag)
75 (void) wwsettty(0, &wwnewtty);
bb05dfb5
EW
76
77 if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
78 (void) wwflush();
79 (void) fprintf(stderr, "Can't open command window.\r\n");
80 goto bad;
81 }
2357b64e
EW
82 if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
83 == 0) {
bb05dfb5
EW
84 (void) wwflush();
85 (void) fprintf(stderr, "Can't open frame window.\r\n");
4711df8b
EW
86 goto bad;
87 }
bb05dfb5 88 wwadd(framewin, &wwhead);
43c1dd56
EW
89 if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
90 (void) wwflush();
91 (void) fprintf(stderr, "Can't open box window.\r\n");
92 goto bad;
93 }
bb05dfb5
EW
94
95 curwin = cmdwin;
96 wwupdate();
2b44d852 97 wwflush();
fc38b21b 98 (void) signal(SIGCHLD, wwchild);
c8ec0306 99 if (!fflag) {
bb05dfb5
EW
100 if (!terse)
101 wwadd(cmdwin, &wwhead);
c8ec0306 102 if (dflag || doconfig() < 0)
db4a5bb1 103 dodefault();
0201d1be 104 if (selwin != 0) {
bb05dfb5 105 curwin = selwin;
73218728 106 wwcursor(selwin, 0);
bb05dfb5
EW
107 }
108 if (!terse) {
109 wwdelete(cmdwin);
110 reframe();
0201d1be 111 }
db4a5bb1 112 }
2b44d852
EW
113 while (!quit) {
114 if (curwin == cmdwin) {
115 docmd();
4711df8b 116 continue;
2b44d852 117 }
b4be6cd6
EW
118 /*
119 * Loop until we get some keyboard input.
120 */
2b44d852 121 while (ibufc == 0) {
bb05dfb5
EW
122 wwcurtowin(curwin);
123 wwupdate();
2b44d852 124 wwflush();
ec8d5bfb 125 while (imask = 1, wwforce(&imask) < 0)
b4be6cd6 126 ;
ec8d5bfb 127 if ((imask & 1) == 0)
4711df8b 128 continue;
b4be6cd6
EW
129 /* NOTE: ibufc == 0 */
130 ibufp = ibuf;
39b49130 131 if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
b4be6cd6 132 ibufc = 0;
39b49130
EW
133 nreade++;
134 } else if (ibufc == 0)
135 nreadz++;
136 else
137 nreadc += ibufc;
138 nread++;
2b44d852 139 }
b4be6cd6 140 /*
bb05dfb5
EW
141 * Weird loop. Copy the buffer to the pty
142 * and stopping on the escape character
143 * in a hopefully efficient way.
b4be6cd6
EW
144 * Probably a good thing to make ibufc == 1 a special
145 * case.
146 */
147 for (p = ibufp, n = ibufc;;) {
148 if (--n < 0) {
bb05dfb5 149 (void) write(curwin->ww_pty, ibufp, ibufc);
b4be6cd6
EW
150 ibufp = ibuf;
151 ibufc = 0;
152 break;
a9353152 153 } else if (*p++ == escapec) {
b4be6cd6 154 if ((n = p - ibufp) > 1)
bb05dfb5
EW
155 (void) write(curwin->ww_pty,
156 ibufp, n - 1);
b4be6cd6
EW
157 ibufp = p;
158 ibufc -= n;
bb05dfb5 159 curwin = cmdwin;
b4be6cd6
EW
160 break;
161 }
fc38b21b
EW
162 }
163 }
bb05dfb5
EW
164 wwupdate();
165 wwflush();
fc38b21b 166bad:
fc38b21b
EW
167 wwend();
168 return 0;
169}
a9353152
EW
170
171usage()
172{
c8ec0306 173 (void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n");
30647f51
EW
174 exit(1);
175 return 0; /* for lint */
a9353152 176}