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