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