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