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 "flayer.h"
10 84b1cb73 2003-09-30 devnull #include "samterm.h"
11 84b1cb73 2003-09-30 devnull
12 84b1cb73 2003-09-30 devnull Text cmd;
13 84b1cb73 2003-09-30 devnull Rune *scratch;
14 84b1cb73 2003-09-30 devnull long nscralloc;
15 84b1cb73 2003-09-30 devnull Cursor *cursor;
16 84b1cb73 2003-09-30 devnull Flayer *which = 0;
17 84b1cb73 2003-09-30 devnull Flayer *work = 0;
18 84b1cb73 2003-09-30 devnull long snarflen;
19 84b1cb73 2003-09-30 devnull long typestart = -1;
20 84b1cb73 2003-09-30 devnull long typeend = -1;
21 84b1cb73 2003-09-30 devnull long typeesc = -1;
22 84b1cb73 2003-09-30 devnull long modified = 0; /* strange lookahead for menus */
23 84b1cb73 2003-09-30 devnull char hostlock = 1;
24 84b1cb73 2003-09-30 devnull char hasunlocked = 0;
25 84b1cb73 2003-09-30 devnull int maxtab = 8;
26 17ab31aa 2005-01-27 devnull int chord;
27 17ab31aa 2005-01-27 devnull int autoindent;
28 84b1cb73 2003-09-30 devnull
29 6bc22c7d 2005-01-30 devnull #define chording 0 /* code here for reference but it causes deadlocks */
30 330e487a 2006-02-09 devnull
31 330e487a 2006-02-09 devnull void
32 330e487a 2006-02-09 devnull notifyf(void *a, char *msg)
33 330e487a 2006-02-09 devnull {
34 330e487a 2006-02-09 devnull if(strcmp(msg, "interrupt") == 0)
35 330e487a 2006-02-09 devnull noted(NCONT);
36 330e487a 2006-02-09 devnull noted(NDFLT);
37 330e487a 2006-02-09 devnull }
38 6bc22c7d 2005-01-30 devnull
39 84b1cb73 2003-09-30 devnull void
40 84b1cb73 2003-09-30 devnull threadmain(int argc, char *argv[])
41 84b1cb73 2003-09-30 devnull {
42 17ab31aa 2005-01-27 devnull int i, got, scr, w;
43 84b1cb73 2003-09-30 devnull Text *t;
44 84b1cb73 2003-09-30 devnull Rectangle r;
45 84b1cb73 2003-09-30 devnull Flayer *nwhich;
46 941c9f36 2003-10-11 devnull
47 941c9f36 2003-10-11 devnull /*
48 941c9f36 2003-10-11 devnull * sam is talking to us on fd 0 and 1.
49 941c9f36 2003-10-11 devnull * move these elsewhere so that if we accidentally
50 941c9f36 2003-10-11 devnull * use 0 and 1 in other code, nothing bad happens.
51 941c9f36 2003-10-11 devnull */
52 941c9f36 2003-10-11 devnull dup(0, 3);
53 941c9f36 2003-10-11 devnull dup(1, 4);
54 941c9f36 2003-10-11 devnull hostfd[0] = 3;
55 941c9f36 2003-10-11 devnull hostfd[1] = 4;
56 941c9f36 2003-10-11 devnull close(0);
57 941c9f36 2003-10-11 devnull close(1);
58 941c9f36 2003-10-11 devnull open("/dev/null", OREAD);
59 a19ff5b2 2005-01-07 devnull if(open("/dev/tty", OWRITE) < 0)
60 a19ff5b2 2005-01-07 devnull open("/dev/null", OWRITE);
61 330e487a 2006-02-09 devnull
62 330e487a 2006-02-09 devnull notify(notifyf);
63 84b1cb73 2003-09-30 devnull
64 a19ff5b2 2005-01-07 devnull if(protodebug) print("getscreen\n");
65 84b1cb73 2003-09-30 devnull getscreen(argc, argv);
66 a19ff5b2 2005-01-07 devnull if(protodebug) print("iconinit\n");
67 84b1cb73 2003-09-30 devnull iconinit();
68 a19ff5b2 2005-01-07 devnull if(protodebug) print("initio\n");
69 84b1cb73 2003-09-30 devnull initio();
70 a19ff5b2 2005-01-07 devnull if(protodebug) print("scratch\n");
71 84b1cb73 2003-09-30 devnull scratch = alloc(100*RUNESIZE);
72 84b1cb73 2003-09-30 devnull nscralloc = 100;
73 84b1cb73 2003-09-30 devnull r = screen->r;
74 84b1cb73 2003-09-30 devnull r.max.y = r.min.y+Dy(r)/5;
75 a19ff5b2 2005-01-07 devnull if(protodebug) print("flstart\n");
76 84b1cb73 2003-09-30 devnull flstart(screen->clipr);
77 84b1cb73 2003-09-30 devnull rinit(&cmd.rasp);
78 84b1cb73 2003-09-30 devnull flnew(&cmd.l[0], gettext, 1, &cmd);
79 84b1cb73 2003-09-30 devnull flinit(&cmd.l[0], r, font, cmdcols);
80 84b1cb73 2003-09-30 devnull cmd.nwin = 1;
81 84b1cb73 2003-09-30 devnull which = &cmd.l[0];
82 84b1cb73 2003-09-30 devnull cmd.tag = Untagged;
83 84b1cb73 2003-09-30 devnull outTs(Tversion, VERSION);
84 84b1cb73 2003-09-30 devnull startnewfile(Tstartcmdfile, &cmd);
85 84b1cb73 2003-09-30 devnull
86 84b1cb73 2003-09-30 devnull got = 0;
87 a19ff5b2 2005-01-07 devnull if(protodebug) print("loop\n");
88 84b1cb73 2003-09-30 devnull for(;;got = waitforio()){
89 84b1cb73 2003-09-30 devnull if(hasunlocked && RESIZED())
90 84b1cb73 2003-09-30 devnull resize();
91 84b1cb73 2003-09-30 devnull if(got&(1<<RHost))
92 84b1cb73 2003-09-30 devnull rcv();
93 84b1cb73 2003-09-30 devnull if(got&(1<<RPlumb)){
94 84b1cb73 2003-09-30 devnull for(i=0; cmd.l[i].textfn==0; i++)
95 84b1cb73 2003-09-30 devnull ;
96 84b1cb73 2003-09-30 devnull current(&cmd.l[i]);
97 84b1cb73 2003-09-30 devnull flsetselect(which, cmd.rasp.nrunes, cmd.rasp.nrunes);
98 84b1cb73 2003-09-30 devnull type(which, RPlumb);
99 84b1cb73 2003-09-30 devnull }
100 84b1cb73 2003-09-30 devnull if(got&(1<<RKeyboard))
101 84b1cb73 2003-09-30 devnull if(which)
102 84b1cb73 2003-09-30 devnull type(which, RKeyboard);
103 84b1cb73 2003-09-30 devnull else
104 84b1cb73 2003-09-30 devnull kbdblock();
105 84b1cb73 2003-09-30 devnull if(got&(1<<RMouse)){
106 84b1cb73 2003-09-30 devnull if(hostlock==2 || !ptinrect(mousep->xy, screen->r)){
107 84b1cb73 2003-09-30 devnull mouseunblock();
108 84b1cb73 2003-09-30 devnull continue;
109 84b1cb73 2003-09-30 devnull }
110 84b1cb73 2003-09-30 devnull nwhich = flwhich(mousep->xy);
111 84b1cb73 2003-09-30 devnull scr = which && ptinrect(mousep->xy, which->scroll);
112 84b1cb73 2003-09-30 devnull if(mousep->buttons)
113 84b1cb73 2003-09-30 devnull flushtyping(1);
114 6bc22c7d 2005-01-30 devnull if(chording && chord==1 && !mousep->buttons)
115 17ab31aa 2005-01-27 devnull chord = 0;
116 6bc22c7d 2005-01-30 devnull if(chording && chord)
117 17ab31aa 2005-01-27 devnull chord |= mousep->buttons;
118 17ab31aa 2005-01-27 devnull else if(mousep->buttons&1){
119 84b1cb73 2003-09-30 devnull if(nwhich){
120 84b1cb73 2003-09-30 devnull if(nwhich!=which)
121 84b1cb73 2003-09-30 devnull current(nwhich);
122 84b1cb73 2003-09-30 devnull else if(scr)
123 84b1cb73 2003-09-30 devnull scroll(which, 1);
124 84b1cb73 2003-09-30 devnull else{
125 84b1cb73 2003-09-30 devnull t=(Text *)which->user1;
126 84b1cb73 2003-09-30 devnull if(flselect(which)){
127 84b1cb73 2003-09-30 devnull outTsl(Tdclick, t->tag, which->p0);
128 84b1cb73 2003-09-30 devnull t->lock++;
129 84b1cb73 2003-09-30 devnull }else if(t!=&cmd)
130 84b1cb73 2003-09-30 devnull outcmd();
131 17ab31aa 2005-01-27 devnull if(mousep->buttons&1)
132 17ab31aa 2005-01-27 devnull chord = mousep->buttons;
133 84b1cb73 2003-09-30 devnull }
134 84b1cb73 2003-09-30 devnull }
135 84b1cb73 2003-09-30 devnull }else if((mousep->buttons&2) && which){
136 84b1cb73 2003-09-30 devnull if(scr)
137 84b1cb73 2003-09-30 devnull scroll(which, 2);
138 84b1cb73 2003-09-30 devnull else
139 84b1cb73 2003-09-30 devnull menu2hit();
140 84b1cb73 2003-09-30 devnull }else if((mousep->buttons&4)){
141 84b1cb73 2003-09-30 devnull if(scr)
142 84b1cb73 2003-09-30 devnull scroll(which, 3);
143 84b1cb73 2003-09-30 devnull else
144 84b1cb73 2003-09-30 devnull menu3hit();
145 84b1cb73 2003-09-30 devnull }
146 84b1cb73 2003-09-30 devnull mouseunblock();
147 17ab31aa 2005-01-27 devnull }
148 6bc22c7d 2005-01-30 devnull if(chording && chord){
149 17ab31aa 2005-01-27 devnull t = (Text*)which->user1;
150 17ab31aa 2005-01-27 devnull if(!t->lock && !hostlock){
151 17ab31aa 2005-01-27 devnull w = which-t->l;
152 17ab31aa 2005-01-27 devnull if(chord&2){
153 17ab31aa 2005-01-27 devnull cut(t, w, 1, 1);
154 17ab31aa 2005-01-27 devnull chord &= ~2;
155 17ab31aa 2005-01-27 devnull }else if(chord&4){
156 17ab31aa 2005-01-27 devnull paste(t, w);
157 17ab31aa 2005-01-27 devnull chord &= ~4;
158 17ab31aa 2005-01-27 devnull }
159 17ab31aa 2005-01-27 devnull }
160 84b1cb73 2003-09-30 devnull }
161 84b1cb73 2003-09-30 devnull }
162 84b1cb73 2003-09-30 devnull }
163 84b1cb73 2003-09-30 devnull
164 84b1cb73 2003-09-30 devnull void
165 84b1cb73 2003-09-30 devnull resize(void)
166 84b1cb73 2003-09-30 devnull {
167 84b1cb73 2003-09-30 devnull int i;
168 84b1cb73 2003-09-30 devnull
169 84b1cb73 2003-09-30 devnull flresize(screen->clipr);
170 84b1cb73 2003-09-30 devnull for(i = 0; i<nname; i++)
171 84b1cb73 2003-09-30 devnull if(text[i])
172 84b1cb73 2003-09-30 devnull hcheck(text[i]->tag);
173 84b1cb73 2003-09-30 devnull }
174 84b1cb73 2003-09-30 devnull
175 84b1cb73 2003-09-30 devnull void
176 84b1cb73 2003-09-30 devnull current(Flayer *nw)
177 84b1cb73 2003-09-30 devnull {
178 84b1cb73 2003-09-30 devnull Text *t;
179 84b1cb73 2003-09-30 devnull
180 84b1cb73 2003-09-30 devnull if(which)
181 84b1cb73 2003-09-30 devnull flborder(which, 0);
182 84b1cb73 2003-09-30 devnull if(nw){
183 84b1cb73 2003-09-30 devnull flushtyping(1);
184 84b1cb73 2003-09-30 devnull flupfront(nw);
185 84b1cb73 2003-09-30 devnull flborder(nw, 1);
186 84b1cb73 2003-09-30 devnull buttons(Up);
187 84b1cb73 2003-09-30 devnull t = (Text *)nw->user1;
188 84b1cb73 2003-09-30 devnull t->front = nw-&t->l[0];
189 84b1cb73 2003-09-30 devnull if(t != &cmd)
190 84b1cb73 2003-09-30 devnull work = nw;
191 84b1cb73 2003-09-30 devnull }
192 84b1cb73 2003-09-30 devnull which = nw;
193 84b1cb73 2003-09-30 devnull }
194 84b1cb73 2003-09-30 devnull
195 84b1cb73 2003-09-30 devnull void
196 84b1cb73 2003-09-30 devnull closeup(Flayer *l)
197 84b1cb73 2003-09-30 devnull {
198 84b1cb73 2003-09-30 devnull Text *t=(Text *)l->user1;
199 84b1cb73 2003-09-30 devnull int m;
200 84b1cb73 2003-09-30 devnull
201 84b1cb73 2003-09-30 devnull m = whichmenu(t->tag);
202 84b1cb73 2003-09-30 devnull if(m < 0)
203 84b1cb73 2003-09-30 devnull return;
204 84b1cb73 2003-09-30 devnull flclose(l);
205 84b1cb73 2003-09-30 devnull if(l == which){
206 84b1cb73 2003-09-30 devnull which = 0;
207 84b1cb73 2003-09-30 devnull current(flwhich(Pt(0, 0)));
208 84b1cb73 2003-09-30 devnull }
209 84b1cb73 2003-09-30 devnull if(l == work)
210 84b1cb73 2003-09-30 devnull work = 0;
211 84b1cb73 2003-09-30 devnull if(--t->nwin == 0){
212 84b1cb73 2003-09-30 devnull rclear(&t->rasp);
213 84b1cb73 2003-09-30 devnull free((uchar *)t);
214 84b1cb73 2003-09-30 devnull text[m] = 0;
215 84b1cb73 2003-09-30 devnull }else if(l == &t->l[t->front]){
216 84b1cb73 2003-09-30 devnull for(m=0; m<NL; m++) /* find one; any one will do */
217 84b1cb73 2003-09-30 devnull if(t->l[m].textfn){
218 84b1cb73 2003-09-30 devnull t->front = m;
219 84b1cb73 2003-09-30 devnull return;
220 84b1cb73 2003-09-30 devnull }
221 84b1cb73 2003-09-30 devnull panic("close");
222 84b1cb73 2003-09-30 devnull }
223 84b1cb73 2003-09-30 devnull }
224 84b1cb73 2003-09-30 devnull
225 84b1cb73 2003-09-30 devnull Flayer *
226 84b1cb73 2003-09-30 devnull findl(Text *t)
227 84b1cb73 2003-09-30 devnull {
228 84b1cb73 2003-09-30 devnull int i;
229 84b1cb73 2003-09-30 devnull for(i = 0; i<NL; i++)
230 84b1cb73 2003-09-30 devnull if(t->l[i].textfn==0)
231 84b1cb73 2003-09-30 devnull return &t->l[i];
232 84b1cb73 2003-09-30 devnull return 0;
233 84b1cb73 2003-09-30 devnull }
234 84b1cb73 2003-09-30 devnull
235 84b1cb73 2003-09-30 devnull void
236 84b1cb73 2003-09-30 devnull duplicate(Flayer *l, Rectangle r, Font *f, int close)
237 84b1cb73 2003-09-30 devnull {
238 84b1cb73 2003-09-30 devnull Text *t=(Text *)l->user1;
239 84b1cb73 2003-09-30 devnull Flayer *nl = findl(t);
240 84b1cb73 2003-09-30 devnull Rune *rp;
241 84b1cb73 2003-09-30 devnull ulong n;
242 84b1cb73 2003-09-30 devnull
243 84b1cb73 2003-09-30 devnull if(nl){
244 84b1cb73 2003-09-30 devnull flnew(nl, gettext, l->user0, (char *)t);
245 84b1cb73 2003-09-30 devnull flinit(nl, r, f, l->f.cols);
246 84b1cb73 2003-09-30 devnull nl->origin = l->origin;
247 84b1cb73 2003-09-30 devnull rp = (*l->textfn)(l, l->f.nchars, &n);
248 84b1cb73 2003-09-30 devnull flinsert(nl, rp, rp+n, l->origin);
249 84b1cb73 2003-09-30 devnull flsetselect(nl, l->p0, l->p1);
250 84b1cb73 2003-09-30 devnull if(close){
251 84b1cb73 2003-09-30 devnull flclose(l);
252 84b1cb73 2003-09-30 devnull if(l==which)
253 84b1cb73 2003-09-30 devnull which = 0;
254 84b1cb73 2003-09-30 devnull }else
255 84b1cb73 2003-09-30 devnull t->nwin++;
256 84b1cb73 2003-09-30 devnull current(nl);
257 84b1cb73 2003-09-30 devnull hcheck(t->tag);
258 84b1cb73 2003-09-30 devnull }
259 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
260 84b1cb73 2003-09-30 devnull }
261 84b1cb73 2003-09-30 devnull
262 84b1cb73 2003-09-30 devnull void
263 84b1cb73 2003-09-30 devnull buttons(int updown)
264 84b1cb73 2003-09-30 devnull {
265 84b1cb73 2003-09-30 devnull while(((mousep->buttons&7)!=0) != updown)
266 84b1cb73 2003-09-30 devnull getmouse();
267 84b1cb73 2003-09-30 devnull }
268 84b1cb73 2003-09-30 devnull
269 84b1cb73 2003-09-30 devnull int
270 84b1cb73 2003-09-30 devnull getr(Rectangle *rp)
271 84b1cb73 2003-09-30 devnull {
272 84b1cb73 2003-09-30 devnull Point p;
273 84b1cb73 2003-09-30 devnull Rectangle r;
274 84b1cb73 2003-09-30 devnull
275 84b1cb73 2003-09-30 devnull *rp = getrect(3, mousectl);
276 84b1cb73 2003-09-30 devnull if(rp->max.x && rp->max.x-rp->min.x<=5 && rp->max.y-rp->min.y<=5){
277 84b1cb73 2003-09-30 devnull p = rp->min;
278 84b1cb73 2003-09-30 devnull r = cmd.l[cmd.front].entire;
279 84b1cb73 2003-09-30 devnull *rp = screen->r;
280 84b1cb73 2003-09-30 devnull if(cmd.nwin==1){
281 84b1cb73 2003-09-30 devnull if (p.y <= r.min.y)
282 84b1cb73 2003-09-30 devnull rp->max.y = r.min.y;
283 84b1cb73 2003-09-30 devnull else if (p.y >= r.max.y)
284 84b1cb73 2003-09-30 devnull rp->min.y = r.max.y;
285 84b1cb73 2003-09-30 devnull if (p.x <= r.min.x)
286 84b1cb73 2003-09-30 devnull rp->max.x = r.min.x;
287 84b1cb73 2003-09-30 devnull else if (p.x >= r.max.x)
288 84b1cb73 2003-09-30 devnull rp->min.x = r.max.x;
289 84b1cb73 2003-09-30 devnull }
290 84b1cb73 2003-09-30 devnull }
291 84b1cb73 2003-09-30 devnull return rectclip(rp, screen->r) &&
292 84b1cb73 2003-09-30 devnull rp->max.x-rp->min.x>100 && rp->max.y-rp->min.y>40;
293 84b1cb73 2003-09-30 devnull }
294 84b1cb73 2003-09-30 devnull
295 84b1cb73 2003-09-30 devnull void
296 84b1cb73 2003-09-30 devnull snarf(Text *t, int w)
297 84b1cb73 2003-09-30 devnull {
298 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[w];
299 84b1cb73 2003-09-30 devnull
300 84b1cb73 2003-09-30 devnull if(l->p1>l->p0){
301 84b1cb73 2003-09-30 devnull snarflen = l->p1-l->p0;
302 84b1cb73 2003-09-30 devnull outTsll(Tsnarf, t->tag, l->p0, l->p1);
303 84b1cb73 2003-09-30 devnull }
304 84b1cb73 2003-09-30 devnull }
305 84b1cb73 2003-09-30 devnull
306 84b1cb73 2003-09-30 devnull void
307 84b1cb73 2003-09-30 devnull cut(Text *t, int w, int save, int check)
308 84b1cb73 2003-09-30 devnull {
309 84b1cb73 2003-09-30 devnull long p0, p1;
310 84b1cb73 2003-09-30 devnull Flayer *l;
311 84b1cb73 2003-09-30 devnull
312 84b1cb73 2003-09-30 devnull l = &t->l[w];
313 84b1cb73 2003-09-30 devnull p0 = l->p0;
314 84b1cb73 2003-09-30 devnull p1 = l->p1;
315 84b1cb73 2003-09-30 devnull if(p0 == p1)
316 84b1cb73 2003-09-30 devnull return;
317 84b1cb73 2003-09-30 devnull if(p0 < 0)
318 84b1cb73 2003-09-30 devnull panic("cut");
319 84b1cb73 2003-09-30 devnull if(save)
320 84b1cb73 2003-09-30 devnull snarf(t, w);
321 84b1cb73 2003-09-30 devnull outTsll(Tcut, t->tag, p0, p1);
322 84b1cb73 2003-09-30 devnull flsetselect(l, p0, p0);
323 84b1cb73 2003-09-30 devnull t->lock++;
324 84b1cb73 2003-09-30 devnull hcut(t->tag, p0, p1-p0);
325 84b1cb73 2003-09-30 devnull if(check)
326 84b1cb73 2003-09-30 devnull hcheck(t->tag);
327 84b1cb73 2003-09-30 devnull }
328 84b1cb73 2003-09-30 devnull
329 84b1cb73 2003-09-30 devnull void
330 84b1cb73 2003-09-30 devnull paste(Text *t, int w)
331 84b1cb73 2003-09-30 devnull {
332 84b1cb73 2003-09-30 devnull if(snarflen){
333 84b1cb73 2003-09-30 devnull cut(t, w, 0, 0);
334 84b1cb73 2003-09-30 devnull t->lock++;
335 84b1cb73 2003-09-30 devnull outTsl(Tpaste, t->tag, t->l[w].p0);
336 84b1cb73 2003-09-30 devnull }
337 84b1cb73 2003-09-30 devnull }
338 84b1cb73 2003-09-30 devnull
339 84b1cb73 2003-09-30 devnull void
340 84b1cb73 2003-09-30 devnull scrorigin(Flayer *l, int but, long p0)
341 84b1cb73 2003-09-30 devnull {
342 84b1cb73 2003-09-30 devnull Text *t=(Text *)l->user1;
343 84b1cb73 2003-09-30 devnull
344 84b1cb73 2003-09-30 devnull switch(but){
345 84b1cb73 2003-09-30 devnull case 1:
346 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, l->origin, p0);
347 84b1cb73 2003-09-30 devnull break;
348 84b1cb73 2003-09-30 devnull case 2:
349 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, p0, 1L);
350 84b1cb73 2003-09-30 devnull break;
351 84b1cb73 2003-09-30 devnull case 3:
352 84b1cb73 2003-09-30 devnull horigin(t->tag,p0);
353 84b1cb73 2003-09-30 devnull }
354 84b1cb73 2003-09-30 devnull }
355 84b1cb73 2003-09-30 devnull
356 84b1cb73 2003-09-30 devnull int
357 84b1cb73 2003-09-30 devnull alnum(int c)
358 84b1cb73 2003-09-30 devnull {
359 84b1cb73 2003-09-30 devnull /*
360 84b1cb73 2003-09-30 devnull * Hard to get absolutely right. Use what we know about ASCII
361 84b1cb73 2003-09-30 devnull * and assume anything above the Latin control characters is
362 84b1cb73 2003-09-30 devnull * potentially an alphanumeric.
363 84b1cb73 2003-09-30 devnull */
364 84b1cb73 2003-09-30 devnull if(c<=' ')
365 84b1cb73 2003-09-30 devnull return 0;
366 84b1cb73 2003-09-30 devnull if(0x7F<=c && c<=0xA0)
367 84b1cb73 2003-09-30 devnull return 0;
368 84b1cb73 2003-09-30 devnull if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c))
369 84b1cb73 2003-09-30 devnull return 0;
370 84b1cb73 2003-09-30 devnull return 1;
371 84b1cb73 2003-09-30 devnull }
372 84b1cb73 2003-09-30 devnull
373 84b1cb73 2003-09-30 devnull int
374 84b1cb73 2003-09-30 devnull raspc(Rasp *r, long p)
375 84b1cb73 2003-09-30 devnull {
376 84b1cb73 2003-09-30 devnull ulong n;
377 84b1cb73 2003-09-30 devnull rload(r, p, p+1, &n);
378 84b1cb73 2003-09-30 devnull if(n)
379 84b1cb73 2003-09-30 devnull return scratch[0];
380 84b1cb73 2003-09-30 devnull return 0;
381 84b1cb73 2003-09-30 devnull }
382 84b1cb73 2003-09-30 devnull
383 84b1cb73 2003-09-30 devnull long
384 84b1cb73 2003-09-30 devnull ctlw(Rasp *r, long o, long p)
385 84b1cb73 2003-09-30 devnull {
386 84b1cb73 2003-09-30 devnull int c;
387 84b1cb73 2003-09-30 devnull
388 84b1cb73 2003-09-30 devnull if(--p < o)
389 84b1cb73 2003-09-30 devnull return o;
390 84b1cb73 2003-09-30 devnull if(raspc(r, p)=='\n')
391 84b1cb73 2003-09-30 devnull return p;
392 84b1cb73 2003-09-30 devnull for(; p>=o && !alnum(c=raspc(r, p)); --p)
393 84b1cb73 2003-09-30 devnull if(c=='\n')
394 84b1cb73 2003-09-30 devnull return p+1;
395 84b1cb73 2003-09-30 devnull for(; p>o && alnum(raspc(r, p-1)); --p)
396 84b1cb73 2003-09-30 devnull ;
397 84b1cb73 2003-09-30 devnull return p>=o? p : o;
398 84b1cb73 2003-09-30 devnull }
399 84b1cb73 2003-09-30 devnull
400 84b1cb73 2003-09-30 devnull long
401 84b1cb73 2003-09-30 devnull ctlu(Rasp *r, long o, long p)
402 84b1cb73 2003-09-30 devnull {
403 17f13194 2003-11-23 devnull if(--p < o)
404 17f13194 2003-11-23 devnull return o;
405 17f13194 2003-11-23 devnull if(raspc(r, p)=='\n')
406 17f13194 2003-11-23 devnull return p;
407 84b1cb73 2003-09-30 devnull for(; p-1>=o && raspc(r, p-1)!='\n'; --p)
408 84b1cb73 2003-09-30 devnull ;
409 84b1cb73 2003-09-30 devnull return p>=o? p : o;
410 84b1cb73 2003-09-30 devnull }
411 84b1cb73 2003-09-30 devnull
412 84b1cb73 2003-09-30 devnull int
413 84b1cb73 2003-09-30 devnull center(Flayer *l, long a)
414 84b1cb73 2003-09-30 devnull {
415 84b1cb73 2003-09-30 devnull Text *t;
416 84b1cb73 2003-09-30 devnull
417 84b1cb73 2003-09-30 devnull t = l->user1;
418 84b1cb73 2003-09-30 devnull if(!t->lock && (a<l->origin || l->origin+l->f.nchars<a)){
419 84b1cb73 2003-09-30 devnull if(a > t->rasp.nrunes)
420 84b1cb73 2003-09-30 devnull a = t->rasp.nrunes;
421 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, a, 2L);
422 84b1cb73 2003-09-30 devnull return 1;
423 84b1cb73 2003-09-30 devnull }
424 84b1cb73 2003-09-30 devnull return 0;
425 84b1cb73 2003-09-30 devnull }
426 84b1cb73 2003-09-30 devnull
427 84b1cb73 2003-09-30 devnull int
428 17ab31aa 2005-01-27 devnull thirds(Flayer *l, long a, int n)
429 84b1cb73 2003-09-30 devnull {
430 84b1cb73 2003-09-30 devnull Text *t;
431 84b1cb73 2003-09-30 devnull Rectangle s;
432 84b1cb73 2003-09-30 devnull long lines;
433 84b1cb73 2003-09-30 devnull
434 84b1cb73 2003-09-30 devnull t = l->user1;
435 84b1cb73 2003-09-30 devnull if(!t->lock && (a<l->origin || l->origin+l->f.nchars<a)){
436 84b1cb73 2003-09-30 devnull if(a > t->rasp.nrunes)
437 84b1cb73 2003-09-30 devnull a = t->rasp.nrunes;
438 84b1cb73 2003-09-30 devnull s = insetrect(l->scroll, 1);
439 17ab31aa 2005-01-27 devnull lines = (n*(s.max.y-s.min.y)/l->f.font->height+1)/3;
440 84b1cb73 2003-09-30 devnull if (lines < 2)
441 84b1cb73 2003-09-30 devnull lines = 2;
442 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, a, lines);
443 84b1cb73 2003-09-30 devnull return 1;
444 84b1cb73 2003-09-30 devnull }
445 84b1cb73 2003-09-30 devnull return 0;
446 84b1cb73 2003-09-30 devnull }
447 84b1cb73 2003-09-30 devnull
448 17ab31aa 2005-01-27 devnull int
449 17ab31aa 2005-01-27 devnull onethird(Flayer *l, long a)
450 17ab31aa 2005-01-27 devnull {
451 17ab31aa 2005-01-27 devnull return thirds(l, a, 1);
452 17ab31aa 2005-01-27 devnull }
453 17ab31aa 2005-01-27 devnull
454 17ab31aa 2005-01-27 devnull int
455 17ab31aa 2005-01-27 devnull twothirds(Flayer *l, long a)
456 17ab31aa 2005-01-27 devnull {
457 17ab31aa 2005-01-27 devnull return thirds(l, a, 2);
458 17ab31aa 2005-01-27 devnull }
459 17ab31aa 2005-01-27 devnull
460 84b1cb73 2003-09-30 devnull void
461 84b1cb73 2003-09-30 devnull flushtyping(int clearesc)
462 84b1cb73 2003-09-30 devnull {
463 84b1cb73 2003-09-30 devnull Text *t;
464 84b1cb73 2003-09-30 devnull ulong n;
465 84b1cb73 2003-09-30 devnull
466 84b1cb73 2003-09-30 devnull if(clearesc)
467 fa325e9b 2020-01-10 cross typeesc = -1;
468 84b1cb73 2003-09-30 devnull if(typestart == typeend) {
469 84b1cb73 2003-09-30 devnull modified = 0;
470 84b1cb73 2003-09-30 devnull return;
471 84b1cb73 2003-09-30 devnull }
472 84b1cb73 2003-09-30 devnull t = which->user1;
473 84b1cb73 2003-09-30 devnull if(t != &cmd)
474 84b1cb73 2003-09-30 devnull modified = 1;
475 84b1cb73 2003-09-30 devnull rload(&t->rasp, typestart, typeend, &n);
476 84b1cb73 2003-09-30 devnull scratch[n] = 0;
477 84b1cb73 2003-09-30 devnull if(t==&cmd && typeend==t->rasp.nrunes && scratch[typeend-typestart-1]=='\n'){
478 84b1cb73 2003-09-30 devnull setlock();
479 84b1cb73 2003-09-30 devnull outcmd();
480 84b1cb73 2003-09-30 devnull }
481 84b1cb73 2003-09-30 devnull outTslS(Ttype, t->tag, typestart, scratch);
482 84b1cb73 2003-09-30 devnull typestart = -1;
483 84b1cb73 2003-09-30 devnull typeend = -1;
484 84b1cb73 2003-09-30 devnull }
485 84b1cb73 2003-09-30 devnull
486 84b1cb73 2003-09-30 devnull #define BACKSCROLLKEY Kup
487 6b6159b3 2005-03-18 devnull #define ENDKEY Kend
488 84b1cb73 2003-09-30 devnull #define ESC 0x1B
489 09a5f197 2004-06-09 devnull #define HOMEKEY Khome
490 6b6159b3 2005-03-18 devnull #define LEFTARROW Kleft
491 6b6159b3 2005-03-18 devnull #define LINEEND 0x05
492 6b6159b3 2005-03-18 devnull #define LINESTART 0x01
493 09a5f197 2004-06-09 devnull #define PAGEDOWN Kpgdown
494 6b6159b3 2005-03-18 devnull #define PAGEUP Kpgup
495 6b6159b3 2005-03-18 devnull #define RIGHTARROW Kright
496 6b6159b3 2005-03-18 devnull #define SCROLLKEY Kdown
497 4aad1a32 2009-04-30 rsc #define CUT (Kcmd+'x')
498 4aad1a32 2009-04-30 rsc #define COPY (Kcmd+'c')
499 4aad1a32 2009-04-30 rsc #define PASTE (Kcmd+'v')
500 84b1cb73 2003-09-30 devnull
501 09a5f197 2004-06-09 devnull int
502 8414847a 2004-06-25 devnull nontypingkey(int c)
503 09a5f197 2004-06-09 devnull {
504 6b6159b3 2005-03-18 devnull switch(c){
505 6b6159b3 2005-03-18 devnull case BACKSCROLLKEY:
506 6b6159b3 2005-03-18 devnull case ENDKEY:
507 6b6159b3 2005-03-18 devnull case HOMEKEY:
508 6b6159b3 2005-03-18 devnull case LEFTARROW:
509 6b6159b3 2005-03-18 devnull case LINEEND:
510 6b6159b3 2005-03-18 devnull case LINESTART:
511 6b6159b3 2005-03-18 devnull case PAGEDOWN:
512 6b6159b3 2005-03-18 devnull case PAGEUP:
513 6b6159b3 2005-03-18 devnull case RIGHTARROW:
514 6b6159b3 2005-03-18 devnull case SCROLLKEY:
515 9179fdaa 2019-04-05 rsc case CUT:
516 9179fdaa 2019-04-05 rsc case COPY:
517 fa325e9b 2020-01-10 cross case PASTE:
518 6b6159b3 2005-03-18 devnull return 1;
519 6b6159b3 2005-03-18 devnull }
520 6b6159b3 2005-03-18 devnull return 0;
521 09a5f197 2004-06-09 devnull }
522 09a5f197 2004-06-09 devnull
523 84b1cb73 2003-09-30 devnull void
524 84b1cb73 2003-09-30 devnull type(Flayer *l, int res) /* what a bloody mess this is */
525 84b1cb73 2003-09-30 devnull {
526 84b1cb73 2003-09-30 devnull Text *t = (Text *)l->user1;
527 84b1cb73 2003-09-30 devnull Rune buf[100];
528 84b1cb73 2003-09-30 devnull Rune *p = buf;
529 84b1cb73 2003-09-30 devnull int c, backspacing;
530 84b1cb73 2003-09-30 devnull long a, a0;
531 84b1cb73 2003-09-30 devnull int scrollkey;
532 84b1cb73 2003-09-30 devnull
533 84b1cb73 2003-09-30 devnull scrollkey = 0;
534 84b1cb73 2003-09-30 devnull if(res == RKeyboard)
535 09a5f197 2004-06-09 devnull scrollkey = nontypingkey(qpeekc()); /* ICK */
536 84b1cb73 2003-09-30 devnull
537 84b1cb73 2003-09-30 devnull if(hostlock || t->lock){
538 84b1cb73 2003-09-30 devnull kbdblock();
539 84b1cb73 2003-09-30 devnull return;
540 84b1cb73 2003-09-30 devnull }
541 84b1cb73 2003-09-30 devnull a = l->p0;
542 84b1cb73 2003-09-30 devnull if(a!=l->p1 && !scrollkey){
543 84b1cb73 2003-09-30 devnull flushtyping(1);
544 84b1cb73 2003-09-30 devnull cut(t, t->front, 1, 1);
545 84b1cb73 2003-09-30 devnull return; /* it may now be locked */
546 84b1cb73 2003-09-30 devnull }
547 84b1cb73 2003-09-30 devnull backspacing = 0;
548 84b1cb73 2003-09-30 devnull while((c = kbdchar())>0){
549 84b1cb73 2003-09-30 devnull if(res == RKeyboard){
550 09a5f197 2004-06-09 devnull if(nontypingkey(c) || c==ESC)
551 84b1cb73 2003-09-30 devnull break;
552 84b1cb73 2003-09-30 devnull /* backspace, ctrl-u, ctrl-w, del */
553 84b1cb73 2003-09-30 devnull if(c=='\b' || c==0x15 || c==0x17 || c==0x7F){
554 84b1cb73 2003-09-30 devnull backspacing = 1;
555 84b1cb73 2003-09-30 devnull break;
556 84b1cb73 2003-09-30 devnull }
557 84b1cb73 2003-09-30 devnull }
558 84b1cb73 2003-09-30 devnull *p++ = c;
559 17ab31aa 2005-01-27 devnull if(autoindent)
560 17ab31aa 2005-01-27 devnull if(c == '\n'){
561 17ab31aa 2005-01-27 devnull /* autoindent */
562 17ab31aa 2005-01-27 devnull int cursor, ch;
563 17ab31aa 2005-01-27 devnull cursor = ctlu(&t->rasp, 0, a+(p-buf)-1);
564 17ab31aa 2005-01-27 devnull while(p < buf+nelem(buf)){
565 17ab31aa 2005-01-27 devnull ch = raspc(&t->rasp, cursor++);
566 17ab31aa 2005-01-27 devnull if(ch == ' ' || ch == '\t')
567 17ab31aa 2005-01-27 devnull *p++ = ch;
568 17ab31aa 2005-01-27 devnull else
569 17ab31aa 2005-01-27 devnull break;
570 17ab31aa 2005-01-27 devnull }
571 17ab31aa 2005-01-27 devnull }
572 17ab31aa 2005-01-27 devnull if(c == '\n' || p >= buf+nelem(buf))
573 84b1cb73 2003-09-30 devnull break;
574 84b1cb73 2003-09-30 devnull }
575 84b1cb73 2003-09-30 devnull if(p > buf){
576 84b1cb73 2003-09-30 devnull if(typestart < 0)
577 84b1cb73 2003-09-30 devnull typestart = a;
578 84b1cb73 2003-09-30 devnull if(typeesc < 0)
579 84b1cb73 2003-09-30 devnull typeesc = a;
580 84b1cb73 2003-09-30 devnull hgrow(t->tag, a, p-buf, 0);
581 84b1cb73 2003-09-30 devnull t->lock++; /* pretend we Trequest'ed for hdatarune*/
582 84b1cb73 2003-09-30 devnull hdatarune(t->tag, a, buf, p-buf);
583 84b1cb73 2003-09-30 devnull a += p-buf;
584 84b1cb73 2003-09-30 devnull l->p0 = a;
585 84b1cb73 2003-09-30 devnull l->p1 = a;
586 84b1cb73 2003-09-30 devnull typeend = a;
587 84b1cb73 2003-09-30 devnull if(c=='\n' || typeend-typestart>100)
588 84b1cb73 2003-09-30 devnull flushtyping(0);
589 84b1cb73 2003-09-30 devnull onethird(l, a);
590 84b1cb73 2003-09-30 devnull }
591 09a5f197 2004-06-09 devnull if(c==SCROLLKEY || c==PAGEDOWN){
592 84b1cb73 2003-09-30 devnull flushtyping(0);
593 84b1cb73 2003-09-30 devnull center(l, l->origin+l->f.nchars+1);
594 09a5f197 2004-06-09 devnull }else if(c==BACKSCROLLKEY || c==PAGEUP){
595 84b1cb73 2003-09-30 devnull flushtyping(0);
596 84b1cb73 2003-09-30 devnull a0 = l->origin-l->f.nchars;
597 84b1cb73 2003-09-30 devnull if(a0 < 0)
598 84b1cb73 2003-09-30 devnull a0 = 0;
599 84b1cb73 2003-09-30 devnull center(l, a0);
600 09a5f197 2004-06-09 devnull }else if(c == RIGHTARROW){
601 09a5f197 2004-06-09 devnull flushtyping(0);
602 09a5f197 2004-06-09 devnull a0 = l->p0;
603 09a5f197 2004-06-09 devnull if(a0 < t->rasp.nrunes)
604 09a5f197 2004-06-09 devnull a0++;
605 09a5f197 2004-06-09 devnull flsetselect(l, a0, a0);
606 09a5f197 2004-06-09 devnull center(l, a0);
607 09a5f197 2004-06-09 devnull }else if(c == LEFTARROW){
608 09a5f197 2004-06-09 devnull flushtyping(0);
609 09a5f197 2004-06-09 devnull a0 = l->p0;
610 09a5f197 2004-06-09 devnull if(a0 > 0)
611 09a5f197 2004-06-09 devnull a0--;
612 09a5f197 2004-06-09 devnull flsetselect(l, a0, a0);
613 09a5f197 2004-06-09 devnull center(l, a0);
614 09a5f197 2004-06-09 devnull }else if(c == HOMEKEY){
615 09a5f197 2004-06-09 devnull flushtyping(0);
616 09a5f197 2004-06-09 devnull center(l, 0);
617 09a5f197 2004-06-09 devnull }else if(c == ENDKEY){
618 09a5f197 2004-06-09 devnull flushtyping(0);
619 09a5f197 2004-06-09 devnull center(l, t->rasp.nrunes);
620 6b6159b3 2005-03-18 devnull }else if(c == LINESTART || c == LINEEND){
621 6b6159b3 2005-03-18 devnull flushtyping(1);
622 6b6159b3 2005-03-18 devnull if(c == LINESTART)
623 6b6159b3 2005-03-18 devnull while(a > 0 && raspc(&t->rasp, a-1)!='\n')
624 6b6159b3 2005-03-18 devnull a--;
625 6b6159b3 2005-03-18 devnull else
626 6b6159b3 2005-03-18 devnull while(a < t->rasp.nrunes && raspc(&t->rasp, a)!='\n')
627 6b6159b3 2005-03-18 devnull a++;
628 6b6159b3 2005-03-18 devnull l->p0 = l->p1 = a;
629 6b6159b3 2005-03-18 devnull for(l=t->l; l<&t->l[NL]; l++)
630 6b6159b3 2005-03-18 devnull if(l->textfn)
631 6b6159b3 2005-03-18 devnull flsetselect(l, l->p0, l->p1);
632 84b1cb73 2003-09-30 devnull }else if(backspacing && !hostlock){
633 ac9d504d 2004-06-17 devnull /* backspacing immediately after outcmd(): sorry */
634 84b1cb73 2003-09-30 devnull if(l->f.p0>0 && a>0){
635 84b1cb73 2003-09-30 devnull switch(c){
636 84b1cb73 2003-09-30 devnull case '\b':
637 84b1cb73 2003-09-30 devnull case 0x7F: /* del */
638 84b1cb73 2003-09-30 devnull l->p0 = a-1;
639 84b1cb73 2003-09-30 devnull break;
640 84b1cb73 2003-09-30 devnull case 0x15: /* ctrl-u */
641 84b1cb73 2003-09-30 devnull l->p0 = ctlu(&t->rasp, l->origin, a);
642 84b1cb73 2003-09-30 devnull break;
643 84b1cb73 2003-09-30 devnull case 0x17: /* ctrl-w */
644 84b1cb73 2003-09-30 devnull l->p0 = ctlw(&t->rasp, l->origin, a);
645 84b1cb73 2003-09-30 devnull break;
646 84b1cb73 2003-09-30 devnull }
647 84b1cb73 2003-09-30 devnull l->p1 = a;
648 84b1cb73 2003-09-30 devnull if(l->p1 != l->p0){
649 84b1cb73 2003-09-30 devnull /* cut locally if possible */
650 84b1cb73 2003-09-30 devnull if(typestart<=l->p0 && l->p1<=typeend){
651 84b1cb73 2003-09-30 devnull t->lock++; /* to call hcut */
652 84b1cb73 2003-09-30 devnull hcut(t->tag, l->p0, l->p1-l->p0);
653 84b1cb73 2003-09-30 devnull /* hcheck is local because we know rasp is contiguous */
654 84b1cb73 2003-09-30 devnull hcheck(t->tag);
655 84b1cb73 2003-09-30 devnull }else{
656 84b1cb73 2003-09-30 devnull flushtyping(0);
657 84b1cb73 2003-09-30 devnull cut(t, t->front, 0, 1);
658 84b1cb73 2003-09-30 devnull }
659 84b1cb73 2003-09-30 devnull }
660 84b1cb73 2003-09-30 devnull if(typeesc >= l->p0)
661 84b1cb73 2003-09-30 devnull typeesc = l->p0;
662 84b1cb73 2003-09-30 devnull if(typestart >= 0){
663 84b1cb73 2003-09-30 devnull if(typestart >= l->p0)
664 84b1cb73 2003-09-30 devnull typestart = l->p0;
665 84b1cb73 2003-09-30 devnull typeend = l->p0;
666 84b1cb73 2003-09-30 devnull if(typestart == typeend){
667 84b1cb73 2003-09-30 devnull typestart = -1;
668 84b1cb73 2003-09-30 devnull typeend = -1;
669 84b1cb73 2003-09-30 devnull modified = 0;
670 84b1cb73 2003-09-30 devnull }
671 84b1cb73 2003-09-30 devnull }
672 84b1cb73 2003-09-30 devnull }
673 84b1cb73 2003-09-30 devnull }else{
674 84b1cb73 2003-09-30 devnull if(c==ESC && typeesc>=0){
675 84b1cb73 2003-09-30 devnull l->p0 = typeesc;
676 84b1cb73 2003-09-30 devnull l->p1 = a;
677 84b1cb73 2003-09-30 devnull flushtyping(1);
678 84b1cb73 2003-09-30 devnull }
679 84b1cb73 2003-09-30 devnull for(l=t->l; l<&t->l[NL]; l++)
680 84b1cb73 2003-09-30 devnull if(l->textfn)
681 84b1cb73 2003-09-30 devnull flsetselect(l, l->p0, l->p1);
682 4aad1a32 2009-04-30 rsc switch(c) {
683 4aad1a32 2009-04-30 rsc case CUT:
684 4aad1a32 2009-04-30 rsc flushtyping(0);
685 4aad1a32 2009-04-30 rsc cut(t, t->front, 1, 1);
686 4aad1a32 2009-04-30 rsc break;
687 4aad1a32 2009-04-30 rsc case COPY:
688 4aad1a32 2009-04-30 rsc flushtyping(0);
689 4aad1a32 2009-04-30 rsc snarf(t, t->front);
690 4aad1a32 2009-04-30 rsc break;
691 4aad1a32 2009-04-30 rsc case PASTE:
692 4aad1a32 2009-04-30 rsc flushtyping(0);
693 4aad1a32 2009-04-30 rsc paste(t, t->front);
694 4aad1a32 2009-04-30 rsc break;
695 4aad1a32 2009-04-30 rsc }
696 84b1cb73 2003-09-30 devnull }
697 84b1cb73 2003-09-30 devnull }
698 84b1cb73 2003-09-30 devnull
699 84b1cb73 2003-09-30 devnull
700 84b1cb73 2003-09-30 devnull void
701 84b1cb73 2003-09-30 devnull outcmd(void){
702 84b1cb73 2003-09-30 devnull if(work)
703 84b1cb73 2003-09-30 devnull outTsll(Tworkfile, ((Text *)work->user1)->tag, work->p0, work->p1);
704 84b1cb73 2003-09-30 devnull }
705 84b1cb73 2003-09-30 devnull
706 84b1cb73 2003-09-30 devnull void
707 84b1cb73 2003-09-30 devnull panic(char *s)
708 84b1cb73 2003-09-30 devnull {
709 84b1cb73 2003-09-30 devnull panic1(display, s);
710 84b1cb73 2003-09-30 devnull }
711 84b1cb73 2003-09-30 devnull
712 84b1cb73 2003-09-30 devnull void
713 84b1cb73 2003-09-30 devnull panic1(Display *d, char *s)
714 84b1cb73 2003-09-30 devnull {
715 84b1cb73 2003-09-30 devnull fprint(2, "samterm:panic: ");
716 84b1cb73 2003-09-30 devnull perror(s);
717 84b1cb73 2003-09-30 devnull abort();
718 84b1cb73 2003-09-30 devnull }
719 84b1cb73 2003-09-30 devnull
720 84b1cb73 2003-09-30 devnull Rune*
721 84b1cb73 2003-09-30 devnull gettext(Flayer *l, long n, ulong *np)
722 84b1cb73 2003-09-30 devnull {
723 84b1cb73 2003-09-30 devnull Text *t;
724 84b1cb73 2003-09-30 devnull
725 84b1cb73 2003-09-30 devnull t = l->user1;
726 84b1cb73 2003-09-30 devnull rload(&t->rasp, l->origin, l->origin+n, np);
727 84b1cb73 2003-09-30 devnull return scratch;
728 84b1cb73 2003-09-30 devnull }
729 84b1cb73 2003-09-30 devnull
730 84b1cb73 2003-09-30 devnull long
731 84b1cb73 2003-09-30 devnull scrtotal(Flayer *l)
732 84b1cb73 2003-09-30 devnull {
733 84b1cb73 2003-09-30 devnull return ((Text *)l->user1)->rasp.nrunes;
734 84b1cb73 2003-09-30 devnull }
735 84b1cb73 2003-09-30 devnull
736 84b1cb73 2003-09-30 devnull void*
737 84b1cb73 2003-09-30 devnull alloc(ulong n)
738 84b1cb73 2003-09-30 devnull {
739 84b1cb73 2003-09-30 devnull void *p;
740 84b1cb73 2003-09-30 devnull
741 84b1cb73 2003-09-30 devnull p = malloc(n);
742 84b1cb73 2003-09-30 devnull if(p == 0)
743 84b1cb73 2003-09-30 devnull panic("alloc");
744 84b1cb73 2003-09-30 devnull memset(p, 0, n);
745 84b1cb73 2003-09-30 devnull return p;
746 84b1cb73 2003-09-30 devnull }