1 a59ea66f 2003-09-30 devnull #include <u.h>
2 a59ea66f 2003-09-30 devnull #include <libc.h>
3 a59ea66f 2003-09-30 devnull #include <draw.h>
4 a59ea66f 2003-09-30 devnull #include <thread.h>
5 a59ea66f 2003-09-30 devnull #include <mouse.h>
6 a59ea66f 2003-09-30 devnull #include <cursor.h>
7 a59ea66f 2003-09-30 devnull #include <keyboard.h>
8 a59ea66f 2003-09-30 devnull #include <frame.h>
9 a59ea66f 2003-09-30 devnull #include "flayer.h"
10 a59ea66f 2003-09-30 devnull #include "samterm.h"
13 a59ea66f 2003-09-30 devnull rinit(Rasp *r)
15 a59ea66f 2003-09-30 devnull r->nrunes=0;
16 a59ea66f 2003-09-30 devnull r->sect=0;
20 a59ea66f 2003-09-30 devnull rclear(Rasp *r)
22 a59ea66f 2003-09-30 devnull Section *s, *ns;
24 a59ea66f 2003-09-30 devnull for(s=r->sect; s; s=ns){
25 a59ea66f 2003-09-30 devnull ns = s->next;
26 a59ea66f 2003-09-30 devnull free(s->text);
29 a59ea66f 2003-09-30 devnull r->sect = 0;
33 a59ea66f 2003-09-30 devnull rsinsert(Rasp *r, Section *s) /* insert before s */
35 a59ea66f 2003-09-30 devnull Section *t;
36 a59ea66f 2003-09-30 devnull Section *u;
38 a59ea66f 2003-09-30 devnull t = alloc(sizeof(Section));
39 a59ea66f 2003-09-30 devnull if(r->sect == s){ /* includes empty list case: r->sect==s==0 */
40 a59ea66f 2003-09-30 devnull r->sect = t;
41 a59ea66f 2003-09-30 devnull t->next = s;
43 a59ea66f 2003-09-30 devnull u = r->sect;
44 a59ea66f 2003-09-30 devnull if(u == 0)
45 a59ea66f 2003-09-30 devnull panic("rsinsert 1");
47 a59ea66f 2003-09-30 devnull if(u->next == s){
48 a59ea66f 2003-09-30 devnull t->next = s;
49 a59ea66f 2003-09-30 devnull u->next = t;
50 a59ea66f 2003-09-30 devnull goto Return;
52 a59ea66f 2003-09-30 devnull u=u->next;
53 a59ea66f 2003-09-30 devnull }while(u);
54 a59ea66f 2003-09-30 devnull panic("rsinsert 2");
57 a59ea66f 2003-09-30 devnull return t;
61 a59ea66f 2003-09-30 devnull rsdelete(Rasp *r, Section *s)
63 a59ea66f 2003-09-30 devnull Section *t;
65 a59ea66f 2003-09-30 devnull if(s == 0)
66 a59ea66f 2003-09-30 devnull panic("rsdelete");
67 a59ea66f 2003-09-30 devnull if(r->sect == s){
68 a59ea66f 2003-09-30 devnull r->sect = s->next;
69 a59ea66f 2003-09-30 devnull goto Free;
71 a59ea66f 2003-09-30 devnull for(t=r->sect; t; t=t->next)
72 a59ea66f 2003-09-30 devnull if(t->next == s){
73 a59ea66f 2003-09-30 devnull t->next = s->next;
75 a59ea66f 2003-09-30 devnull if(s->text)
76 a59ea66f 2003-09-30 devnull free(s->text);
80 a59ea66f 2003-09-30 devnull panic("rsdelete 2");
84 a59ea66f 2003-09-30 devnull splitsect(Rasp *r, Section *s, long n0)
86 a59ea66f 2003-09-30 devnull if(s == 0)
87 a59ea66f 2003-09-30 devnull panic("splitsect");
88 a59ea66f 2003-09-30 devnull rsinsert(r, s->next);
89 a59ea66f 2003-09-30 devnull if(s->text == 0)
90 a59ea66f 2003-09-30 devnull s->next->text = 0;
92 a59ea66f 2003-09-30 devnull s->next->text = alloc(RUNESIZE*(TBLOCKSIZE+1));
93 a59ea66f 2003-09-30 devnull Strcpy(s->next->text, s->text+n0);
94 a59ea66f 2003-09-30 devnull s->text[n0] = 0;
96 a59ea66f 2003-09-30 devnull s->next->nrunes = s->nrunes-n0;
97 a59ea66f 2003-09-30 devnull s->nrunes = n0;
100 a59ea66f 2003-09-30 devnull Section *
101 a59ea66f 2003-09-30 devnull findsect(Rasp *r, Section *s, long p, long q) /* find sect containing q and put q on a sect boundary */
103 a59ea66f 2003-09-30 devnull if(s==0 && p!=q)
104 a59ea66f 2003-09-30 devnull panic("findsect");
105 a59ea66f 2003-09-30 devnull for(; s && p+s->nrunes<=q; s=s->next)
106 a59ea66f 2003-09-30 devnull p += s->nrunes;
107 a59ea66f 2003-09-30 devnull if(p != q){
108 a59ea66f 2003-09-30 devnull splitsect(r, s, q-p);
109 a59ea66f 2003-09-30 devnull s = s->next;
111 a59ea66f 2003-09-30 devnull return s;
115 a59ea66f 2003-09-30 devnull rresize(Rasp *r, long a, long old, long new)
117 a59ea66f 2003-09-30 devnull Section *s, *t, *ns;
119 a59ea66f 2003-09-30 devnull s = findsect(r, r->sect, 0L, a);
120 a59ea66f 2003-09-30 devnull t = findsect(r, s, a, a+old);
121 a59ea66f 2003-09-30 devnull for(; s!=t; s=ns){
122 a59ea66f 2003-09-30 devnull ns=s->next;
123 a59ea66f 2003-09-30 devnull rsdelete(r, s);
125 a59ea66f 2003-09-30 devnull /* now insert the new piece before t */
126 a59ea66f 2003-09-30 devnull if(new > 0){
127 a59ea66f 2003-09-30 devnull ns=rsinsert(r, t);
128 a59ea66f 2003-09-30 devnull ns->nrunes=new;
129 a59ea66f 2003-09-30 devnull ns->text=0;
131 a59ea66f 2003-09-30 devnull r->nrunes += new-old;
135 a59ea66f 2003-09-30 devnull rdata(Rasp *r, long p0, long p1, Rune *cp)
137 a59ea66f 2003-09-30 devnull Section *s, *t, *ns;
139 a59ea66f 2003-09-30 devnull s = findsect(r, r->sect, 0L, p0);
140 a59ea66f 2003-09-30 devnull t = findsect(r, s, p0, p1);
141 a59ea66f 2003-09-30 devnull for(; s!=t; s=ns){
142 a59ea66f 2003-09-30 devnull ns=s->next;
143 a59ea66f 2003-09-30 devnull if(s->text)
144 a59ea66f 2003-09-30 devnull panic("rdata");
145 a59ea66f 2003-09-30 devnull rsdelete(r, s);
147 a59ea66f 2003-09-30 devnull p1 -= p0;
148 a59ea66f 2003-09-30 devnull s = rsinsert(r, t);
149 a59ea66f 2003-09-30 devnull s->text = alloc(RUNESIZE*(TBLOCKSIZE+1));
150 a59ea66f 2003-09-30 devnull memmove(s->text, cp, RUNESIZE*p1);
151 a59ea66f 2003-09-30 devnull s->text[p1] = 0;
152 a59ea66f 2003-09-30 devnull s->nrunes = p1;
156 a59ea66f 2003-09-30 devnull rclean(Rasp *r)
158 a59ea66f 2003-09-30 devnull Section *s;
160 a59ea66f 2003-09-30 devnull for(s=r->sect; s; s=s->next)
161 a59ea66f 2003-09-30 devnull while(s->next && (s->text!=0)==(s->next->text!=0)){
162 a59ea66f 2003-09-30 devnull if(s->text){
163 a59ea66f 2003-09-30 devnull if(s->nrunes+s->next->nrunes>TBLOCKSIZE)
165 a59ea66f 2003-09-30 devnull Strcpy(s->text+s->nrunes, s->next->text);
167 a59ea66f 2003-09-30 devnull s->nrunes += s->next->nrunes;
168 a59ea66f 2003-09-30 devnull rsdelete(r, s->next);
173 a59ea66f 2003-09-30 devnull Strcpy(Rune *to, Rune *from)
175 a59ea66f 2003-09-30 devnull do; while(*to++ = *from++);
179 a59ea66f 2003-09-30 devnull rload(Rasp *r, ulong p0, ulong p1, ulong *nrp)
181 a59ea66f 2003-09-30 devnull Section *s;
183 a59ea66f 2003-09-30 devnull int n, nb;
186 a59ea66f 2003-09-30 devnull Strgrow(&scratch, &nscralloc, p1-p0+1);
187 a59ea66f 2003-09-30 devnull scratch[0] = 0;
188 a59ea66f 2003-09-30 devnull for(p=0,s=r->sect; s && p+s->nrunes<=p0; s=s->next)
189 a59ea66f 2003-09-30 devnull p += s->nrunes;
190 a59ea66f 2003-09-30 devnull while(p<p1 && s){
192 a59ea66f 2003-09-30 devnull * Subtle and important. If we are preparing to handle an 'rdata'
193 a59ea66f 2003-09-30 devnull * call, it's because we have an 'rresize' hole here, so the
194 a59ea66f 2003-09-30 devnull * screen doesn't have data for that space anyway (it got cut
195 a59ea66f 2003-09-30 devnull * first). So pretend it isn't there.
197 a59ea66f 2003-09-30 devnull if(s->text){
198 a59ea66f 2003-09-30 devnull n = s->nrunes-(p0-p);
199 a59ea66f 2003-09-30 devnull if(n>p1-p0) /* all in this section */
200 a59ea66f 2003-09-30 devnull n = p1-p0;
201 a59ea66f 2003-09-30 devnull memmove(scratch+nb, s->text+(p0-p), n*RUNESIZE);
202 a59ea66f 2003-09-30 devnull nb += n;
203 a59ea66f 2003-09-30 devnull scratch[nb] = 0;
205 a59ea66f 2003-09-30 devnull p += s->nrunes;
207 a59ea66f 2003-09-30 devnull s = s->next;
210 a59ea66f 2003-09-30 devnull *nrp = nb;
211 a59ea66f 2003-09-30 devnull return scratch;
215 a59ea66f 2003-09-30 devnull rmissing(Rasp *r, ulong p0, ulong p1)
217 a59ea66f 2003-09-30 devnull Section *s;
219 a59ea66f 2003-09-30 devnull int n, nm=0;
221 a59ea66f 2003-09-30 devnull for(p=0,s=r->sect; s && p+s->nrunes<=p0; s=s->next)
222 a59ea66f 2003-09-30 devnull p += s->nrunes;
223 a59ea66f 2003-09-30 devnull while(p<p1 && s){
224 a59ea66f 2003-09-30 devnull if(s->text == 0){
225 a59ea66f 2003-09-30 devnull n = s->nrunes-(p0-p);
226 a59ea66f 2003-09-30 devnull if(n > p1-p0) /* all in this section */
227 a59ea66f 2003-09-30 devnull n = p1-p0;
228 a59ea66f 2003-09-30 devnull nm += n;
230 a59ea66f 2003-09-30 devnull p += s->nrunes;
232 a59ea66f 2003-09-30 devnull s = s->next;
234 a59ea66f 2003-09-30 devnull return nm;
238 a59ea66f 2003-09-30 devnull rcontig(Rasp *r, ulong p0, ulong p1, int text)
240 a59ea66f 2003-09-30 devnull Section *s;
241 a59ea66f 2003-09-30 devnull long p, n;
242 a59ea66f 2003-09-30 devnull int np=0;
244 a59ea66f 2003-09-30 devnull for(p=0,s=r->sect; s && p+s->nrunes<=p0; s=s->next)
245 a59ea66f 2003-09-30 devnull p += s->nrunes;
246 a59ea66f 2003-09-30 devnull while(p<p1 && s && (text? (s->text!=0) : (s->text==0))){
247 a59ea66f 2003-09-30 devnull n = s->nrunes-(p0-p);
248 a59ea66f 2003-09-30 devnull if(n > p1-p0) /* all in this section */
249 a59ea66f 2003-09-30 devnull n = p1-p0;
250 a59ea66f 2003-09-30 devnull np += n;
251 a59ea66f 2003-09-30 devnull p += s->nrunes;
253 a59ea66f 2003-09-30 devnull s = s->next;
255 a59ea66f 2003-09-30 devnull return np;
259 a59ea66f 2003-09-30 devnull Strgrow(Rune **s, long *n, int want) /* can always toss the old data when called */
261 a59ea66f 2003-09-30 devnull if(*n >= want)
263 a59ea66f 2003-09-30 devnull free(*s);
264 a59ea66f 2003-09-30 devnull *s = alloc(RUNESIZE*want);
265 a59ea66f 2003-09-30 devnull *n = want;