Blame


1 84b1cb73 2003-09-30 devnull #include <u.h>
2 84b1cb73 2003-09-30 devnull #include <libc.h>
3 84b1cb73 2003-09-30 devnull #include <draw.h>
4 84b1cb73 2003-09-30 devnull #include <thread.h>
5 84b1cb73 2003-09-30 devnull #include <mouse.h>
6 84b1cb73 2003-09-30 devnull #include <cursor.h>
7 84b1cb73 2003-09-30 devnull #include <keyboard.h>
8 84b1cb73 2003-09-30 devnull #include <frame.h>
9 84b1cb73 2003-09-30 devnull #include <plumb.h>
10 84b1cb73 2003-09-30 devnull #include "flayer.h"
11 84b1cb73 2003-09-30 devnull #include "samterm.h"
12 84b1cb73 2003-09-30 devnull
13 84b1cb73 2003-09-30 devnull #define HSIZE 3 /* Type + short count */
14 84b1cb73 2003-09-30 devnull Header h;
15 84b1cb73 2003-09-30 devnull uchar indata[DATASIZE+1]; /* room for NUL */
16 84b1cb73 2003-09-30 devnull uchar outdata[DATASIZE];
17 84b1cb73 2003-09-30 devnull short outcount;
18 84b1cb73 2003-09-30 devnull int hversion;
19 941c9f36 2003-10-11 devnull int hostfd[2];
20 84b1cb73 2003-09-30 devnull
21 84b1cb73 2003-09-30 devnull void inmesg(Hmesg, int);
22 84b1cb73 2003-09-30 devnull int inshort(int);
23 84b1cb73 2003-09-30 devnull long inlong(int);
24 84b1cb73 2003-09-30 devnull long invlong(int);
25 84b1cb73 2003-09-30 devnull void hsetdot(int, long, long);
26 84b1cb73 2003-09-30 devnull void hmoveto(int, long);
27 84b1cb73 2003-09-30 devnull void hsetsnarf(int);
28 af78a4cd 2004-03-02 devnull void hplumb(int);
29 84b1cb73 2003-09-30 devnull void clrlock(void);
30 84b1cb73 2003-09-30 devnull int snarfswap(char*, int, char**);
31 84b1cb73 2003-09-30 devnull
32 84b1cb73 2003-09-30 devnull void
33 84b1cb73 2003-09-30 devnull rcv(void)
34 84b1cb73 2003-09-30 devnull {
35 84b1cb73 2003-09-30 devnull int c;
36 84b1cb73 2003-09-30 devnull static int state = 0;
37 84b1cb73 2003-09-30 devnull static int count = 0;
38 84b1cb73 2003-09-30 devnull static int i = 0;
39 84b1cb73 2003-09-30 devnull static int errs = 0;
40 84b1cb73 2003-09-30 devnull
41 b4135f04 2005-01-07 devnull if(protodebug) print("rcv in\n");
42 93f2ae0d 2004-12-27 devnull while((c=rcvchar()) != -1){
43 b4135f04 2005-01-07 devnull if(protodebug) print(".");
44 84b1cb73 2003-09-30 devnull switch(state){
45 84b1cb73 2003-09-30 devnull case 0:
46 84b1cb73 2003-09-30 devnull h.type = c;
47 84b1cb73 2003-09-30 devnull state++;
48 84b1cb73 2003-09-30 devnull break;
49 84b1cb73 2003-09-30 devnull
50 84b1cb73 2003-09-30 devnull case 1:
51 84b1cb73 2003-09-30 devnull h.count0 = c;
52 84b1cb73 2003-09-30 devnull state++;
53 84b1cb73 2003-09-30 devnull break;
54 84b1cb73 2003-09-30 devnull
55 84b1cb73 2003-09-30 devnull case 2:
56 84b1cb73 2003-09-30 devnull h.count1 = c;
57 84b1cb73 2003-09-30 devnull count = h.count0|(h.count1<<8);
58 84b1cb73 2003-09-30 devnull i = 0;
59 84b1cb73 2003-09-30 devnull if(count > DATASIZE){
60 84b1cb73 2003-09-30 devnull if(++errs < 5){
61 84b1cb73 2003-09-30 devnull dumperrmsg(count, h.type, h.count0, c);
62 84b1cb73 2003-09-30 devnull state = 0;
63 84b1cb73 2003-09-30 devnull continue;
64 84b1cb73 2003-09-30 devnull }
65 84b1cb73 2003-09-30 devnull fprint(2, "type %d count %d\n", h.type, count);
66 84b1cb73 2003-09-30 devnull panic("count>DATASIZE");
67 84b1cb73 2003-09-30 devnull }
68 84b1cb73 2003-09-30 devnull if(count == 0)
69 84b1cb73 2003-09-30 devnull goto zerocount;
70 84b1cb73 2003-09-30 devnull state++;
71 84b1cb73 2003-09-30 devnull break;
72 84b1cb73 2003-09-30 devnull
73 84b1cb73 2003-09-30 devnull case 3:
74 84b1cb73 2003-09-30 devnull indata[i++] = c;
75 84b1cb73 2003-09-30 devnull if(i == count){
76 84b1cb73 2003-09-30 devnull zerocount:
77 84b1cb73 2003-09-30 devnull indata[i] = 0;
78 84b1cb73 2003-09-30 devnull inmesg(h.type, count);
79 84b1cb73 2003-09-30 devnull state = count = 0;
80 84b1cb73 2003-09-30 devnull continue;
81 84b1cb73 2003-09-30 devnull }
82 84b1cb73 2003-09-30 devnull break;
83 84b1cb73 2003-09-30 devnull }
84 b4135f04 2005-01-07 devnull if(protodebug) print(":");
85 93f2ae0d 2004-12-27 devnull }
86 93f2ae0d 2004-12-27 devnull
87 b4135f04 2005-01-07 devnull if(protodebug) print("rcv out\n");
88 84b1cb73 2003-09-30 devnull }
89 84b1cb73 2003-09-30 devnull
90 84b1cb73 2003-09-30 devnull Text *
91 84b1cb73 2003-09-30 devnull whichtext(int tg)
92 84b1cb73 2003-09-30 devnull {
93 84b1cb73 2003-09-30 devnull int i;
94 84b1cb73 2003-09-30 devnull
95 84b1cb73 2003-09-30 devnull for(i=0; i<nname; i++)
96 84b1cb73 2003-09-30 devnull if(tag[i] == tg)
97 84b1cb73 2003-09-30 devnull return text[i];
98 84b1cb73 2003-09-30 devnull panic("whichtext");
99 84b1cb73 2003-09-30 devnull return 0;
100 84b1cb73 2003-09-30 devnull }
101 84b1cb73 2003-09-30 devnull
102 84b1cb73 2003-09-30 devnull void
103 84b1cb73 2003-09-30 devnull inmesg(Hmesg type, int count)
104 84b1cb73 2003-09-30 devnull {
105 84b1cb73 2003-09-30 devnull Text *t;
106 84b1cb73 2003-09-30 devnull int i, m;
107 84b1cb73 2003-09-30 devnull long l;
108 84b1cb73 2003-09-30 devnull Flayer *lp;
109 84b1cb73 2003-09-30 devnull
110 84b1cb73 2003-09-30 devnull m = inshort(0);
111 84b1cb73 2003-09-30 devnull l = inlong(2);
112 84b1cb73 2003-09-30 devnull switch(type){
113 84b1cb73 2003-09-30 devnull case -1:
114 84b1cb73 2003-09-30 devnull panic("rcv error");
115 84b1cb73 2003-09-30 devnull default:
116 84b1cb73 2003-09-30 devnull fprint(2, "type %d\n", type);
117 84b1cb73 2003-09-30 devnull panic("rcv unknown");
118 84b1cb73 2003-09-30 devnull
119 84b1cb73 2003-09-30 devnull case Hversion:
120 84b1cb73 2003-09-30 devnull hversion = m;
121 84b1cb73 2003-09-30 devnull break;
122 84b1cb73 2003-09-30 devnull
123 84b1cb73 2003-09-30 devnull case Hbindname:
124 84b1cb73 2003-09-30 devnull l = invlong(2); /* for 64-bit pointers */
125 84b1cb73 2003-09-30 devnull if((i=whichmenu(m)) < 0)
126 84b1cb73 2003-09-30 devnull break;
127 84b1cb73 2003-09-30 devnull /* in case of a race, a bindname may already have occurred */
128 84b1cb73 2003-09-30 devnull if((t=whichtext(m)) == 0)
129 84b1cb73 2003-09-30 devnull t=(Text *)l;
130 84b1cb73 2003-09-30 devnull else /* let the old one win; clean up the new one */
131 84b1cb73 2003-09-30 devnull while(((Text *)l)->nwin>0)
132 84b1cb73 2003-09-30 devnull closeup(&((Text *)l)->l[((Text *)l)->front]);
133 84b1cb73 2003-09-30 devnull text[i] = t;
134 84b1cb73 2003-09-30 devnull text[i]->tag = m;
135 84b1cb73 2003-09-30 devnull break;
136 84b1cb73 2003-09-30 devnull
137 84b1cb73 2003-09-30 devnull case Hcurrent:
138 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0)
139 84b1cb73 2003-09-30 devnull break;
140 84b1cb73 2003-09-30 devnull t = whichtext(m);
141 84b1cb73 2003-09-30 devnull i = which && ((Text *)which->user1)==&cmd && m!=cmd.tag;
142 84b1cb73 2003-09-30 devnull if(t==0 && (t = sweeptext(0, m))==0)
143 84b1cb73 2003-09-30 devnull break;
144 84b1cb73 2003-09-30 devnull if(t->l[t->front].textfn==0)
145 84b1cb73 2003-09-30 devnull panic("Hcurrent");
146 84b1cb73 2003-09-30 devnull lp = &t->l[t->front];
147 84b1cb73 2003-09-30 devnull if(i){
148 84b1cb73 2003-09-30 devnull flupfront(lp);
149 84b1cb73 2003-09-30 devnull flborder(lp, 0);
150 84b1cb73 2003-09-30 devnull work = lp;
151 84b1cb73 2003-09-30 devnull }else
152 84b1cb73 2003-09-30 devnull current(lp);
153 84b1cb73 2003-09-30 devnull break;
154 84b1cb73 2003-09-30 devnull
155 84b1cb73 2003-09-30 devnull case Hmovname:
156 84b1cb73 2003-09-30 devnull if((m=whichmenu(m)) < 0)
157 84b1cb73 2003-09-30 devnull break;
158 84b1cb73 2003-09-30 devnull t = text[m];
159 84b1cb73 2003-09-30 devnull l = tag[m];
160 84b1cb73 2003-09-30 devnull i = name[m][0];
161 84b1cb73 2003-09-30 devnull text[m] = 0; /* suppress panic in menudel */
162 84b1cb73 2003-09-30 devnull menudel(m);
163 84b1cb73 2003-09-30 devnull if(t == &cmd)
164 84b1cb73 2003-09-30 devnull m = 0;
165 84b1cb73 2003-09-30 devnull else{
166 84b1cb73 2003-09-30 devnull if (nname>0 && text[0]==&cmd)
167 84b1cb73 2003-09-30 devnull m = 1;
168 84b1cb73 2003-09-30 devnull else m = 0;
169 84b1cb73 2003-09-30 devnull for(; m<nname; m++)
170 84b1cb73 2003-09-30 devnull if(strcmp((char*)indata+2, (char*)name[m]+1)<0)
171 84b1cb73 2003-09-30 devnull break;
172 84b1cb73 2003-09-30 devnull }
173 84b1cb73 2003-09-30 devnull menuins(m, indata+2, t, i, (int)l);
174 84b1cb73 2003-09-30 devnull break;
175 84b1cb73 2003-09-30 devnull
176 84b1cb73 2003-09-30 devnull case Hgrow:
177 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
178 84b1cb73 2003-09-30 devnull hgrow(m, l, inlong(6), 1);
179 84b1cb73 2003-09-30 devnull break;
180 84b1cb73 2003-09-30 devnull
181 84b1cb73 2003-09-30 devnull case Hnewname:
182 84b1cb73 2003-09-30 devnull menuins(0, (uchar *)"", (Text *)0, ' ', m);
183 84b1cb73 2003-09-30 devnull break;
184 84b1cb73 2003-09-30 devnull
185 84b1cb73 2003-09-30 devnull case Hcheck0:
186 84b1cb73 2003-09-30 devnull i = whichmenu(m);
187 84b1cb73 2003-09-30 devnull if(i>=0) {
188 84b1cb73 2003-09-30 devnull t = text[i];
189 84b1cb73 2003-09-30 devnull if(t)
190 84b1cb73 2003-09-30 devnull t->lock++;
191 84b1cb73 2003-09-30 devnull outTs(Tcheck, m);
192 84b1cb73 2003-09-30 devnull }
193 84b1cb73 2003-09-30 devnull break;
194 84b1cb73 2003-09-30 devnull
195 84b1cb73 2003-09-30 devnull case Hcheck:
196 84b1cb73 2003-09-30 devnull i = whichmenu(m);
197 84b1cb73 2003-09-30 devnull if(i>=0) {
198 84b1cb73 2003-09-30 devnull t = text[i];
199 84b1cb73 2003-09-30 devnull if(t && t->lock)
200 84b1cb73 2003-09-30 devnull t->lock--;
201 84b1cb73 2003-09-30 devnull hcheck(m);
202 84b1cb73 2003-09-30 devnull }
203 84b1cb73 2003-09-30 devnull break;
204 84b1cb73 2003-09-30 devnull
205 84b1cb73 2003-09-30 devnull case Hunlock:
206 84b1cb73 2003-09-30 devnull clrlock();
207 84b1cb73 2003-09-30 devnull break;
208 84b1cb73 2003-09-30 devnull
209 84b1cb73 2003-09-30 devnull case Hdata:
210 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
211 84b1cb73 2003-09-30 devnull l += hdata(m, l, indata+6, count-6);
212 84b1cb73 2003-09-30 devnull Checkscroll:
213 84b1cb73 2003-09-30 devnull if(m == cmd.tag){
214 84b1cb73 2003-09-30 devnull for(i=0; i<NL; i++){
215 84b1cb73 2003-09-30 devnull lp = &cmd.l[i];
216 84b1cb73 2003-09-30 devnull if(lp->textfn)
217 84b1cb73 2003-09-30 devnull center(lp, l>=0? l : lp->p1);
218 84b1cb73 2003-09-30 devnull }
219 84b1cb73 2003-09-30 devnull }
220 84b1cb73 2003-09-30 devnull break;
221 84b1cb73 2003-09-30 devnull
222 84b1cb73 2003-09-30 devnull case Horigin:
223 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
224 84b1cb73 2003-09-30 devnull horigin(m, l);
225 84b1cb73 2003-09-30 devnull break;
226 84b1cb73 2003-09-30 devnull
227 84b1cb73 2003-09-30 devnull case Hunlockfile:
228 84b1cb73 2003-09-30 devnull if(whichmenu(m)>=0 && (t = whichtext(m))->lock){
229 84b1cb73 2003-09-30 devnull --t->lock;
230 84b1cb73 2003-09-30 devnull l = -1;
231 84b1cb73 2003-09-30 devnull goto Checkscroll;
232 84b1cb73 2003-09-30 devnull }
233 84b1cb73 2003-09-30 devnull break;
234 84b1cb73 2003-09-30 devnull
235 84b1cb73 2003-09-30 devnull case Hsetdot:
236 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
237 84b1cb73 2003-09-30 devnull hsetdot(m, l, inlong(6));
238 84b1cb73 2003-09-30 devnull break;
239 84b1cb73 2003-09-30 devnull
240 84b1cb73 2003-09-30 devnull case Hgrowdata:
241 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0)
242 84b1cb73 2003-09-30 devnull break;
243 84b1cb73 2003-09-30 devnull hgrow(m, l, inlong(6), 0);
244 84b1cb73 2003-09-30 devnull whichtext(m)->lock++; /* fake the request */
245 84b1cb73 2003-09-30 devnull l += hdata(m, l, indata+10, count-10);
246 84b1cb73 2003-09-30 devnull goto Checkscroll;
247 84b1cb73 2003-09-30 devnull
248 84b1cb73 2003-09-30 devnull case Hmoveto:
249 84b1cb73 2003-09-30 devnull if(whichmenu(m)>=0)
250 84b1cb73 2003-09-30 devnull hmoveto(m, l);
251 84b1cb73 2003-09-30 devnull break;
252 84b1cb73 2003-09-30 devnull
253 84b1cb73 2003-09-30 devnull case Hclean:
254 84b1cb73 2003-09-30 devnull if((m = whichmenu(m)) >= 0)
255 84b1cb73 2003-09-30 devnull name[m][0] = ' ';
256 84b1cb73 2003-09-30 devnull break;
257 84b1cb73 2003-09-30 devnull
258 84b1cb73 2003-09-30 devnull case Hdirty:
259 84b1cb73 2003-09-30 devnull if((m = whichmenu(m))>=0)
260 84b1cb73 2003-09-30 devnull name[m][0] = '\'';
261 84b1cb73 2003-09-30 devnull break;
262 84b1cb73 2003-09-30 devnull
263 84b1cb73 2003-09-30 devnull case Hdelname:
264 84b1cb73 2003-09-30 devnull if((m=whichmenu(m)) >= 0)
265 84b1cb73 2003-09-30 devnull menudel(m);
266 84b1cb73 2003-09-30 devnull break;
267 84b1cb73 2003-09-30 devnull
268 84b1cb73 2003-09-30 devnull case Hcut:
269 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
270 84b1cb73 2003-09-30 devnull hcut(m, l, inlong(6));
271 84b1cb73 2003-09-30 devnull break;
272 84b1cb73 2003-09-30 devnull
273 84b1cb73 2003-09-30 devnull case Hclose:
274 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0 || (t = whichtext(m))==0)
275 84b1cb73 2003-09-30 devnull break;
276 84b1cb73 2003-09-30 devnull l = t->nwin;
277 84b1cb73 2003-09-30 devnull for(i = 0,lp = t->l; l>0 && i<NL; i++,lp++)
278 84b1cb73 2003-09-30 devnull if(lp->textfn){
279 84b1cb73 2003-09-30 devnull closeup(lp);
280 84b1cb73 2003-09-30 devnull --l;
281 84b1cb73 2003-09-30 devnull }
282 84b1cb73 2003-09-30 devnull break;
283 84b1cb73 2003-09-30 devnull
284 84b1cb73 2003-09-30 devnull case Hsetpat:
285 84b1cb73 2003-09-30 devnull setpat((char *)indata);
286 84b1cb73 2003-09-30 devnull break;
287 84b1cb73 2003-09-30 devnull
288 84b1cb73 2003-09-30 devnull case Hsetsnarf:
289 84b1cb73 2003-09-30 devnull hsetsnarf(m);
290 84b1cb73 2003-09-30 devnull break;
291 84b1cb73 2003-09-30 devnull
292 84b1cb73 2003-09-30 devnull case Hsnarflen:
293 84b1cb73 2003-09-30 devnull snarflen = inlong(0);
294 84b1cb73 2003-09-30 devnull break;
295 84b1cb73 2003-09-30 devnull
296 84b1cb73 2003-09-30 devnull case Hack:
297 84b1cb73 2003-09-30 devnull outT0(Tack);
298 84b1cb73 2003-09-30 devnull break;
299 84b1cb73 2003-09-30 devnull
300 84b1cb73 2003-09-30 devnull case Hexit:
301 84b1cb73 2003-09-30 devnull outT0(Texit);
302 84b1cb73 2003-09-30 devnull threadexitsall(nil);
303 84b1cb73 2003-09-30 devnull break;
304 84b1cb73 2003-09-30 devnull
305 84b1cb73 2003-09-30 devnull case Hplumb:
306 84b1cb73 2003-09-30 devnull hplumb(m);
307 84b1cb73 2003-09-30 devnull break;
308 84b1cb73 2003-09-30 devnull }
309 84b1cb73 2003-09-30 devnull }
310 84b1cb73 2003-09-30 devnull
311 84b1cb73 2003-09-30 devnull void
312 84b1cb73 2003-09-30 devnull setlock(void)
313 84b1cb73 2003-09-30 devnull {
314 84b1cb73 2003-09-30 devnull hostlock++;
315 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor = &lockarrow);
316 84b1cb73 2003-09-30 devnull }
317 84b1cb73 2003-09-30 devnull
318 84b1cb73 2003-09-30 devnull void
319 84b1cb73 2003-09-30 devnull clrlock(void)
320 84b1cb73 2003-09-30 devnull {
321 84b1cb73 2003-09-30 devnull hasunlocked = 1;
322 84b1cb73 2003-09-30 devnull if(hostlock > 0)
323 84b1cb73 2003-09-30 devnull hostlock--;
324 84b1cb73 2003-09-30 devnull if(hostlock == 0)
325 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor=(Cursor *)0);
326 84b1cb73 2003-09-30 devnull }
327 84b1cb73 2003-09-30 devnull
328 84b1cb73 2003-09-30 devnull void
329 84b1cb73 2003-09-30 devnull startfile(Text *t)
330 84b1cb73 2003-09-30 devnull {
331 84b1cb73 2003-09-30 devnull outTsv(Tstartfile, t->tag, t); /* for 64-bit pointers */
332 84b1cb73 2003-09-30 devnull setlock();
333 84b1cb73 2003-09-30 devnull }
334 84b1cb73 2003-09-30 devnull
335 84b1cb73 2003-09-30 devnull void
336 84b1cb73 2003-09-30 devnull startnewfile(int type, Text *t)
337 84b1cb73 2003-09-30 devnull {
338 84b1cb73 2003-09-30 devnull t->tag = Untagged;
339 84b1cb73 2003-09-30 devnull outTv(type, t); /* for 64-bit pointers */
340 84b1cb73 2003-09-30 devnull }
341 84b1cb73 2003-09-30 devnull
342 84b1cb73 2003-09-30 devnull int
343 84b1cb73 2003-09-30 devnull inshort(int n)
344 84b1cb73 2003-09-30 devnull {
345 84b1cb73 2003-09-30 devnull return indata[n]|(indata[n+1]<<8);
346 84b1cb73 2003-09-30 devnull }
347 84b1cb73 2003-09-30 devnull
348 84b1cb73 2003-09-30 devnull long
349 84b1cb73 2003-09-30 devnull inlong(int n)
350 84b1cb73 2003-09-30 devnull {
351 84b1cb73 2003-09-30 devnull return indata[n]|(indata[n+1]<<8)|
352 84b1cb73 2003-09-30 devnull ((long)indata[n+2]<<16)|((long)indata[n+3]<<24);
353 84b1cb73 2003-09-30 devnull }
354 84b1cb73 2003-09-30 devnull
355 84b1cb73 2003-09-30 devnull long
356 84b1cb73 2003-09-30 devnull invlong(int n)
357 84b1cb73 2003-09-30 devnull {
358 84b1cb73 2003-09-30 devnull long l;
359 84b1cb73 2003-09-30 devnull
360 84b1cb73 2003-09-30 devnull l = (indata[n+7]<<24) | (indata[n+6]<<16) | (indata[n+5]<<8) | indata[n+4];
361 84b1cb73 2003-09-30 devnull l = (l<<16) | (indata[n+3]<<8) | indata[n+2];
362 84b1cb73 2003-09-30 devnull l = (l<<16) | (indata[n+1]<<8) | indata[n];
363 84b1cb73 2003-09-30 devnull return l;
364 84b1cb73 2003-09-30 devnull }
365 84b1cb73 2003-09-30 devnull
366 84b1cb73 2003-09-30 devnull void
367 84b1cb73 2003-09-30 devnull outT0(Tmesg type)
368 84b1cb73 2003-09-30 devnull {
369 84b1cb73 2003-09-30 devnull outstart(type);
370 84b1cb73 2003-09-30 devnull outsend();
371 84b1cb73 2003-09-30 devnull }
372 84b1cb73 2003-09-30 devnull
373 84b1cb73 2003-09-30 devnull void
374 84b1cb73 2003-09-30 devnull outTl(Tmesg type, long l)
375 84b1cb73 2003-09-30 devnull {
376 84b1cb73 2003-09-30 devnull outstart(type);
377 84b1cb73 2003-09-30 devnull outlong(l);
378 84b1cb73 2003-09-30 devnull outsend();
379 84b1cb73 2003-09-30 devnull }
380 84b1cb73 2003-09-30 devnull
381 84b1cb73 2003-09-30 devnull void
382 84b1cb73 2003-09-30 devnull outTs(Tmesg type, int s)
383 84b1cb73 2003-09-30 devnull {
384 84b1cb73 2003-09-30 devnull outstart(type);
385 84b1cb73 2003-09-30 devnull outshort(s);
386 84b1cb73 2003-09-30 devnull outsend();
387 84b1cb73 2003-09-30 devnull }
388 84b1cb73 2003-09-30 devnull
389 84b1cb73 2003-09-30 devnull void
390 84b1cb73 2003-09-30 devnull outTss(Tmesg type, int s1, int s2)
391 84b1cb73 2003-09-30 devnull {
392 84b1cb73 2003-09-30 devnull outstart(type);
393 84b1cb73 2003-09-30 devnull outshort(s1);
394 84b1cb73 2003-09-30 devnull outshort(s2);
395 84b1cb73 2003-09-30 devnull outsend();
396 84b1cb73 2003-09-30 devnull }
397 84b1cb73 2003-09-30 devnull
398 84b1cb73 2003-09-30 devnull void
399 84b1cb73 2003-09-30 devnull outTsll(Tmesg type, int s1, long l1, long l2)
400 84b1cb73 2003-09-30 devnull {
401 84b1cb73 2003-09-30 devnull outstart(type);
402 84b1cb73 2003-09-30 devnull outshort(s1);
403 84b1cb73 2003-09-30 devnull outlong(l1);
404 84b1cb73 2003-09-30 devnull outlong(l2);
405 84b1cb73 2003-09-30 devnull outsend();
406 84b1cb73 2003-09-30 devnull }
407 84b1cb73 2003-09-30 devnull
408 84b1cb73 2003-09-30 devnull void
409 84b1cb73 2003-09-30 devnull outTsl(Tmesg type, int s1, long l1)
410 84b1cb73 2003-09-30 devnull {
411 84b1cb73 2003-09-30 devnull outstart(type);
412 84b1cb73 2003-09-30 devnull outshort(s1);
413 84b1cb73 2003-09-30 devnull outlong(l1);
414 84b1cb73 2003-09-30 devnull outsend();
415 84b1cb73 2003-09-30 devnull }
416 84b1cb73 2003-09-30 devnull
417 84b1cb73 2003-09-30 devnull void
418 84b1cb73 2003-09-30 devnull outTsv(Tmesg type, int s1, void *l1)
419 84b1cb73 2003-09-30 devnull {
420 84b1cb73 2003-09-30 devnull outstart(type);
421 84b1cb73 2003-09-30 devnull outshort(s1);
422 84b1cb73 2003-09-30 devnull outvlong(l1);
423 84b1cb73 2003-09-30 devnull outsend();
424 84b1cb73 2003-09-30 devnull }
425 84b1cb73 2003-09-30 devnull
426 84b1cb73 2003-09-30 devnull void
427 84b1cb73 2003-09-30 devnull outTv(Tmesg type, void *l1)
428 84b1cb73 2003-09-30 devnull {
429 84b1cb73 2003-09-30 devnull outstart(type);
430 84b1cb73 2003-09-30 devnull outvlong(l1);
431 84b1cb73 2003-09-30 devnull outsend();
432 84b1cb73 2003-09-30 devnull }
433 84b1cb73 2003-09-30 devnull
434 84b1cb73 2003-09-30 devnull void
435 84b1cb73 2003-09-30 devnull outTslS(Tmesg type, int s1, long l1, Rune *s)
436 84b1cb73 2003-09-30 devnull {
437 84b1cb73 2003-09-30 devnull char buf[DATASIZE*3+1];
438 84b1cb73 2003-09-30 devnull char *c;
439 84b1cb73 2003-09-30 devnull
440 84b1cb73 2003-09-30 devnull outstart(type);
441 84b1cb73 2003-09-30 devnull outshort(s1);
442 84b1cb73 2003-09-30 devnull outlong(l1);
443 84b1cb73 2003-09-30 devnull c = buf;
444 84b1cb73 2003-09-30 devnull while(*s)
445 84b1cb73 2003-09-30 devnull c += runetochar(c, s++);
446 84b1cb73 2003-09-30 devnull *c++ = 0;
447 84b1cb73 2003-09-30 devnull outcopy(c-buf, (uchar *)buf);
448 84b1cb73 2003-09-30 devnull outsend();
449 84b1cb73 2003-09-30 devnull }
450 84b1cb73 2003-09-30 devnull
451 84b1cb73 2003-09-30 devnull void
452 84b1cb73 2003-09-30 devnull outTsls(Tmesg type, int s1, long l1, int s2)
453 84b1cb73 2003-09-30 devnull {
454 84b1cb73 2003-09-30 devnull outstart(type);
455 84b1cb73 2003-09-30 devnull outshort(s1);
456 84b1cb73 2003-09-30 devnull outlong(l1);
457 84b1cb73 2003-09-30 devnull outshort(s2);
458 84b1cb73 2003-09-30 devnull outsend();
459 84b1cb73 2003-09-30 devnull }
460 84b1cb73 2003-09-30 devnull
461 84b1cb73 2003-09-30 devnull void
462 84b1cb73 2003-09-30 devnull outstart(Tmesg type)
463 84b1cb73 2003-09-30 devnull {
464 84b1cb73 2003-09-30 devnull outdata[0] = type;
465 84b1cb73 2003-09-30 devnull outcount = 0;
466 84b1cb73 2003-09-30 devnull }
467 84b1cb73 2003-09-30 devnull
468 84b1cb73 2003-09-30 devnull void
469 84b1cb73 2003-09-30 devnull outcopy(int count, uchar *data)
470 84b1cb73 2003-09-30 devnull {
471 84b1cb73 2003-09-30 devnull while(count--)
472 84b1cb73 2003-09-30 devnull outdata[HSIZE+outcount++] = *data++;
473 84b1cb73 2003-09-30 devnull }
474 84b1cb73 2003-09-30 devnull
475 84b1cb73 2003-09-30 devnull void
476 84b1cb73 2003-09-30 devnull outshort(int s)
477 84b1cb73 2003-09-30 devnull {
478 84b1cb73 2003-09-30 devnull uchar buf[2];
479 84b1cb73 2003-09-30 devnull
480 84b1cb73 2003-09-30 devnull buf[0]=s;
481 84b1cb73 2003-09-30 devnull buf[1]=s>>8;
482 84b1cb73 2003-09-30 devnull outcopy(2, buf);
483 84b1cb73 2003-09-30 devnull }
484 84b1cb73 2003-09-30 devnull
485 84b1cb73 2003-09-30 devnull void
486 84b1cb73 2003-09-30 devnull outlong(long l)
487 84b1cb73 2003-09-30 devnull {
488 84b1cb73 2003-09-30 devnull uchar buf[4];
489 84b1cb73 2003-09-30 devnull
490 84b1cb73 2003-09-30 devnull buf[0]=l;
491 84b1cb73 2003-09-30 devnull buf[1]=l>>8;
492 84b1cb73 2003-09-30 devnull buf[2]=l>>16;
493 84b1cb73 2003-09-30 devnull buf[3]=l>>24;
494 84b1cb73 2003-09-30 devnull outcopy(4, buf);
495 84b1cb73 2003-09-30 devnull }
496 84b1cb73 2003-09-30 devnull
497 84b1cb73 2003-09-30 devnull void
498 84b1cb73 2003-09-30 devnull outvlong(void *v)
499 84b1cb73 2003-09-30 devnull {
500 84b1cb73 2003-09-30 devnull int i;
501 84b1cb73 2003-09-30 devnull ulong l;
502 84b1cb73 2003-09-30 devnull uchar buf[8];
503 84b1cb73 2003-09-30 devnull
504 84b1cb73 2003-09-30 devnull l = (ulong) v;
505 84b1cb73 2003-09-30 devnull for(i = 0; i < sizeof(buf); i++, l >>= 8)
506 84b1cb73 2003-09-30 devnull buf[i] = l;
507 84b1cb73 2003-09-30 devnull
508 84b1cb73 2003-09-30 devnull outcopy(8, buf);
509 84b1cb73 2003-09-30 devnull }
510 84b1cb73 2003-09-30 devnull
511 84b1cb73 2003-09-30 devnull void
512 84b1cb73 2003-09-30 devnull outsend(void)
513 84b1cb73 2003-09-30 devnull {
514 84b1cb73 2003-09-30 devnull if(outcount>DATASIZE-HSIZE)
515 84b1cb73 2003-09-30 devnull panic("outcount>sizeof outdata");
516 84b1cb73 2003-09-30 devnull outdata[1]=outcount;
517 84b1cb73 2003-09-30 devnull outdata[2]=outcount>>8;
518 941c9f36 2003-10-11 devnull if(write(hostfd[1], (char *)outdata, outcount+HSIZE)!=outcount+HSIZE)
519 84b1cb73 2003-09-30 devnull panic("write error");
520 84b1cb73 2003-09-30 devnull }
521 84b1cb73 2003-09-30 devnull
522 84b1cb73 2003-09-30 devnull
523 84b1cb73 2003-09-30 devnull void
524 84b1cb73 2003-09-30 devnull hsetdot(int m, long p0, long p1)
525 84b1cb73 2003-09-30 devnull {
526 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
527 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
528 84b1cb73 2003-09-30 devnull
529 84b1cb73 2003-09-30 devnull flushtyping(1);
530 84b1cb73 2003-09-30 devnull flsetselect(l, p0, p1);
531 84b1cb73 2003-09-30 devnull }
532 84b1cb73 2003-09-30 devnull
533 84b1cb73 2003-09-30 devnull void
534 84b1cb73 2003-09-30 devnull horigin(int m, long p0)
535 84b1cb73 2003-09-30 devnull {
536 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
537 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
538 84b1cb73 2003-09-30 devnull long a;
539 84b1cb73 2003-09-30 devnull ulong n;
540 84b1cb73 2003-09-30 devnull Rune *r;
541 84b1cb73 2003-09-30 devnull
542 84b1cb73 2003-09-30 devnull if(!flprepare(l)){
543 84b1cb73 2003-09-30 devnull l->origin = p0;
544 84b1cb73 2003-09-30 devnull return;
545 84b1cb73 2003-09-30 devnull }
546 84b1cb73 2003-09-30 devnull a = p0-l->origin;
547 84b1cb73 2003-09-30 devnull if(a>=0 && a<l->f.nchars)
548 84b1cb73 2003-09-30 devnull frdelete(&l->f, 0, a);
549 84b1cb73 2003-09-30 devnull else if(a<0 && -a<l->f.nchars){
550 84b1cb73 2003-09-30 devnull r = rload(&t->rasp, p0, l->origin, &n);
551 84b1cb73 2003-09-30 devnull frinsert(&l->f, r, r+n, 0);
552 84b1cb73 2003-09-30 devnull }else
553 84b1cb73 2003-09-30 devnull frdelete(&l->f, 0, l->f.nchars);
554 84b1cb73 2003-09-30 devnull l->origin = p0;
555 84b1cb73 2003-09-30 devnull scrdraw(l, t->rasp.nrunes);
556 84b1cb73 2003-09-30 devnull if(l->visible==Some)
557 84b1cb73 2003-09-30 devnull flrefresh(l, l->entire, 0);
558 84b1cb73 2003-09-30 devnull hcheck(m);
559 84b1cb73 2003-09-30 devnull }
560 84b1cb73 2003-09-30 devnull
561 84b1cb73 2003-09-30 devnull void
562 84b1cb73 2003-09-30 devnull hmoveto(int m, long p0)
563 84b1cb73 2003-09-30 devnull {
564 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
565 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
566 84b1cb73 2003-09-30 devnull
567 84b1cb73 2003-09-30 devnull if(p0<l->origin || p0-l->origin>l->f.nchars*9/10)
568 84b1cb73 2003-09-30 devnull outTsll(Torigin, m, p0, 2L);
569 84b1cb73 2003-09-30 devnull }
570 84b1cb73 2003-09-30 devnull
571 84b1cb73 2003-09-30 devnull void
572 84b1cb73 2003-09-30 devnull hcheck(int m)
573 84b1cb73 2003-09-30 devnull {
574 84b1cb73 2003-09-30 devnull Flayer *l;
575 84b1cb73 2003-09-30 devnull Text *t;
576 84b1cb73 2003-09-30 devnull int reqd = 0, i;
577 84b1cb73 2003-09-30 devnull long n, nl, a;
578 84b1cb73 2003-09-30 devnull Rune *r;
579 84b1cb73 2003-09-30 devnull
580 84b1cb73 2003-09-30 devnull if(m == Untagged)
581 84b1cb73 2003-09-30 devnull return;
582 84b1cb73 2003-09-30 devnull t = whichtext(m);
583 84b1cb73 2003-09-30 devnull if(t == 0) /* possible in a half-built window */
584 84b1cb73 2003-09-30 devnull return;
585 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
586 84b1cb73 2003-09-30 devnull if(l->textfn==0 || !flprepare(l)) /* BUG: don't
587 84b1cb73 2003-09-30 devnull need this if BUG below
588 84b1cb73 2003-09-30 devnull is fixed */
589 84b1cb73 2003-09-30 devnull continue;
590 84b1cb73 2003-09-30 devnull a = t->l[i].origin;
591 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+l->f.nchars, 1);
592 84b1cb73 2003-09-30 devnull if(n<l->f.nchars) /* text missing in middle of screen */
593 84b1cb73 2003-09-30 devnull a+=n;
594 84b1cb73 2003-09-30 devnull else{ /* text missing at end of screen? */
595 84b1cb73 2003-09-30 devnull Again:
596 84b1cb73 2003-09-30 devnull if(l->f.lastlinefull)
597 84b1cb73 2003-09-30 devnull goto Checksel; /* all's well */
598 84b1cb73 2003-09-30 devnull a = t->l[i].origin+l->f.nchars;
599 84b1cb73 2003-09-30 devnull n = t->rasp.nrunes-a;
600 84b1cb73 2003-09-30 devnull if(n==0)
601 84b1cb73 2003-09-30 devnull goto Checksel;
602 84b1cb73 2003-09-30 devnull if(n>TBLOCKSIZE)
603 84b1cb73 2003-09-30 devnull n = TBLOCKSIZE;
604 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+n, 1);
605 84b1cb73 2003-09-30 devnull if(n>0){
606 84b1cb73 2003-09-30 devnull rload(&t->rasp, a, a+n, 0);
607 84b1cb73 2003-09-30 devnull nl = l->f.nchars;
608 84b1cb73 2003-09-30 devnull r = scratch;
609 84b1cb73 2003-09-30 devnull flinsert(l, r, r+n, l->origin+nl);
610 84b1cb73 2003-09-30 devnull if(nl == l->f.nchars) /* made no progress */
611 84b1cb73 2003-09-30 devnull goto Checksel;
612 84b1cb73 2003-09-30 devnull goto Again;
613 84b1cb73 2003-09-30 devnull }
614 84b1cb73 2003-09-30 devnull }
615 84b1cb73 2003-09-30 devnull if(!reqd){
616 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+TBLOCKSIZE, 0);
617 84b1cb73 2003-09-30 devnull if(n <= 0)
618 84b1cb73 2003-09-30 devnull panic("hcheck request==0");
619 84b1cb73 2003-09-30 devnull outTsls(Trequest, m, a, (int)n);
620 84b1cb73 2003-09-30 devnull outTs(Tcheck, m);
621 84b1cb73 2003-09-30 devnull t->lock++; /* for the Trequest */
622 84b1cb73 2003-09-30 devnull t->lock++; /* for the Tcheck */
623 84b1cb73 2003-09-30 devnull reqd++;
624 84b1cb73 2003-09-30 devnull }
625 84b1cb73 2003-09-30 devnull Checksel:
626 84b1cb73 2003-09-30 devnull flsetselect(l, l->p0, l->p1);
627 84b1cb73 2003-09-30 devnull }
628 84b1cb73 2003-09-30 devnull }
629 84b1cb73 2003-09-30 devnull
630 84b1cb73 2003-09-30 devnull void
631 84b1cb73 2003-09-30 devnull flnewlyvisible(Flayer *l)
632 84b1cb73 2003-09-30 devnull {
633 84b1cb73 2003-09-30 devnull hcheck(((Text *)l->user1)->tag);
634 84b1cb73 2003-09-30 devnull }
635 84b1cb73 2003-09-30 devnull
636 84b1cb73 2003-09-30 devnull void
637 84b1cb73 2003-09-30 devnull hsetsnarf(int nc)
638 84b1cb73 2003-09-30 devnull {
639 84b1cb73 2003-09-30 devnull char *s2;
640 84b1cb73 2003-09-30 devnull char *s1;
641 84b1cb73 2003-09-30 devnull int i;
642 84b1cb73 2003-09-30 devnull int n;
643 84b1cb73 2003-09-30 devnull
644 84b1cb73 2003-09-30 devnull setcursor(mousectl, &deadmouse);
645 84b1cb73 2003-09-30 devnull s2 = alloc(nc+1);
646 84b1cb73 2003-09-30 devnull for(i=0; i<nc; i++)
647 84b1cb73 2003-09-30 devnull s2[i] = getch();
648 84b1cb73 2003-09-30 devnull s2[nc] = 0;
649 84b1cb73 2003-09-30 devnull n = snarfswap(s2, nc, &s1);
650 84b1cb73 2003-09-30 devnull if(n >= 0){
651 84b1cb73 2003-09-30 devnull if(!s1)
652 84b1cb73 2003-09-30 devnull n = 0;
653 efc2b0c9 2004-03-02 devnull if(n > 65535){
654 efc2b0c9 2004-03-02 devnull s1 = strdup("<snarf too long>");
655 efc2b0c9 2004-03-02 devnull if (!s1)
656 efc2b0c9 2004-03-02 devnull panic("strdup");
657 efc2b0c9 2004-03-02 devnull n = strlen(s1);
658 efc2b0c9 2004-03-02 devnull }else{
659 efc2b0c9 2004-03-02 devnull s1 = realloc(s1, n+1);
660 efc2b0c9 2004-03-02 devnull if (!s1)
661 efc2b0c9 2004-03-02 devnull panic("realloc");
662 efc2b0c9 2004-03-02 devnull s1[n] = 0;
663 efc2b0c9 2004-03-02 devnull }
664 84b1cb73 2003-09-30 devnull snarflen = n;
665 84b1cb73 2003-09-30 devnull outTs(Tsetsnarf, n);
666 941c9f36 2003-10-11 devnull if(n>0 && write(hostfd[1], s1, n)!=n)
667 84b1cb73 2003-09-30 devnull panic("snarf write error");
668 84b1cb73 2003-09-30 devnull free(s1);
669 84b1cb73 2003-09-30 devnull }else
670 84b1cb73 2003-09-30 devnull outTs(Tsetsnarf, 0);
671 84b1cb73 2003-09-30 devnull free(s2);
672 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
673 84b1cb73 2003-09-30 devnull }
674 84b1cb73 2003-09-30 devnull
675 84b1cb73 2003-09-30 devnull void
676 84b1cb73 2003-09-30 devnull hplumb(int nc)
677 84b1cb73 2003-09-30 devnull {
678 84b1cb73 2003-09-30 devnull int i;
679 84b1cb73 2003-09-30 devnull char *s;
680 84b1cb73 2003-09-30 devnull Plumbmsg *m;
681 84b1cb73 2003-09-30 devnull
682 84b1cb73 2003-09-30 devnull s = alloc(nc);
683 84b1cb73 2003-09-30 devnull for(i=0; i<nc; i++)
684 84b1cb73 2003-09-30 devnull s[i] = getch();
685 84b1cb73 2003-09-30 devnull if(plumbfd > 0){
686 84b1cb73 2003-09-30 devnull m = plumbunpack(s, nc);
687 84b1cb73 2003-09-30 devnull if(m != 0)
688 84b1cb73 2003-09-30 devnull plumbsend(plumbfd, m);
689 84b1cb73 2003-09-30 devnull plumbfree(m);
690 84b1cb73 2003-09-30 devnull }
691 84b1cb73 2003-09-30 devnull free(s);
692 84b1cb73 2003-09-30 devnull }
693 84b1cb73 2003-09-30 devnull
694 84b1cb73 2003-09-30 devnull void
695 84b1cb73 2003-09-30 devnull hgrow(int m, long a, long new, int req)
696 84b1cb73 2003-09-30 devnull {
697 84b1cb73 2003-09-30 devnull int i;
698 84b1cb73 2003-09-30 devnull Flayer *l;
699 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
700 84b1cb73 2003-09-30 devnull long o, b;
701 84b1cb73 2003-09-30 devnull
702 84b1cb73 2003-09-30 devnull if(new <= 0)
703 84b1cb73 2003-09-30 devnull panic("hgrow");
704 84b1cb73 2003-09-30 devnull rresize(&t->rasp, a, 0L, new);
705 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
706 84b1cb73 2003-09-30 devnull if(l->textfn == 0)
707 84b1cb73 2003-09-30 devnull continue;
708 84b1cb73 2003-09-30 devnull o = l->origin;
709 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
710 84b1cb73 2003-09-30 devnull if(a < o)
711 84b1cb73 2003-09-30 devnull l->origin+=new;
712 84b1cb73 2003-09-30 devnull if(a < l->p0)
713 84b1cb73 2003-09-30 devnull l->p0+=new;
714 84b1cb73 2003-09-30 devnull if(a < l->p1)
715 84b1cb73 2003-09-30 devnull l->p1+=new;
716 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
717 84b1cb73 2003-09-30 devnull if(!req || a<o || (b>0 && b>l->f.nchars) ||
718 84b1cb73 2003-09-30 devnull (l->f.nchars==0 && a-o>0))
719 84b1cb73 2003-09-30 devnull continue;
720 84b1cb73 2003-09-30 devnull if(new>TBLOCKSIZE)
721 84b1cb73 2003-09-30 devnull new = TBLOCKSIZE;
722 84b1cb73 2003-09-30 devnull outTsls(Trequest, m, a, (int)new);
723 84b1cb73 2003-09-30 devnull t->lock++;
724 84b1cb73 2003-09-30 devnull req = 0;
725 84b1cb73 2003-09-30 devnull }
726 84b1cb73 2003-09-30 devnull }
727 84b1cb73 2003-09-30 devnull
728 84b1cb73 2003-09-30 devnull int
729 84b1cb73 2003-09-30 devnull hdata1(Text *t, long a, Rune *r, int len)
730 84b1cb73 2003-09-30 devnull {
731 84b1cb73 2003-09-30 devnull int i;
732 84b1cb73 2003-09-30 devnull Flayer *l;
733 84b1cb73 2003-09-30 devnull long o, b;
734 84b1cb73 2003-09-30 devnull
735 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i=0; i<NL; i++, l++){
736 84b1cb73 2003-09-30 devnull if(l->textfn==0)
737 84b1cb73 2003-09-30 devnull continue;
738 84b1cb73 2003-09-30 devnull o = l->origin;
739 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
740 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
741 84b1cb73 2003-09-30 devnull if(a<o || (b>0 && b>l->f.nchars))
742 84b1cb73 2003-09-30 devnull continue;
743 84b1cb73 2003-09-30 devnull flinsert(l, r, r+len, o+b);
744 84b1cb73 2003-09-30 devnull }
745 84b1cb73 2003-09-30 devnull rdata(&t->rasp, a, a+len, r);
746 84b1cb73 2003-09-30 devnull rclean(&t->rasp);
747 84b1cb73 2003-09-30 devnull return len;
748 84b1cb73 2003-09-30 devnull }
749 84b1cb73 2003-09-30 devnull
750 84b1cb73 2003-09-30 devnull int
751 84b1cb73 2003-09-30 devnull hdata(int m, long a, uchar *s, int len)
752 84b1cb73 2003-09-30 devnull {
753 84b1cb73 2003-09-30 devnull int i, w;
754 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
755 84b1cb73 2003-09-30 devnull Rune buf[DATASIZE], *r;
756 84b1cb73 2003-09-30 devnull
757 84b1cb73 2003-09-30 devnull if(t->lock)
758 84b1cb73 2003-09-30 devnull --t->lock;
759 84b1cb73 2003-09-30 devnull if(len == 0)
760 84b1cb73 2003-09-30 devnull return 0;
761 84b1cb73 2003-09-30 devnull r = buf;
762 84b1cb73 2003-09-30 devnull for(i=0; i<len; i+=w,s+=w)
763 84b1cb73 2003-09-30 devnull w = chartorune(r++, (char*)s);
764 84b1cb73 2003-09-30 devnull return hdata1(t, a, buf, r-buf);
765 84b1cb73 2003-09-30 devnull }
766 84b1cb73 2003-09-30 devnull
767 84b1cb73 2003-09-30 devnull int
768 84b1cb73 2003-09-30 devnull hdatarune(int m, long a, Rune *r, int len)
769 84b1cb73 2003-09-30 devnull {
770 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
771 84b1cb73 2003-09-30 devnull
772 84b1cb73 2003-09-30 devnull if(t->lock)
773 84b1cb73 2003-09-30 devnull --t->lock;
774 84b1cb73 2003-09-30 devnull if(len == 0)
775 84b1cb73 2003-09-30 devnull return 0;
776 84b1cb73 2003-09-30 devnull return hdata1(t, a, r, len);
777 84b1cb73 2003-09-30 devnull }
778 84b1cb73 2003-09-30 devnull
779 84b1cb73 2003-09-30 devnull void
780 84b1cb73 2003-09-30 devnull hcut(int m, long a, long old)
781 84b1cb73 2003-09-30 devnull {
782 84b1cb73 2003-09-30 devnull Flayer *l;
783 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
784 84b1cb73 2003-09-30 devnull int i;
785 84b1cb73 2003-09-30 devnull long o, b;
786 84b1cb73 2003-09-30 devnull
787 84b1cb73 2003-09-30 devnull if(t->lock)
788 84b1cb73 2003-09-30 devnull --t->lock;
789 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
790 84b1cb73 2003-09-30 devnull if(l->textfn == 0)
791 84b1cb73 2003-09-30 devnull continue;
792 84b1cb73 2003-09-30 devnull o = l->origin;
793 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
794 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
795 84b1cb73 2003-09-30 devnull if((b<0 || b<l->f.nchars) && a+old>=o){
796 84b1cb73 2003-09-30 devnull fldelete(l, b<0? o : o+b,
797 84b1cb73 2003-09-30 devnull a+old-rmissing(&t->rasp, o, a+old));
798 84b1cb73 2003-09-30 devnull }
799 84b1cb73 2003-09-30 devnull if(a+old<o)
800 84b1cb73 2003-09-30 devnull l->origin-=old;
801 84b1cb73 2003-09-30 devnull else if(a<=o)
802 84b1cb73 2003-09-30 devnull l->origin = a;
803 84b1cb73 2003-09-30 devnull if(a+old<l->p0)
804 84b1cb73 2003-09-30 devnull l->p0-=old;
805 84b1cb73 2003-09-30 devnull else if(a<=l->p0)
806 84b1cb73 2003-09-30 devnull l->p0 = a;
807 84b1cb73 2003-09-30 devnull if(a+old<l->p1)
808 84b1cb73 2003-09-30 devnull l->p1-=old;
809 84b1cb73 2003-09-30 devnull else if(a<=l->p1)
810 84b1cb73 2003-09-30 devnull l->p1 = a;
811 84b1cb73 2003-09-30 devnull }
812 84b1cb73 2003-09-30 devnull rresize(&t->rasp, a, old, 0L);
813 84b1cb73 2003-09-30 devnull rclean(&t->rasp);
814 84b1cb73 2003-09-30 devnull }