Blame


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"
11 a59ea66f 2003-09-30 devnull
12 a59ea66f 2003-09-30 devnull void
13 a59ea66f 2003-09-30 devnull rinit(Rasp *r)
14 a59ea66f 2003-09-30 devnull {
15 a59ea66f 2003-09-30 devnull r->nrunes=0;
16 a59ea66f 2003-09-30 devnull r->sect=0;
17 a59ea66f 2003-09-30 devnull }
18 a59ea66f 2003-09-30 devnull
19 a59ea66f 2003-09-30 devnull void
20 a59ea66f 2003-09-30 devnull rclear(Rasp *r)
21 a59ea66f 2003-09-30 devnull {
22 a59ea66f 2003-09-30 devnull Section *s, *ns;
23 a59ea66f 2003-09-30 devnull
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);
27 a59ea66f 2003-09-30 devnull free(s);
28 a59ea66f 2003-09-30 devnull }
29 a59ea66f 2003-09-30 devnull r->sect = 0;
30 a59ea66f 2003-09-30 devnull }
31 a59ea66f 2003-09-30 devnull
32 a59ea66f 2003-09-30 devnull Section*
33 a59ea66f 2003-09-30 devnull rsinsert(Rasp *r, Section *s) /* insert before s */
34 a59ea66f 2003-09-30 devnull {
35 a59ea66f 2003-09-30 devnull Section *t;
36 a59ea66f 2003-09-30 devnull Section *u;
37 a59ea66f 2003-09-30 devnull
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;
42 a59ea66f 2003-09-30 devnull }else{
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");
46 a59ea66f 2003-09-30 devnull do{
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;
51 a59ea66f 2003-09-30 devnull }
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");
55 a59ea66f 2003-09-30 devnull }
56 a59ea66f 2003-09-30 devnull Return:
57 a59ea66f 2003-09-30 devnull return t;
58 a59ea66f 2003-09-30 devnull }
59 a59ea66f 2003-09-30 devnull
60 a59ea66f 2003-09-30 devnull void
61 a59ea66f 2003-09-30 devnull rsdelete(Rasp *r, Section *s)
62 a59ea66f 2003-09-30 devnull {
63 a59ea66f 2003-09-30 devnull Section *t;
64 a59ea66f 2003-09-30 devnull
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;
70 a59ea66f 2003-09-30 devnull }
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;
74 a59ea66f 2003-09-30 devnull Free:
75 a59ea66f 2003-09-30 devnull if(s->text)
76 a59ea66f 2003-09-30 devnull free(s->text);
77 a59ea66f 2003-09-30 devnull free(s);
78 a59ea66f 2003-09-30 devnull return;
79 a59ea66f 2003-09-30 devnull }
80 a59ea66f 2003-09-30 devnull panic("rsdelete 2");
81 a59ea66f 2003-09-30 devnull }
82 a59ea66f 2003-09-30 devnull
83 a59ea66f 2003-09-30 devnull void
84 a59ea66f 2003-09-30 devnull splitsect(Rasp *r, Section *s, long n0)
85 a59ea66f 2003-09-30 devnull {
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;
91 a59ea66f 2003-09-30 devnull else{
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;
95 a59ea66f 2003-09-30 devnull }
96 a59ea66f 2003-09-30 devnull s->next->nrunes = s->nrunes-n0;
97 a59ea66f 2003-09-30 devnull s->nrunes = n0;
98 a59ea66f 2003-09-30 devnull }
99 a59ea66f 2003-09-30 devnull
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 */
102 a59ea66f 2003-09-30 devnull {
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;
110 a59ea66f 2003-09-30 devnull }
111 a59ea66f 2003-09-30 devnull return s;
112 a59ea66f 2003-09-30 devnull }
113 a59ea66f 2003-09-30 devnull
114 a59ea66f 2003-09-30 devnull void
115 a59ea66f 2003-09-30 devnull rresize(Rasp *r, long a, long old, long new)
116 a59ea66f 2003-09-30 devnull {
117 a59ea66f 2003-09-30 devnull Section *s, *t, *ns;
118 a59ea66f 2003-09-30 devnull
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);
124 a59ea66f 2003-09-30 devnull }
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;
130 a59ea66f 2003-09-30 devnull }
131 a59ea66f 2003-09-30 devnull r->nrunes += new-old;
132 a59ea66f 2003-09-30 devnull }
133 a59ea66f 2003-09-30 devnull
134 a59ea66f 2003-09-30 devnull void
135 a59ea66f 2003-09-30 devnull rdata(Rasp *r, long p0, long p1, Rune *cp)
136 a59ea66f 2003-09-30 devnull {
137 a59ea66f 2003-09-30 devnull Section *s, *t, *ns;
138 a59ea66f 2003-09-30 devnull
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);
146 a59ea66f 2003-09-30 devnull }
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;
153 a59ea66f 2003-09-30 devnull }
154 a59ea66f 2003-09-30 devnull
155 a59ea66f 2003-09-30 devnull void
156 a59ea66f 2003-09-30 devnull rclean(Rasp *r)
157 a59ea66f 2003-09-30 devnull {
158 a59ea66f 2003-09-30 devnull Section *s;
159 a59ea66f 2003-09-30 devnull
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)
164 a59ea66f 2003-09-30 devnull break;
165 a59ea66f 2003-09-30 devnull Strcpy(s->text+s->nrunes, s->next->text);
166 a59ea66f 2003-09-30 devnull }
167 a59ea66f 2003-09-30 devnull s->nrunes += s->next->nrunes;
168 a59ea66f 2003-09-30 devnull rsdelete(r, s->next);
169 a59ea66f 2003-09-30 devnull }
170 a59ea66f 2003-09-30 devnull }
171 a59ea66f 2003-09-30 devnull
172 a59ea66f 2003-09-30 devnull void
173 a59ea66f 2003-09-30 devnull Strcpy(Rune *to, Rune *from)
174 a59ea66f 2003-09-30 devnull {
175 a59ea66f 2003-09-30 devnull do; while(*to++ = *from++);
176 a59ea66f 2003-09-30 devnull }
177 a59ea66f 2003-09-30 devnull
178 a59ea66f 2003-09-30 devnull Rune*
179 a59ea66f 2003-09-30 devnull rload(Rasp *r, ulong p0, ulong p1, ulong *nrp)
180 a59ea66f 2003-09-30 devnull {
181 a59ea66f 2003-09-30 devnull Section *s;
182 a59ea66f 2003-09-30 devnull long p;
183 a59ea66f 2003-09-30 devnull int n, nb;
184 a59ea66f 2003-09-30 devnull
185 a59ea66f 2003-09-30 devnull nb = 0;
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){
191 a59ea66f 2003-09-30 devnull /*
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.
196 a59ea66f 2003-09-30 devnull */
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;
204 a59ea66f 2003-09-30 devnull }
205 a59ea66f 2003-09-30 devnull p += s->nrunes;
206 a59ea66f 2003-09-30 devnull p0 = p;
207 a59ea66f 2003-09-30 devnull s = s->next;
208 a59ea66f 2003-09-30 devnull }
209 a59ea66f 2003-09-30 devnull if(nrp)
210 a59ea66f 2003-09-30 devnull *nrp = nb;
211 a59ea66f 2003-09-30 devnull return scratch;
212 a59ea66f 2003-09-30 devnull }
213 a59ea66f 2003-09-30 devnull
214 a59ea66f 2003-09-30 devnull int
215 a59ea66f 2003-09-30 devnull rmissing(Rasp *r, ulong p0, ulong p1)
216 a59ea66f 2003-09-30 devnull {
217 a59ea66f 2003-09-30 devnull Section *s;
218 a59ea66f 2003-09-30 devnull long p;
219 a59ea66f 2003-09-30 devnull int n, nm=0;
220 a59ea66f 2003-09-30 devnull
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;
229 a59ea66f 2003-09-30 devnull }
230 a59ea66f 2003-09-30 devnull p += s->nrunes;
231 a59ea66f 2003-09-30 devnull p0 = p;
232 a59ea66f 2003-09-30 devnull s = s->next;
233 a59ea66f 2003-09-30 devnull }
234 a59ea66f 2003-09-30 devnull return nm;
235 a59ea66f 2003-09-30 devnull }
236 a59ea66f 2003-09-30 devnull
237 a59ea66f 2003-09-30 devnull int
238 a59ea66f 2003-09-30 devnull rcontig(Rasp *r, ulong p0, ulong p1, int text)
239 a59ea66f 2003-09-30 devnull {
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;
243 a59ea66f 2003-09-30 devnull
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;
252 a59ea66f 2003-09-30 devnull p0 = p;
253 a59ea66f 2003-09-30 devnull s = s->next;
254 a59ea66f 2003-09-30 devnull }
255 a59ea66f 2003-09-30 devnull return np;
256 a59ea66f 2003-09-30 devnull }
257 a59ea66f 2003-09-30 devnull
258 a59ea66f 2003-09-30 devnull void
259 a59ea66f 2003-09-30 devnull Strgrow(Rune **s, long *n, int want) /* can always toss the old data when called */
260 a59ea66f 2003-09-30 devnull {
261 a59ea66f 2003-09-30 devnull if(*n >= want)
262 a59ea66f 2003-09-30 devnull return;
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;
266 a59ea66f 2003-09-30 devnull }