date and time created 83/08/18 17:17:12 by edward
[unix-history] / usr / src / usr.bin / window / main.c
CommitLineData
fc38b21b 1#ifndef lint
c8ec0306 2static char *sccsid = "@(#)main.c 3.2 83/08/17";
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 }
73 if ((framewin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
74 (void) wwflush();
75 (void) fprintf(stderr, "Can't open frame window.\r\n");
4711df8b
EW
76 goto bad;
77 }
bb05dfb5
EW
78 wwadd(framewin, &wwhead);
79
80 curwin = cmdwin;
81 wwupdate();
2b44d852 82 wwflush();
fc38b21b 83 (void) signal(SIGCHLD, wwchild);
c8ec0306 84 if (!fflag) {
bb05dfb5
EW
85 if (!terse)
86 wwadd(cmdwin, &wwhead);
c8ec0306 87 if (dflag || doconfig() < 0)
db4a5bb1 88 dodefault();
0201d1be 89 if (selwin != 0) {
bb05dfb5
EW
90 curwin = selwin;
91 /*
0201d1be 92 Woncursor(selwin->ww_win, 0);
bb05dfb5
EW
93 */
94 }
95 if (!terse) {
96 wwdelete(cmdwin);
97 reframe();
0201d1be 98 }
db4a5bb1 99 }
2b44d852
EW
100 while (!quit) {
101 if (curwin == cmdwin) {
102 docmd();
4711df8b 103 continue;
2b44d852 104 }
b4be6cd6
EW
105 /*
106 * Loop until we get some keyboard input.
107 */
2b44d852 108 while (ibufc == 0) {
bb05dfb5
EW
109 wwcurtowin(curwin);
110 wwupdate();
2b44d852 111 wwflush();
b4be6cd6
EW
112 imask = 1 << 0;
113 while (wwforce(&imask) < 0)
114 ;
115 if ((imask & 1 << 0) == 0)
4711df8b 116 continue;
b4be6cd6
EW
117 /* NOTE: ibufc == 0 */
118 ibufp = ibuf;
39b49130 119 if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
b4be6cd6 120 ibufc = 0;
39b49130
EW
121 nreade++;
122 } else if (ibufc == 0)
123 nreadz++;
124 else
125 nreadc += ibufc;
126 nread++;
2b44d852 127 }
b4be6cd6 128 /*
bb05dfb5
EW
129 * Weird loop. Copy the buffer to the pty
130 * and stopping on the escape character
131 * in a hopefully efficient way.
b4be6cd6
EW
132 * Probably a good thing to make ibufc == 1 a special
133 * case.
134 */
135 for (p = ibufp, n = ibufc;;) {
136 if (--n < 0) {
bb05dfb5 137 (void) write(curwin->ww_pty, ibufp, ibufc);
b4be6cd6
EW
138 ibufp = ibuf;
139 ibufc = 0;
140 break;
a9353152 141 } else if (*p++ == escapec) {
b4be6cd6 142 if ((n = p - ibufp) > 1)
bb05dfb5
EW
143 (void) write(curwin->ww_pty,
144 ibufp, n - 1);
b4be6cd6
EW
145 ibufp = p;
146 ibufc -= n;
bb05dfb5 147 curwin = cmdwin;
b4be6cd6
EW
148 break;
149 }
fc38b21b
EW
150 }
151 }
bb05dfb5
EW
152 wwupdate();
153 wwflush();
fc38b21b 154bad:
fc38b21b
EW
155 wwend();
156 return 0;
157}
a9353152
EW
158
159usage()
160{
c8ec0306 161 (void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n");
30647f51
EW
162 exit(1);
163 return 0; /* for lint */
a9353152 164}