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