forgot to check size <= 0
[unix-history] / usr / src / usr.bin / window / cmd.c
CommitLineData
f6dc361a 1#ifndef lint
720ae37c 2static char *sccsid = "@(#)cmd.c 3.5 83/08/22";
f6dc361a
EW
3#endif
4
5#include "defs.h"
6
7struct ww *getwin();
f6dc361a
EW
8
9docmd()
10{
11 register char c;
12 register struct ww *w;
f6dc361a 13
74329e4e 14 if (!terse)
bb05dfb5 15 wwadd(cmdwin, &wwhead);
c417b691 16 if (selwin != 0)
73218728 17 wwcursor(selwin, 1);
101acab4 18top:
f6dc361a 19 while ((c = bgetc()) >= 0) {
101acab4 20 if (!terse)
bb05dfb5 21 (void) wwputs("\r\n", cmdwin);
f6dc361a 22 switch (c) {
74329e4e
EW
23 default:
24 if (c == escapec)
25 goto foo;
26 break;
c417b691 27 case 'h': case 'j': case 'k': case 'l':
b0d4d9e2
EW
28 case CTRL(y):
29 case CTRL(e):
c417b691
EW
30 case CTRL(u):
31 case CTRL(d):
32 case CTRL(b):
33 case CTRL(f):
7e04a523
EW
34 case CTRL(s):
35 case CTRL(q):
f6dc361a 36 case CTRL([):
74329e4e 37 foo:
f6dc361a 38 if (selwin == 0) {
bb05dfb5 39 error("No window.");
f6dc361a
EW
40 continue;
41 }
42 }
43 switch (c) {
44 case '1': case '2': case '3': case '4': case '5':
45 case '6': case '7': case '8': case '9':
bb05dfb5
EW
46 if ((w = window[c - '1']) == 0) {
47 wwbell();
f6dc361a
EW
48 break;
49 }
50 setselwin(w);
51 goto out;
52 case '%':
4c8ea7ce
EW
53 if ((w = getwin()) != 0)
54 setselwin(w);
f6dc361a
EW
55 break;
56 case 'c':
4c8ea7ce 57 if ((w = getwin()) != 0)
bb05dfb5 58 c_close(w);
c417b691 59 break;
f6dc361a 60 case 'C':
bb05dfb5 61 c_close((struct ww *)0);
c417b691 62 break;
f6dc361a 63 case 'w':
bb05dfb5 64 c_window();
f6dc361a 65 break;
4c8ea7ce 66 case 'S':
bb05dfb5 67 c_show();
b4be6cd6 68 break;
101acab4 69 case 'L':
bb05dfb5 70 c_list();
101acab4 71 break;
4c8ea7ce 72 case ':':
bb05dfb5 73 c_colon();
4c8ea7ce 74 break;
c417b691 75 case 'h':
bb05dfb5 76 (void) wwwrite(selwin, "\b", 1);
c417b691
EW
77 break;
78 case 'j':
bb05dfb5 79 (void) wwwrite(selwin, "\n", 1);
c417b691
EW
80 break;
81 case 'k':
bb05dfb5 82 (void) wwwrite(selwin, "\033A", 2);
c417b691
EW
83 break;
84 case 'l':
bb05dfb5 85 (void) wwwrite(selwin, "\033C", 2);
c417b691 86 break;
b0d4d9e2
EW
87 case CTRL(e):
88 wwscroll(selwin, 1);
89 break;
90 case CTRL(y):
91 wwscroll(selwin, -1);
92 break;
c417b691 93 case CTRL(d):
b0d4d9e2 94 wwscroll(selwin, selwin->ww_w.nr / 2);
c417b691
EW
95 break;
96 case CTRL(u):
b0d4d9e2 97 wwscroll(selwin, - selwin->ww_w.nr / 2);
c417b691
EW
98 break;
99 case CTRL(f):
b0d4d9e2 100 wwscroll(selwin, selwin->ww_w.nr);
c417b691
EW
101 break;
102 case CTRL(b):
b0d4d9e2 103 wwscroll(selwin, - selwin->ww_w.nr);
c417b691 104 break;
7e04a523
EW
105 case CTRL(s):
106 (void) write(selwin->ww_pty,
107 &wwwintty.ww_tchars.t_stopc, 1);
108 break;
109 case CTRL(q):
110 (void) write(selwin->ww_pty,
111 &wwwintty.ww_tchars.t_startc, 1);
112 break;
f6dc361a 113 case CTRL(l):
bb05dfb5 114 wwredraw();
f6dc361a
EW
115 break;
116 case '?':
bb05dfb5 117 c_help();
f6dc361a 118 break;
f6dc361a
EW
119 case CTRL([):
120 goto out;
121 case CTRL(z):
122 wwsuspend();
123 break;
101acab4 124 case 'q':
bb05dfb5 125 c_quit();
8c4fb896
EW
126 if (quit)
127 goto out;
128 break;
720ae37c
EW
129 /* undocumented commands */
130 case 's':
131 c_stat();
132 break;
133 case 't':
134 c_time(RUSAGE_SELF);
135 break;
136 case 'T':
137 c_time(RUSAGE_CHILDREN);
138 break;
139 /* debugging commands */
140 case 'M':
141 if (!debug)
142 goto badcmd;
143 wwdumpsmap();
144 break;
145 case 'V':
146 if (!debug)
147 goto badcmd;
148 if ((w = getwin()) != 0)
149 wwdumpnvis(w);
150 break;
151 case 'D':
152 if (!debug)
153 goto badcmd;
154 if ((w = getwin()) != 0)
155 wwdumpcov(w);
156 break;
157 case 'W':
158 if (!debug)
159 goto badcmd;
160 if ((w = getwin()) != 0)
161 wwdumpwin(w);
101acab4 162 break;
f6dc361a 163 default:
720ae37c 164 badcmd:
74329e4e 165 if (c == escapec) {
bb05dfb5 166 (void) write(selwin->ww_pty, &escapec, 1);
74329e4e
EW
167 goto out;
168 }
101acab4 169 if (!terse)
bb05dfb5
EW
170 wwbell();
171 error("Type ? for help.");
f6dc361a
EW
172 break;
173 }
174 }
101acab4
EW
175 if (terse)
176 wwsetcursor(0, 0);
177 else {
178 if (!terse)
bb05dfb5
EW
179 (void) wwputs("Command: ", cmdwin);
180 wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
101acab4 181 }
b4be6cd6 182 while (bpeekc() < 0)
f6dc361a 183 bread();
f6dc361a
EW
184 goto top;
185out:
bb05dfb5
EW
186 if (!quit) {
187 curwin = selwin;
188 if (!terse) {
189 wwdelete(cmdwin);
190 reframe();
191 }
192 }
c417b691 193 if (selwin != 0)
73218728 194 wwcursor(selwin, 0);
f6dc361a
EW
195}
196
197struct ww *
198getwin()
199{
200 register int c;
4c8ea7ce 201 struct ww *w = 0;
f6dc361a 202
101acab4 203 if (!terse)
bb05dfb5
EW
204 (void) wwputs("Which window? ", cmdwin);
205 wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
b4be6cd6 206 while ((c = bgetc()) < 0)
f6dc361a 207 bread();
bb05dfb5
EW
208 if (debug && c == 'c')
209 w = cmdwin;
210 else if (debug && c == 'f')
211 w = framewin;
720ae37c
EW
212 else if (debug && c == 'b')
213 w = boxwin;
bb05dfb5
EW
214 else if (c >= '1' && c < NWINDOW + '1')
215 w = window[c - '1'];
216 if (w == 0)
217 wwbell();
101acab4 218 if (!terse)
bb05dfb5 219 (void) wwputs("\r\n", cmdwin);
f6dc361a
EW
220 return w;
221}
222
223setselwin(w)
224register struct ww *w;
225{
bb05dfb5 226 register struct ww *oldselwin = selwin;
4c8ea7ce
EW
227
228 if (w == oldselwin)
229 return;
c417b691 230 if (selwin = w) {
bb05dfb5
EW
231 wwdelete(w);
232 /*
233 * Stick it in front of the old selected window,
234 * or behind everbody else.
235 */
236 wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back);
4c8ea7ce 237 }
bb05dfb5 238 reframe();
f6dc361a
EW
239}
240
4c8ea7ce 241labelwin(w)
f6dc361a
EW
242register struct ww *w;
243{
bb05dfb5
EW
244 int mode = w == selwin ? WWM_REV : 0;
245
246 if (w->ww_id >= 0) {
247 char buf[2];
f6dc361a 248
bb05dfb5
EW
249 buf[0] = w->ww_id + '1';
250 buf[1] = 0;
251 (void) wwlabel(w, framewin, 1, buf, mode);
252 }
253 if (w->ww_label) {
254 int col;
255
256 if (w->ww_center) {
257 col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
258 col = MAX(3, col);
259 } else
260 col = 3;
261 (void) wwlabel(w, framewin, col, w->ww_label, mode);
262 }
f6dc361a 263}