forgot to free ww_fmap after an error
[unix-history] / usr / src / usr.bin / window / cmd1.c
CommitLineData
827ef1a8 1#ifndef lint
03e75950 2static char *sccsid = "@(#)cmd1.c 3.9 83/08/26";
827ef1a8
EW
3#endif
4
5#include "defs.h"
6
bb05dfb5 7c_window()
827ef1a8
EW
8{
9 int col, row, xcol, xrow;
827ef1a8 10 int id;
827ef1a8 11
03e75950 12 if ((id = findid()) < 0)
827ef1a8 13 return;
101acab4 14 if (!terse)
bb05dfb5 15 (void) wwputs("Upper left corner: ", cmdwin);
827ef1a8
EW
16 col = 0;
17 row = 1;
43c1dd56 18 wwadd(boxwin, framewin->ww_back);
827ef1a8 19 for (;;) {
43c1dd56
EW
20 wwunbox(boxwin);
21 wwbox(boxwin, row - 1, col - 1, 3, 3);
827ef1a8 22 wwsetcursor(row, col);
b4be6cd6 23 while (bpeekc() < 0)
827ef1a8 24 bread();
bb05dfb5 25 switch (getpos(&row, &col, 1, 0)) {
827ef1a8 26 case -1:
43c1dd56
EW
27 wwunbox(boxwin);
28 wwdelete(boxwin);
101acab4 29 if (!terse)
bb05dfb5 30 (void) wwputs("\r\nCancelled. ", cmdwin);
b4be6cd6 31 return;
827ef1a8
EW
32 case 1:
33 break;
34 case 0:
35 continue;
36 }
37 break;
38 }
101acab4 39 if (!terse)
bb05dfb5
EW
40 (void) wwputs("\r\nLower right corner: ", cmdwin);
41 xcol = col;
42 xrow = row;
827ef1a8 43 for (;;) {
43c1dd56
EW
44 wwunbox(boxwin);
45 wwbox(boxwin, row - 1, col - 1,
46 xrow - row + 3, xcol - col + 3);
827ef1a8
EW
47 wwsetcursor(xrow, xcol);
48 wwflush();
b4be6cd6 49 while (bpeekc() < 0)
827ef1a8 50 bread();
bb05dfb5 51 switch (getpos(&xrow, &xcol, row, col)) {
827ef1a8 52 case -1:
43c1dd56
EW
53 wwunbox(boxwin);
54 wwdelete(boxwin);
101acab4 55 if (!terse)
bb05dfb5 56 (void) wwputs("\r\nCancelled. ", cmdwin);
b4be6cd6 57 return;
827ef1a8
EW
58 case 1:
59 break;
60 case 0:
61 continue;
62 }
63 break;
64 }
43c1dd56
EW
65 wwunbox(boxwin);
66 wwdelete(boxwin);
101acab4 67 if (!terse)
bb05dfb5
EW
68 (void) wwputs("\r\n", cmdwin);
69 wwcurtowin(cmdwin);
03e75950 70 (void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline);
8c4fb896
EW
71}
72
73findid()
74{
bb05dfb5 75 register i;
8c4fb896 76
bb05dfb5 77 for (i = 0; i < NWINDOW && window[i] != 0; i++)
8c4fb896 78 ;
03e75950
EW
79 if (i >= NWINDOW) {
80 error("Too many windows.");
81 return -1;
82 }
83 return i;
827ef1a8
EW
84}
85
86getpos(row, col, minrow, mincol)
87register int *row, *col, minrow, mincol;
88{
89 static int scount = 0;
90 int count;
91 char c;
92
93 while ((c = bgetc()) >= 0) {
94 switch (c) {
95 case '0': case '1': case '2': case '3': case '4':
96 case '5': case '6': case '7': case '8': case '9':
97 scount = scount * 10 + c - '0';
98 continue;
99 }
100 count = scount ? scount : 1;
101 scount = 0;
102 switch (c) {
103 case 'h':
104 if ((*col -= count) < mincol)
105 *col = mincol;
106 break;
107 case 'H':
108 *col = mincol;
109 break;
110 case 'l':
c417b691
EW
111 if ((*col += count) >= wwncol)
112 *col = wwncol - 1;
827ef1a8
EW
113 break;
114 case 'L':
c417b691 115 *col = wwncol - 1;
827ef1a8
EW
116 break;
117 case 'j':
c417b691
EW
118 if ((*row += count) >= wwnrow)
119 *row = wwnrow - 1;
827ef1a8
EW
120 break;
121 case 'J':
c417b691 122 *row = wwnrow - 1;
827ef1a8
EW
123 break;
124 case 'k':
125 if ((*row -= count) < minrow)
126 *row = minrow;
127 break;
128 case 'K':
129 *row = minrow;
130 break;
131 case CTRL([):
132 return -1;
133 case '\r':
134 return 1;
135 default:
101acab4 136 if (!terse)
bb05dfb5
EW
137 (void) wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
138 wwbell();
827ef1a8
EW
139 }
140 }
141 return 0;
142}
143
8c4fb896 144struct ww *
4cbe417d 145openwin(id, row, col, nrow, ncol, nline)
8c4fb896 146int id, nrow, ncol, row, col;
827ef1a8
EW
147{
148 register struct ww *w;
149
8c4fb896
EW
150 if (id < 0 && (id = findid()) < 0)
151 return 0;
03e75950
EW
152 if (row <= 0) {
153 error("Bad row number.");
154 return 0;
155 }
156 if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0) {
157 error("%s.", wwerror());
8c4fb896 158 return 0;
03e75950 159 }
bb05dfb5
EW
160 w->ww_id = id;
161 window[id] = w;
162 w->ww_hasframe = 1;
73218728 163 wwcursor(w, 1);
fe24a747
EW
164 wwadd(w, framewin);
165 selwin = w;
166 reframe(); /* setselwin() won't do it */
55ae5bf1
EW
167 wwupdate();
168 wwflush();
8c4fb896
EW
169 switch (wwfork(w)) {
170 case -1:
bb05dfb5 171 c_close(w);
03e75950 172 error("%s.", wwerror());
8c4fb896
EW
173 return 0;
174 case 0:
f5db29dc
EW
175 execl(shell, shellname, 0);
176 perror(shell);
8c4fb896 177 exit(1);
827ef1a8 178 }
8c4fb896 179 return w;
827ef1a8 180}