Blame


1 76193d7c 2003-09-30 devnull #include "sam.h"
2 78439d25 2007-01-12 devnull #define DEBUG
3 76193d7c 2003-09-30 devnull Header h;
4 76193d7c 2003-09-30 devnull uchar indata[DATASIZE];
5 76193d7c 2003-09-30 devnull uchar outdata[2*DATASIZE+3]; /* room for overflow message */
6 76193d7c 2003-09-30 devnull uchar *inp;
7 76193d7c 2003-09-30 devnull uchar *outp;
8 76193d7c 2003-09-30 devnull uchar *outmsg = outdata;
9 76193d7c 2003-09-30 devnull Posn cmdpt;
10 76193d7c 2003-09-30 devnull Posn cmdptadv;
11 76193d7c 2003-09-30 devnull Buffer snarfbuf;
12 76193d7c 2003-09-30 devnull int waitack;
13 78439d25 2007-01-12 devnull int outbuffered;
14 76193d7c 2003-09-30 devnull int tversion;
15 76193d7c 2003-09-30 devnull
16 76193d7c 2003-09-30 devnull int inshort(void);
17 2c0f3733 2006-04-20 devnull long inlong(void);
18 2c0f3733 2006-04-20 devnull vlong invlong(void);
19 76193d7c 2003-09-30 devnull int inmesg(Tmesg);
20 2c0f3733 2006-04-20 devnull
21 2c0f3733 2006-04-20 devnull void outshort(int);
22 2c0f3733 2006-04-20 devnull void outlong(long);
23 2c0f3733 2006-04-20 devnull void outvlong(vlong);
24 2c0f3733 2006-04-20 devnull void outcopy(int, void*);
25 2c0f3733 2006-04-20 devnull void outsend(void);
26 2c0f3733 2006-04-20 devnull void outstart(Hmesg);
27 2c0f3733 2006-04-20 devnull
28 76193d7c 2003-09-30 devnull void setgenstr(File*, Posn, Posn);
29 76193d7c 2003-09-30 devnull
30 76193d7c 2003-09-30 devnull #ifdef DEBUG
31 76193d7c 2003-09-30 devnull char *hname[] = {
32 76193d7c 2003-09-30 devnull [Hversion] "Hversion",
33 76193d7c 2003-09-30 devnull [Hbindname] "Hbindname",
34 76193d7c 2003-09-30 devnull [Hcurrent] "Hcurrent",
35 76193d7c 2003-09-30 devnull [Hnewname] "Hnewname",
36 76193d7c 2003-09-30 devnull [Hmovname] "Hmovname",
37 76193d7c 2003-09-30 devnull [Hgrow] "Hgrow",
38 76193d7c 2003-09-30 devnull [Hcheck0] "Hcheck0",
39 76193d7c 2003-09-30 devnull [Hcheck] "Hcheck",
40 76193d7c 2003-09-30 devnull [Hunlock] "Hunlock",
41 76193d7c 2003-09-30 devnull [Hdata] "Hdata",
42 76193d7c 2003-09-30 devnull [Horigin] "Horigin",
43 76193d7c 2003-09-30 devnull [Hunlockfile] "Hunlockfile",
44 76193d7c 2003-09-30 devnull [Hsetdot] "Hsetdot",
45 76193d7c 2003-09-30 devnull [Hgrowdata] "Hgrowdata",
46 76193d7c 2003-09-30 devnull [Hmoveto] "Hmoveto",
47 76193d7c 2003-09-30 devnull [Hclean] "Hclean",
48 76193d7c 2003-09-30 devnull [Hdirty] "Hdirty",
49 76193d7c 2003-09-30 devnull [Hcut] "Hcut",
50 76193d7c 2003-09-30 devnull [Hsetpat] "Hsetpat",
51 76193d7c 2003-09-30 devnull [Hdelname] "Hdelname",
52 76193d7c 2003-09-30 devnull [Hclose] "Hclose",
53 76193d7c 2003-09-30 devnull [Hsetsnarf] "Hsetsnarf",
54 76193d7c 2003-09-30 devnull [Hsnarflen] "Hsnarflen",
55 76193d7c 2003-09-30 devnull [Hack] "Hack",
56 76193d7c 2003-09-30 devnull [Hexit] "Hexit",
57 cbeb0b26 2006-04-01 devnull [Hplumb] "Hplumb"
58 76193d7c 2003-09-30 devnull };
59 76193d7c 2003-09-30 devnull
60 76193d7c 2003-09-30 devnull char *tname[] = {
61 76193d7c 2003-09-30 devnull [Tversion] "Tversion",
62 76193d7c 2003-09-30 devnull [Tstartcmdfile] "Tstartcmdfile",
63 76193d7c 2003-09-30 devnull [Tcheck] "Tcheck",
64 76193d7c 2003-09-30 devnull [Trequest] "Trequest",
65 76193d7c 2003-09-30 devnull [Torigin] "Torigin",
66 76193d7c 2003-09-30 devnull [Tstartfile] "Tstartfile",
67 76193d7c 2003-09-30 devnull [Tworkfile] "Tworkfile",
68 76193d7c 2003-09-30 devnull [Ttype] "Ttype",
69 76193d7c 2003-09-30 devnull [Tcut] "Tcut",
70 76193d7c 2003-09-30 devnull [Tpaste] "Tpaste",
71 76193d7c 2003-09-30 devnull [Tsnarf] "Tsnarf",
72 76193d7c 2003-09-30 devnull [Tstartnewfile] "Tstartnewfile",
73 76193d7c 2003-09-30 devnull [Twrite] "Twrite",
74 76193d7c 2003-09-30 devnull [Tclose] "Tclose",
75 76193d7c 2003-09-30 devnull [Tlook] "Tlook",
76 76193d7c 2003-09-30 devnull [Tsearch] "Tsearch",
77 76193d7c 2003-09-30 devnull [Tsend] "Tsend",
78 76193d7c 2003-09-30 devnull [Tdclick] "Tdclick",
79 76193d7c 2003-09-30 devnull [Tstartsnarf] "Tstartsnarf",
80 76193d7c 2003-09-30 devnull [Tsetsnarf] "Tsetsnarf",
81 76193d7c 2003-09-30 devnull [Tack] "Tack",
82 76193d7c 2003-09-30 devnull [Texit] "Texit",
83 cbeb0b26 2006-04-01 devnull [Tplumb] "Tplumb"
84 76193d7c 2003-09-30 devnull };
85 76193d7c 2003-09-30 devnull
86 76193d7c 2003-09-30 devnull void
87 76193d7c 2003-09-30 devnull journal(int out, char *s)
88 76193d7c 2003-09-30 devnull {
89 76193d7c 2003-09-30 devnull static int fd = 0;
90 76193d7c 2003-09-30 devnull
91 76193d7c 2003-09-30 devnull if(fd <= 0)
92 76193d7c 2003-09-30 devnull fd = create("/tmp/sam.out", 1, 0666L);
93 76193d7c 2003-09-30 devnull fprint(fd, "%s%s\n", out? "out: " : "in: ", s);
94 76193d7c 2003-09-30 devnull }
95 76193d7c 2003-09-30 devnull
96 76193d7c 2003-09-30 devnull void
97 76193d7c 2003-09-30 devnull journaln(int out, long n)
98 76193d7c 2003-09-30 devnull {
99 76193d7c 2003-09-30 devnull char buf[32];
100 76193d7c 2003-09-30 devnull
101 2c0f3733 2006-04-20 devnull snprint(buf, sizeof buf, "%ld", n);
102 76193d7c 2003-09-30 devnull journal(out, buf);
103 76193d7c 2003-09-30 devnull }
104 2c0f3733 2006-04-20 devnull
105 2c0f3733 2006-04-20 devnull void
106 2c0f3733 2006-04-20 devnull journalv(int out, vlong v)
107 2c0f3733 2006-04-20 devnull {
108 2c0f3733 2006-04-20 devnull char buf[32];
109 2c0f3733 2006-04-20 devnull
110 2c0f3733 2006-04-20 devnull snprint(buf, sizeof buf, "%lld", v);
111 2c0f3733 2006-04-20 devnull journal(out, buf);
112 2c0f3733 2006-04-20 devnull }
113 2c0f3733 2006-04-20 devnull
114 76193d7c 2003-09-30 devnull #else
115 76193d7c 2003-09-30 devnull #define journal(a, b)
116 76193d7c 2003-09-30 devnull #define journaln(a, b)
117 76193d7c 2003-09-30 devnull #endif
118 76193d7c 2003-09-30 devnull
119 76193d7c 2003-09-30 devnull int
120 76193d7c 2003-09-30 devnull rcvchar(void){
121 76193d7c 2003-09-30 devnull static uchar buf[64];
122 522b0689 2003-09-30 devnull static int i, nleft = 0;
123 76193d7c 2003-09-30 devnull
124 76193d7c 2003-09-30 devnull if(nleft <= 0){
125 76193d7c 2003-09-30 devnull nleft = read(0, (char *)buf, sizeof buf);
126 76193d7c 2003-09-30 devnull if(nleft <= 0)
127 76193d7c 2003-09-30 devnull return -1;
128 76193d7c 2003-09-30 devnull i = 0;
129 76193d7c 2003-09-30 devnull }
130 76193d7c 2003-09-30 devnull --nleft;
131 76193d7c 2003-09-30 devnull return buf[i++];
132 76193d7c 2003-09-30 devnull }
133 76193d7c 2003-09-30 devnull
134 76193d7c 2003-09-30 devnull int
135 76193d7c 2003-09-30 devnull rcv(void){
136 76193d7c 2003-09-30 devnull int c;
137 522b0689 2003-09-30 devnull static int state = 0;
138 522b0689 2003-09-30 devnull static int count = 0;
139 522b0689 2003-09-30 devnull static int i = 0;
140 76193d7c 2003-09-30 devnull
141 76193d7c 2003-09-30 devnull while((c=rcvchar()) != -1)
142 76193d7c 2003-09-30 devnull switch(state){
143 76193d7c 2003-09-30 devnull case 0:
144 76193d7c 2003-09-30 devnull h.type = c;
145 76193d7c 2003-09-30 devnull state++;
146 76193d7c 2003-09-30 devnull break;
147 76193d7c 2003-09-30 devnull
148 76193d7c 2003-09-30 devnull case 1:
149 76193d7c 2003-09-30 devnull h.count0 = c;
150 76193d7c 2003-09-30 devnull state++;
151 76193d7c 2003-09-30 devnull break;
152 76193d7c 2003-09-30 devnull
153 76193d7c 2003-09-30 devnull case 2:
154 76193d7c 2003-09-30 devnull h.count1 = c;
155 76193d7c 2003-09-30 devnull count = h.count0|(h.count1<<8);
156 76193d7c 2003-09-30 devnull i = 0;
157 76193d7c 2003-09-30 devnull if(count > DATASIZE)
158 76193d7c 2003-09-30 devnull panic("count>DATASIZE");
159 76193d7c 2003-09-30 devnull if(count == 0)
160 76193d7c 2003-09-30 devnull goto zerocount;
161 76193d7c 2003-09-30 devnull state++;
162 76193d7c 2003-09-30 devnull break;
163 76193d7c 2003-09-30 devnull
164 76193d7c 2003-09-30 devnull case 3:
165 76193d7c 2003-09-30 devnull indata[i++] = c;
166 76193d7c 2003-09-30 devnull if(i == count){
167 76193d7c 2003-09-30 devnull zerocount:
168 76193d7c 2003-09-30 devnull indata[i] = 0;
169 76193d7c 2003-09-30 devnull state = count = 0;
170 76193d7c 2003-09-30 devnull return inmesg(h.type);
171 76193d7c 2003-09-30 devnull }
172 76193d7c 2003-09-30 devnull break;
173 76193d7c 2003-09-30 devnull }
174 76193d7c 2003-09-30 devnull return 0;
175 76193d7c 2003-09-30 devnull }
176 76193d7c 2003-09-30 devnull
177 76193d7c 2003-09-30 devnull File *
178 76193d7c 2003-09-30 devnull whichfile(int tag)
179 76193d7c 2003-09-30 devnull {
180 76193d7c 2003-09-30 devnull int i;
181 76193d7c 2003-09-30 devnull
182 76193d7c 2003-09-30 devnull for(i = 0; i<file.nused; i++)
183 76193d7c 2003-09-30 devnull if(file.filepptr[i]->tag==tag)
184 76193d7c 2003-09-30 devnull return file.filepptr[i];
185 76193d7c 2003-09-30 devnull hiccough((char *)0);
186 76193d7c 2003-09-30 devnull return 0;
187 76193d7c 2003-09-30 devnull }
188 76193d7c 2003-09-30 devnull
189 76193d7c 2003-09-30 devnull int
190 76193d7c 2003-09-30 devnull inmesg(Tmesg type)
191 76193d7c 2003-09-30 devnull {
192 76193d7c 2003-09-30 devnull Rune buf[1025];
193 76193d7c 2003-09-30 devnull char cbuf[64];
194 76193d7c 2003-09-30 devnull int i, m;
195 76193d7c 2003-09-30 devnull short s;
196 76193d7c 2003-09-30 devnull long l, l1;
197 2c0f3733 2006-04-20 devnull vlong v;
198 76193d7c 2003-09-30 devnull File *f;
199 76193d7c 2003-09-30 devnull Posn p0, p1, p;
200 76193d7c 2003-09-30 devnull Range r;
201 76193d7c 2003-09-30 devnull String *str;
202 76193d7c 2003-09-30 devnull char *c, *wdir;
203 76193d7c 2003-09-30 devnull Rune *rp;
204 76193d7c 2003-09-30 devnull Plumbmsg *pm;
205 76193d7c 2003-09-30 devnull
206 76193d7c 2003-09-30 devnull if(type > TMAX)
207 76193d7c 2003-09-30 devnull panic("inmesg");
208 76193d7c 2003-09-30 devnull
209 76193d7c 2003-09-30 devnull journal(0, tname[type]);
210 76193d7c 2003-09-30 devnull
211 76193d7c 2003-09-30 devnull inp = indata;
212 76193d7c 2003-09-30 devnull switch(type){
213 76193d7c 2003-09-30 devnull case -1:
214 76193d7c 2003-09-30 devnull panic("rcv error");
215 76193d7c 2003-09-30 devnull
216 76193d7c 2003-09-30 devnull default:
217 76193d7c 2003-09-30 devnull fprint(2, "unknown type %d\n", type);
218 76193d7c 2003-09-30 devnull panic("rcv unknown");
219 76193d7c 2003-09-30 devnull
220 76193d7c 2003-09-30 devnull case Tversion:
221 76193d7c 2003-09-30 devnull tversion = inshort();
222 76193d7c 2003-09-30 devnull journaln(0, tversion);
223 76193d7c 2003-09-30 devnull break;
224 76193d7c 2003-09-30 devnull
225 76193d7c 2003-09-30 devnull case Tstartcmdfile:
226 2c0f3733 2006-04-20 devnull v = invlong(); /* for 64-bit pointers */
227 2c0f3733 2006-04-20 devnull journaln(0, v);
228 76193d7c 2003-09-30 devnull Strdupl(&genstr, samname);
229 76193d7c 2003-09-30 devnull cmd = newfile();
230 76193d7c 2003-09-30 devnull cmd->unread = 0;
231 2c0f3733 2006-04-20 devnull outTsv(Hbindname, cmd->tag, v);
232 76193d7c 2003-09-30 devnull outTs(Hcurrent, cmd->tag);
233 76193d7c 2003-09-30 devnull logsetname(cmd, &genstr);
234 2c0f3733 2006-04-20 devnull cmd->rasp = listalloc('P');
235 76193d7c 2003-09-30 devnull cmd->mod = 0;
236 76193d7c 2003-09-30 devnull if(cmdstr.n){
237 76193d7c 2003-09-30 devnull loginsert(cmd, 0L, cmdstr.s, cmdstr.n);
238 76193d7c 2003-09-30 devnull Strdelete(&cmdstr, 0L, (Posn)cmdstr.n);
239 76193d7c 2003-09-30 devnull }
240 76193d7c 2003-09-30 devnull fileupdate(cmd, FALSE, TRUE);
241 76193d7c 2003-09-30 devnull outT0(Hunlock);
242 76193d7c 2003-09-30 devnull break;
243 76193d7c 2003-09-30 devnull
244 76193d7c 2003-09-30 devnull case Tcheck:
245 76193d7c 2003-09-30 devnull /* go through whichfile to check the tag */
246 76193d7c 2003-09-30 devnull outTs(Hcheck, whichfile(inshort())->tag);
247 76193d7c 2003-09-30 devnull break;
248 76193d7c 2003-09-30 devnull
249 76193d7c 2003-09-30 devnull case Trequest:
250 76193d7c 2003-09-30 devnull f = whichfile(inshort());
251 76193d7c 2003-09-30 devnull p0 = inlong();
252 76193d7c 2003-09-30 devnull p1 = p0+inshort();
253 76193d7c 2003-09-30 devnull journaln(0, p0);
254 76193d7c 2003-09-30 devnull journaln(0, p1-p0);
255 76193d7c 2003-09-30 devnull if(f->unread)
256 76193d7c 2003-09-30 devnull panic("Trequest: unread");
257 522b0689 2003-09-30 devnull if(p1>f->b.nc)
258 522b0689 2003-09-30 devnull p1 = f->b.nc;
259 522b0689 2003-09-30 devnull if(p0>f->b.nc) /* can happen e.g. scrolling during command */
260 522b0689 2003-09-30 devnull p0 = f->b.nc;
261 76193d7c 2003-09-30 devnull if(p0 == p1){
262 76193d7c 2003-09-30 devnull i = 0;
263 76193d7c 2003-09-30 devnull r.p1 = r.p2 = p0;
264 76193d7c 2003-09-30 devnull }else{
265 76193d7c 2003-09-30 devnull r = rdata(f->rasp, p0, p1-p0);
266 76193d7c 2003-09-30 devnull i = r.p2-r.p1;
267 522b0689 2003-09-30 devnull bufread(&f->b, r.p1, buf, i);
268 76193d7c 2003-09-30 devnull }
269 76193d7c 2003-09-30 devnull buf[i]=0;
270 76193d7c 2003-09-30 devnull outTslS(Hdata, f->tag, r.p1, tmprstr(buf, i+1));
271 76193d7c 2003-09-30 devnull break;
272 76193d7c 2003-09-30 devnull
273 76193d7c 2003-09-30 devnull case Torigin:
274 76193d7c 2003-09-30 devnull s = inshort();
275 76193d7c 2003-09-30 devnull l = inlong();
276 76193d7c 2003-09-30 devnull l1 = inlong();
277 76193d7c 2003-09-30 devnull journaln(0, l1);
278 76193d7c 2003-09-30 devnull lookorigin(whichfile(s), l, l1);
279 76193d7c 2003-09-30 devnull break;
280 76193d7c 2003-09-30 devnull
281 76193d7c 2003-09-30 devnull case Tstartfile:
282 76193d7c 2003-09-30 devnull termlocked++;
283 76193d7c 2003-09-30 devnull f = whichfile(inshort());
284 76193d7c 2003-09-30 devnull if(!f->rasp) /* this might be a duplicate message */
285 2c0f3733 2006-04-20 devnull f->rasp = listalloc('P');
286 76193d7c 2003-09-30 devnull current(f);
287 76193d7c 2003-09-30 devnull outTsv(Hbindname, f->tag, invlong()); /* for 64-bit pointers */
288 76193d7c 2003-09-30 devnull outTs(Hcurrent, f->tag);
289 76193d7c 2003-09-30 devnull journaln(0, f->tag);
290 76193d7c 2003-09-30 devnull if(f->unread)
291 76193d7c 2003-09-30 devnull load(f);
292 76193d7c 2003-09-30 devnull else{
293 522b0689 2003-09-30 devnull if(f->b.nc>0){
294 522b0689 2003-09-30 devnull rgrow(f->rasp, 0L, f->b.nc);
295 522b0689 2003-09-30 devnull outTsll(Hgrow, f->tag, 0L, f->b.nc);
296 76193d7c 2003-09-30 devnull }
297 76193d7c 2003-09-30 devnull outTs(Hcheck0, f->tag);
298 76193d7c 2003-09-30 devnull moveto(f, f->dot.r);
299 76193d7c 2003-09-30 devnull }
300 76193d7c 2003-09-30 devnull break;
301 76193d7c 2003-09-30 devnull
302 76193d7c 2003-09-30 devnull case Tworkfile:
303 76193d7c 2003-09-30 devnull i = inshort();
304 76193d7c 2003-09-30 devnull f = whichfile(i);
305 76193d7c 2003-09-30 devnull current(f);
306 76193d7c 2003-09-30 devnull f->dot.r.p1 = inlong();
307 76193d7c 2003-09-30 devnull f->dot.r.p2 = inlong();
308 76193d7c 2003-09-30 devnull f->tdot = f->dot.r;
309 76193d7c 2003-09-30 devnull journaln(0, i);
310 76193d7c 2003-09-30 devnull journaln(0, f->dot.r.p1);
311 76193d7c 2003-09-30 devnull journaln(0, f->dot.r.p2);
312 76193d7c 2003-09-30 devnull break;
313 76193d7c 2003-09-30 devnull
314 76193d7c 2003-09-30 devnull case Ttype:
315 76193d7c 2003-09-30 devnull f = whichfile(inshort());
316 76193d7c 2003-09-30 devnull p0 = inlong();
317 76193d7c 2003-09-30 devnull journaln(0, p0);
318 76193d7c 2003-09-30 devnull journal(0, (char*)inp);
319 76193d7c 2003-09-30 devnull str = tmpcstr((char*)inp);
320 76193d7c 2003-09-30 devnull i = str->n;
321 76193d7c 2003-09-30 devnull loginsert(f, p0, str->s, str->n);
322 76193d7c 2003-09-30 devnull if(fileupdate(f, FALSE, FALSE))
323 76193d7c 2003-09-30 devnull seq++;
324 522b0689 2003-09-30 devnull if(f==cmd && p0==f->b.nc-i && i>0 && str->s[i-1]=='\n'){
325 76193d7c 2003-09-30 devnull freetmpstr(str);
326 76193d7c 2003-09-30 devnull termlocked++;
327 76193d7c 2003-09-30 devnull termcommand();
328 76193d7c 2003-09-30 devnull }else
329 76193d7c 2003-09-30 devnull freetmpstr(str);
330 76193d7c 2003-09-30 devnull f->dot.r.p1 = f->dot.r.p2 = p0+i; /* terminal knows this already */
331 76193d7c 2003-09-30 devnull f->tdot = f->dot.r;
332 76193d7c 2003-09-30 devnull break;
333 76193d7c 2003-09-30 devnull
334 76193d7c 2003-09-30 devnull case Tcut:
335 76193d7c 2003-09-30 devnull f = whichfile(inshort());
336 76193d7c 2003-09-30 devnull p0 = inlong();
337 76193d7c 2003-09-30 devnull p1 = inlong();
338 76193d7c 2003-09-30 devnull journaln(0, p0);
339 76193d7c 2003-09-30 devnull journaln(0, p1);
340 76193d7c 2003-09-30 devnull logdelete(f, p0, p1);
341 76193d7c 2003-09-30 devnull if(fileupdate(f, FALSE, FALSE))
342 76193d7c 2003-09-30 devnull seq++;
343 76193d7c 2003-09-30 devnull f->dot.r.p1 = f->dot.r.p2 = p0;
344 76193d7c 2003-09-30 devnull f->tdot = f->dot.r; /* terminal knows the value of dot already */
345 76193d7c 2003-09-30 devnull break;
346 76193d7c 2003-09-30 devnull
347 76193d7c 2003-09-30 devnull case Tpaste:
348 76193d7c 2003-09-30 devnull f = whichfile(inshort());
349 76193d7c 2003-09-30 devnull p0 = inlong();
350 76193d7c 2003-09-30 devnull journaln(0, p0);
351 76193d7c 2003-09-30 devnull for(l=0; l<snarfbuf.nc; l+=m){
352 76193d7c 2003-09-30 devnull m = snarfbuf.nc-l;
353 76193d7c 2003-09-30 devnull if(m>BLOCKSIZE)
354 76193d7c 2003-09-30 devnull m = BLOCKSIZE;
355 76193d7c 2003-09-30 devnull bufread(&snarfbuf, l, genbuf, m);
356 76193d7c 2003-09-30 devnull loginsert(f, p0, tmprstr(genbuf, m)->s, m);
357 76193d7c 2003-09-30 devnull }
358 76193d7c 2003-09-30 devnull if(fileupdate(f, FALSE, TRUE))
359 76193d7c 2003-09-30 devnull seq++;
360 76193d7c 2003-09-30 devnull f->dot.r.p1 = p0;
361 76193d7c 2003-09-30 devnull f->dot.r.p2 = p0+snarfbuf.nc;
362 76193d7c 2003-09-30 devnull f->tdot.p1 = -1; /* force telldot to tell (arguably a BUG) */
363 76193d7c 2003-09-30 devnull telldot(f);
364 76193d7c 2003-09-30 devnull outTs(Hunlockfile, f->tag);
365 76193d7c 2003-09-30 devnull break;
366 76193d7c 2003-09-30 devnull
367 76193d7c 2003-09-30 devnull case Tsnarf:
368 76193d7c 2003-09-30 devnull i = inshort();
369 76193d7c 2003-09-30 devnull p0 = inlong();
370 76193d7c 2003-09-30 devnull p1 = inlong();
371 76193d7c 2003-09-30 devnull snarf(whichfile(i), p0, p1, &snarfbuf, 0);
372 76193d7c 2003-09-30 devnull break;
373 76193d7c 2003-09-30 devnull
374 76193d7c 2003-09-30 devnull case Tstartnewfile:
375 2c0f3733 2006-04-20 devnull v = invlong();
376 76193d7c 2003-09-30 devnull Strdupl(&genstr, empty);
377 76193d7c 2003-09-30 devnull f = newfile();
378 2c0f3733 2006-04-20 devnull f->rasp = listalloc('P');
379 2c0f3733 2006-04-20 devnull outTsv(Hbindname, f->tag, v);
380 76193d7c 2003-09-30 devnull logsetname(f, &genstr);
381 76193d7c 2003-09-30 devnull outTs(Hcurrent, f->tag);
382 76193d7c 2003-09-30 devnull current(f);
383 76193d7c 2003-09-30 devnull load(f);
384 76193d7c 2003-09-30 devnull break;
385 76193d7c 2003-09-30 devnull
386 76193d7c 2003-09-30 devnull case Twrite:
387 76193d7c 2003-09-30 devnull termlocked++;
388 76193d7c 2003-09-30 devnull i = inshort();
389 76193d7c 2003-09-30 devnull journaln(0, i);
390 76193d7c 2003-09-30 devnull f = whichfile(i);
391 76193d7c 2003-09-30 devnull addr.r.p1 = 0;
392 522b0689 2003-09-30 devnull addr.r.p2 = f->b.nc;
393 76193d7c 2003-09-30 devnull if(f->name.s[0] == 0)
394 76193d7c 2003-09-30 devnull error(Enoname);
395 76193d7c 2003-09-30 devnull Strduplstr(&genstr, &f->name);
396 76193d7c 2003-09-30 devnull writef(f);
397 76193d7c 2003-09-30 devnull break;
398 76193d7c 2003-09-30 devnull
399 76193d7c 2003-09-30 devnull case Tclose:
400 76193d7c 2003-09-30 devnull termlocked++;
401 76193d7c 2003-09-30 devnull i = inshort();
402 76193d7c 2003-09-30 devnull journaln(0, i);
403 76193d7c 2003-09-30 devnull f = whichfile(i);
404 76193d7c 2003-09-30 devnull current(f);
405 76193d7c 2003-09-30 devnull trytoclose(f);
406 76193d7c 2003-09-30 devnull /* if trytoclose fails, will error out */
407 76193d7c 2003-09-30 devnull delete(f);
408 76193d7c 2003-09-30 devnull break;
409 76193d7c 2003-09-30 devnull
410 76193d7c 2003-09-30 devnull case Tlook:
411 76193d7c 2003-09-30 devnull f = whichfile(inshort());
412 76193d7c 2003-09-30 devnull termlocked++;
413 76193d7c 2003-09-30 devnull p0 = inlong();
414 76193d7c 2003-09-30 devnull p1 = inlong();
415 76193d7c 2003-09-30 devnull journaln(0, p0);
416 76193d7c 2003-09-30 devnull journaln(0, p1);
417 76193d7c 2003-09-30 devnull setgenstr(f, p0, p1);
418 76193d7c 2003-09-30 devnull for(l = 0; l<genstr.n; l++){
419 76193d7c 2003-09-30 devnull i = genstr.s[l];
420 611d815b 2005-03-18 devnull if(utfrune(".*+?(|)\\[]^$", i)){
421 611d815b 2005-03-18 devnull str = tmpcstr("\\");
422 611d815b 2005-03-18 devnull Strinsert(&genstr, str, l++);
423 611d815b 2005-03-18 devnull freetmpstr(str);
424 611d815b 2005-03-18 devnull }
425 76193d7c 2003-09-30 devnull }
426 76193d7c 2003-09-30 devnull Straddc(&genstr, '\0');
427 76193d7c 2003-09-30 devnull nextmatch(f, &genstr, p1, 1);
428 76193d7c 2003-09-30 devnull moveto(f, sel.p[0]);
429 76193d7c 2003-09-30 devnull break;
430 76193d7c 2003-09-30 devnull
431 76193d7c 2003-09-30 devnull case Tsearch:
432 76193d7c 2003-09-30 devnull termlocked++;
433 76193d7c 2003-09-30 devnull if(curfile == 0)
434 76193d7c 2003-09-30 devnull error(Enofile);
435 76193d7c 2003-09-30 devnull if(lastpat.s[0] == 0)
436 76193d7c 2003-09-30 devnull panic("Tsearch");
437 76193d7c 2003-09-30 devnull nextmatch(curfile, &lastpat, curfile->dot.r.p2, 1);
438 76193d7c 2003-09-30 devnull moveto(curfile, sel.p[0]);
439 76193d7c 2003-09-30 devnull break;
440 76193d7c 2003-09-30 devnull
441 76193d7c 2003-09-30 devnull case Tsend:
442 76193d7c 2003-09-30 devnull termlocked++;
443 76193d7c 2003-09-30 devnull inshort(); /* ignored */
444 76193d7c 2003-09-30 devnull p0 = inlong();
445 76193d7c 2003-09-30 devnull p1 = inlong();
446 76193d7c 2003-09-30 devnull setgenstr(cmd, p0, p1);
447 76193d7c 2003-09-30 devnull bufreset(&snarfbuf);
448 76193d7c 2003-09-30 devnull bufinsert(&snarfbuf, (Posn)0, genstr.s, genstr.n);
449 76193d7c 2003-09-30 devnull outTl(Hsnarflen, genstr.n);
450 76193d7c 2003-09-30 devnull if(genstr.s[genstr.n-1] != '\n')
451 76193d7c 2003-09-30 devnull Straddc(&genstr, '\n');
452 522b0689 2003-09-30 devnull loginsert(cmd, cmd->b.nc, genstr.s, genstr.n);
453 76193d7c 2003-09-30 devnull fileupdate(cmd, FALSE, TRUE);
454 522b0689 2003-09-30 devnull cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->b.nc;
455 76193d7c 2003-09-30 devnull telldot(cmd);
456 76193d7c 2003-09-30 devnull termcommand();
457 76193d7c 2003-09-30 devnull break;
458 76193d7c 2003-09-30 devnull
459 76193d7c 2003-09-30 devnull case Tdclick:
460 76193d7c 2003-09-30 devnull f = whichfile(inshort());
461 76193d7c 2003-09-30 devnull p1 = inlong();
462 76193d7c 2003-09-30 devnull doubleclick(f, p1);
463 76193d7c 2003-09-30 devnull f->tdot.p1 = f->tdot.p2 = p1;
464 76193d7c 2003-09-30 devnull telldot(f);
465 76193d7c 2003-09-30 devnull outTs(Hunlockfile, f->tag);
466 76193d7c 2003-09-30 devnull break;
467 76193d7c 2003-09-30 devnull
468 76193d7c 2003-09-30 devnull case Tstartsnarf:
469 76193d7c 2003-09-30 devnull if (snarfbuf.nc <= 0) { /* nothing to export */
470 76193d7c 2003-09-30 devnull outTs(Hsetsnarf, 0);
471 76193d7c 2003-09-30 devnull break;
472 76193d7c 2003-09-30 devnull }
473 76193d7c 2003-09-30 devnull c = 0;
474 76193d7c 2003-09-30 devnull i = 0;
475 76193d7c 2003-09-30 devnull m = snarfbuf.nc;
476 76193d7c 2003-09-30 devnull if(m > SNARFSIZE) {
477 76193d7c 2003-09-30 devnull m = SNARFSIZE;
478 76193d7c 2003-09-30 devnull dprint("?warning: snarf buffer truncated\n");
479 76193d7c 2003-09-30 devnull }
480 76193d7c 2003-09-30 devnull rp = malloc(m*sizeof(Rune));
481 76193d7c 2003-09-30 devnull if(rp){
482 76193d7c 2003-09-30 devnull bufread(&snarfbuf, 0, rp, m);
483 76193d7c 2003-09-30 devnull c = Strtoc(tmprstr(rp, m));
484 76193d7c 2003-09-30 devnull free(rp);
485 76193d7c 2003-09-30 devnull i = strlen(c);
486 76193d7c 2003-09-30 devnull }
487 76193d7c 2003-09-30 devnull outTs(Hsetsnarf, i);
488 76193d7c 2003-09-30 devnull if(c){
489 76193d7c 2003-09-30 devnull Write(1, c, i);
490 76193d7c 2003-09-30 devnull free(c);
491 76193d7c 2003-09-30 devnull } else
492 76193d7c 2003-09-30 devnull dprint("snarf buffer too long\n");
493 76193d7c 2003-09-30 devnull break;
494 76193d7c 2003-09-30 devnull
495 76193d7c 2003-09-30 devnull case Tsetsnarf:
496 76193d7c 2003-09-30 devnull m = inshort();
497 76193d7c 2003-09-30 devnull if(m > SNARFSIZE)
498 76193d7c 2003-09-30 devnull error(Etoolong);
499 76193d7c 2003-09-30 devnull c = malloc(m+1);
500 76193d7c 2003-09-30 devnull if(c){
501 76193d7c 2003-09-30 devnull for(i=0; i<m; i++)
502 76193d7c 2003-09-30 devnull c[i] = rcvchar();
503 76193d7c 2003-09-30 devnull c[m] = 0;
504 76193d7c 2003-09-30 devnull str = tmpcstr(c);
505 76193d7c 2003-09-30 devnull free(c);
506 76193d7c 2003-09-30 devnull bufreset(&snarfbuf);
507 76193d7c 2003-09-30 devnull bufinsert(&snarfbuf, (Posn)0, str->s, str->n);
508 76193d7c 2003-09-30 devnull freetmpstr(str);
509 76193d7c 2003-09-30 devnull outT0(Hunlock);
510 76193d7c 2003-09-30 devnull }
511 76193d7c 2003-09-30 devnull break;
512 76193d7c 2003-09-30 devnull
513 76193d7c 2003-09-30 devnull case Tack:
514 76193d7c 2003-09-30 devnull waitack = 0;
515 76193d7c 2003-09-30 devnull break;
516 76193d7c 2003-09-30 devnull
517 76193d7c 2003-09-30 devnull case Tplumb:
518 76193d7c 2003-09-30 devnull f = whichfile(inshort());
519 76193d7c 2003-09-30 devnull p0 = inlong();
520 76193d7c 2003-09-30 devnull p1 = inlong();
521 76193d7c 2003-09-30 devnull pm = emalloc(sizeof(Plumbmsg));
522 76193d7c 2003-09-30 devnull pm->src = strdup("sam");
523 76193d7c 2003-09-30 devnull pm->dst = 0;
524 76193d7c 2003-09-30 devnull /* construct current directory */
525 76193d7c 2003-09-30 devnull c = Strtoc(&f->name);
526 76193d7c 2003-09-30 devnull if(c[0] == '/')
527 76193d7c 2003-09-30 devnull pm->wdir = c;
528 76193d7c 2003-09-30 devnull else{
529 76193d7c 2003-09-30 devnull wdir = emalloc(1024);
530 76193d7c 2003-09-30 devnull getwd(wdir, 1024);
531 76193d7c 2003-09-30 devnull pm->wdir = emalloc(1024);
532 76193d7c 2003-09-30 devnull snprint(pm->wdir, 1024, "%s/%s", wdir, c);
533 76193d7c 2003-09-30 devnull cleanname(pm->wdir);
534 76193d7c 2003-09-30 devnull free(wdir);
535 76193d7c 2003-09-30 devnull free(c);
536 76193d7c 2003-09-30 devnull }
537 76193d7c 2003-09-30 devnull c = strrchr(pm->wdir, '/');
538 76193d7c 2003-09-30 devnull if(c)
539 76193d7c 2003-09-30 devnull *c = '\0';
540 76193d7c 2003-09-30 devnull pm->type = strdup("text");
541 76193d7c 2003-09-30 devnull if(p1 > p0)
542 76193d7c 2003-09-30 devnull pm->attr = nil;
543 76193d7c 2003-09-30 devnull else{
544 76193d7c 2003-09-30 devnull p = p0;
545 76193d7c 2003-09-30 devnull while(p0>0 && (i=filereadc(f, p0 - 1))!=' ' && i!='\t' && i!='\n')
546 76193d7c 2003-09-30 devnull p0--;
547 522b0689 2003-09-30 devnull while(p1<f->b.nc && (i=filereadc(f, p1))!=' ' && i!='\t' && i!='\n')
548 76193d7c 2003-09-30 devnull p1++;
549 76193d7c 2003-09-30 devnull sprint(cbuf, "click=%ld", p-p0);
550 76193d7c 2003-09-30 devnull pm->attr = plumbunpackattr(cbuf);
551 76193d7c 2003-09-30 devnull }
552 76193d7c 2003-09-30 devnull if(p0==p1 || p1-p0>=BLOCKSIZE){
553 76193d7c 2003-09-30 devnull plumbfree(pm);
554 76193d7c 2003-09-30 devnull break;
555 76193d7c 2003-09-30 devnull }
556 76193d7c 2003-09-30 devnull setgenstr(f, p0, p1);
557 76193d7c 2003-09-30 devnull pm->data = Strtoc(&genstr);
558 76193d7c 2003-09-30 devnull pm->ndata = strlen(pm->data);
559 76193d7c 2003-09-30 devnull c = plumbpack(pm, &i);
560 76193d7c 2003-09-30 devnull if(c != 0){
561 76193d7c 2003-09-30 devnull outTs(Hplumb, i);
562 76193d7c 2003-09-30 devnull Write(1, c, i);
563 76193d7c 2003-09-30 devnull free(c);
564 76193d7c 2003-09-30 devnull }
565 76193d7c 2003-09-30 devnull plumbfree(pm);
566 76193d7c 2003-09-30 devnull break;
567 76193d7c 2003-09-30 devnull
568 76193d7c 2003-09-30 devnull case Texit:
569 76193d7c 2003-09-30 devnull exits(0);
570 76193d7c 2003-09-30 devnull }
571 76193d7c 2003-09-30 devnull return TRUE;
572 76193d7c 2003-09-30 devnull }
573 76193d7c 2003-09-30 devnull
574 76193d7c 2003-09-30 devnull void
575 76193d7c 2003-09-30 devnull snarf(File *f, Posn p1, Posn p2, Buffer *buf, int emptyok)
576 76193d7c 2003-09-30 devnull {
577 76193d7c 2003-09-30 devnull Posn l;
578 76193d7c 2003-09-30 devnull int i;
579 76193d7c 2003-09-30 devnull
580 76193d7c 2003-09-30 devnull if(!emptyok && p1==p2)
581 76193d7c 2003-09-30 devnull return;
582 76193d7c 2003-09-30 devnull bufreset(buf);
583 76193d7c 2003-09-30 devnull /* Stage through genbuf to avoid compaction problems (vestigial) */
584 522b0689 2003-09-30 devnull if(p2 > f->b.nc){
585 522b0689 2003-09-30 devnull fprint(2, "bad snarf addr p1=%ld p2=%ld f->b.nc=%d\n", p1, p2, f->b.nc); /*ZZZ should never happen, can remove */
586 522b0689 2003-09-30 devnull p2 = f->b.nc;
587 76193d7c 2003-09-30 devnull }
588 76193d7c 2003-09-30 devnull for(l=p1; l<p2; l+=i){
589 76193d7c 2003-09-30 devnull i = p2-l>BLOCKSIZE? BLOCKSIZE : p2-l;
590 522b0689 2003-09-30 devnull bufread(&f->b, l, genbuf, i);
591 76193d7c 2003-09-30 devnull bufinsert(buf, buf->nc, tmprstr(genbuf, i)->s, i);
592 76193d7c 2003-09-30 devnull }
593 76193d7c 2003-09-30 devnull }
594 76193d7c 2003-09-30 devnull
595 76193d7c 2003-09-30 devnull int
596 76193d7c 2003-09-30 devnull inshort(void)
597 76193d7c 2003-09-30 devnull {
598 76193d7c 2003-09-30 devnull ushort n;
599 76193d7c 2003-09-30 devnull
600 76193d7c 2003-09-30 devnull n = inp[0] | (inp[1]<<8);
601 76193d7c 2003-09-30 devnull inp += 2;
602 76193d7c 2003-09-30 devnull return n;
603 76193d7c 2003-09-30 devnull }
604 76193d7c 2003-09-30 devnull
605 76193d7c 2003-09-30 devnull long
606 76193d7c 2003-09-30 devnull inlong(void)
607 76193d7c 2003-09-30 devnull {
608 76193d7c 2003-09-30 devnull ulong n;
609 76193d7c 2003-09-30 devnull
610 76193d7c 2003-09-30 devnull n = inp[0] | (inp[1]<<8) | (inp[2]<<16) | (inp[3]<<24);
611 76193d7c 2003-09-30 devnull inp += 4;
612 76193d7c 2003-09-30 devnull return n;
613 76193d7c 2003-09-30 devnull }
614 76193d7c 2003-09-30 devnull
615 2c0f3733 2006-04-20 devnull vlong
616 76193d7c 2003-09-30 devnull invlong(void)
617 76193d7c 2003-09-30 devnull {
618 2c0f3733 2006-04-20 devnull vlong v;
619 2c0f3733 2006-04-20 devnull
620 2c0f3733 2006-04-20 devnull v = (inp[7]<<24) | (inp[6]<<16) | (inp[5]<<8) | inp[4];
621 2c0f3733 2006-04-20 devnull v = (v<<16) | (inp[3]<<8) | inp[2];
622 2c0f3733 2006-04-20 devnull v = (v<<16) | (inp[1]<<8) | inp[0];
623 76193d7c 2003-09-30 devnull inp += 8;
624 2c0f3733 2006-04-20 devnull return v;
625 76193d7c 2003-09-30 devnull }
626 76193d7c 2003-09-30 devnull
627 76193d7c 2003-09-30 devnull void
628 76193d7c 2003-09-30 devnull setgenstr(File *f, Posn p0, Posn p1)
629 76193d7c 2003-09-30 devnull {
630 76193d7c 2003-09-30 devnull if(p0 != p1){
631 76193d7c 2003-09-30 devnull if(p1-p0 >= TBLOCKSIZE)
632 76193d7c 2003-09-30 devnull error(Etoolong);
633 76193d7c 2003-09-30 devnull Strinsure(&genstr, p1-p0);
634 522b0689 2003-09-30 devnull bufread(&f->b, p0, genbuf, p1-p0);
635 76193d7c 2003-09-30 devnull memmove(genstr.s, genbuf, RUNESIZE*(p1-p0));
636 76193d7c 2003-09-30 devnull genstr.n = p1-p0;
637 76193d7c 2003-09-30 devnull }else{
638 76193d7c 2003-09-30 devnull if(snarfbuf.nc == 0)
639 76193d7c 2003-09-30 devnull error(Eempty);
640 76193d7c 2003-09-30 devnull if(snarfbuf.nc > TBLOCKSIZE)
641 76193d7c 2003-09-30 devnull error(Etoolong);
642 76193d7c 2003-09-30 devnull bufread(&snarfbuf, (Posn)0, genbuf, snarfbuf.nc);
643 76193d7c 2003-09-30 devnull Strinsure(&genstr, snarfbuf.nc);
644 76193d7c 2003-09-30 devnull memmove(genstr.s, genbuf, RUNESIZE*snarfbuf.nc);
645 76193d7c 2003-09-30 devnull genstr.n = snarfbuf.nc;
646 76193d7c 2003-09-30 devnull }
647 76193d7c 2003-09-30 devnull }
648 76193d7c 2003-09-30 devnull
649 76193d7c 2003-09-30 devnull void
650 76193d7c 2003-09-30 devnull outT0(Hmesg type)
651 76193d7c 2003-09-30 devnull {
652 76193d7c 2003-09-30 devnull outstart(type);
653 76193d7c 2003-09-30 devnull outsend();
654 76193d7c 2003-09-30 devnull }
655 76193d7c 2003-09-30 devnull
656 76193d7c 2003-09-30 devnull void
657 76193d7c 2003-09-30 devnull outTl(Hmesg type, long l)
658 76193d7c 2003-09-30 devnull {
659 76193d7c 2003-09-30 devnull outstart(type);
660 76193d7c 2003-09-30 devnull outlong(l);
661 76193d7c 2003-09-30 devnull outsend();
662 76193d7c 2003-09-30 devnull }
663 76193d7c 2003-09-30 devnull
664 76193d7c 2003-09-30 devnull void
665 76193d7c 2003-09-30 devnull outTs(Hmesg type, int s)
666 76193d7c 2003-09-30 devnull {
667 76193d7c 2003-09-30 devnull outstart(type);
668 76193d7c 2003-09-30 devnull journaln(1, s);
669 76193d7c 2003-09-30 devnull outshort(s);
670 76193d7c 2003-09-30 devnull outsend();
671 76193d7c 2003-09-30 devnull }
672 76193d7c 2003-09-30 devnull
673 76193d7c 2003-09-30 devnull void
674 76193d7c 2003-09-30 devnull outS(String *s)
675 76193d7c 2003-09-30 devnull {
676 76193d7c 2003-09-30 devnull char *c;
677 76193d7c 2003-09-30 devnull int i;
678 76193d7c 2003-09-30 devnull
679 76193d7c 2003-09-30 devnull c = Strtoc(s);
680 76193d7c 2003-09-30 devnull i = strlen(c);
681 76193d7c 2003-09-30 devnull outcopy(i, c);
682 76193d7c 2003-09-30 devnull if(i > 99)
683 76193d7c 2003-09-30 devnull c[99] = 0;
684 76193d7c 2003-09-30 devnull journaln(1, i);
685 76193d7c 2003-09-30 devnull journal(1, c);
686 76193d7c 2003-09-30 devnull free(c);
687 76193d7c 2003-09-30 devnull }
688 76193d7c 2003-09-30 devnull
689 76193d7c 2003-09-30 devnull void
690 76193d7c 2003-09-30 devnull outTsS(Hmesg type, int s1, String *s)
691 76193d7c 2003-09-30 devnull {
692 76193d7c 2003-09-30 devnull outstart(type);
693 76193d7c 2003-09-30 devnull outshort(s1);
694 76193d7c 2003-09-30 devnull outS(s);
695 76193d7c 2003-09-30 devnull outsend();
696 76193d7c 2003-09-30 devnull }
697 76193d7c 2003-09-30 devnull
698 76193d7c 2003-09-30 devnull void
699 76193d7c 2003-09-30 devnull outTslS(Hmesg type, int s1, Posn l1, String *s)
700 76193d7c 2003-09-30 devnull {
701 76193d7c 2003-09-30 devnull outstart(type);
702 76193d7c 2003-09-30 devnull outshort(s1);
703 76193d7c 2003-09-30 devnull journaln(1, s1);
704 76193d7c 2003-09-30 devnull outlong(l1);
705 76193d7c 2003-09-30 devnull journaln(1, l1);
706 76193d7c 2003-09-30 devnull outS(s);
707 76193d7c 2003-09-30 devnull outsend();
708 76193d7c 2003-09-30 devnull }
709 76193d7c 2003-09-30 devnull
710 76193d7c 2003-09-30 devnull void
711 76193d7c 2003-09-30 devnull outTS(Hmesg type, String *s)
712 76193d7c 2003-09-30 devnull {
713 76193d7c 2003-09-30 devnull outstart(type);
714 76193d7c 2003-09-30 devnull outS(s);
715 76193d7c 2003-09-30 devnull outsend();
716 76193d7c 2003-09-30 devnull }
717 76193d7c 2003-09-30 devnull
718 76193d7c 2003-09-30 devnull void
719 76193d7c 2003-09-30 devnull outTsllS(Hmesg type, int s1, Posn l1, Posn l2, String *s)
720 76193d7c 2003-09-30 devnull {
721 76193d7c 2003-09-30 devnull outstart(type);
722 76193d7c 2003-09-30 devnull outshort(s1);
723 76193d7c 2003-09-30 devnull outlong(l1);
724 76193d7c 2003-09-30 devnull outlong(l2);
725 76193d7c 2003-09-30 devnull journaln(1, l1);
726 76193d7c 2003-09-30 devnull journaln(1, l2);
727 76193d7c 2003-09-30 devnull outS(s);
728 76193d7c 2003-09-30 devnull outsend();
729 76193d7c 2003-09-30 devnull }
730 76193d7c 2003-09-30 devnull
731 76193d7c 2003-09-30 devnull void
732 76193d7c 2003-09-30 devnull outTsll(Hmesg type, int s, Posn l1, Posn l2)
733 76193d7c 2003-09-30 devnull {
734 76193d7c 2003-09-30 devnull outstart(type);
735 76193d7c 2003-09-30 devnull outshort(s);
736 76193d7c 2003-09-30 devnull outlong(l1);
737 76193d7c 2003-09-30 devnull outlong(l2);
738 76193d7c 2003-09-30 devnull journaln(1, l1);
739 76193d7c 2003-09-30 devnull journaln(1, l2);
740 76193d7c 2003-09-30 devnull outsend();
741 76193d7c 2003-09-30 devnull }
742 76193d7c 2003-09-30 devnull
743 76193d7c 2003-09-30 devnull void
744 76193d7c 2003-09-30 devnull outTsl(Hmesg type, int s, Posn l)
745 76193d7c 2003-09-30 devnull {
746 76193d7c 2003-09-30 devnull outstart(type);
747 76193d7c 2003-09-30 devnull outshort(s);
748 76193d7c 2003-09-30 devnull outlong(l);
749 76193d7c 2003-09-30 devnull journaln(1, l);
750 76193d7c 2003-09-30 devnull outsend();
751 76193d7c 2003-09-30 devnull }
752 76193d7c 2003-09-30 devnull
753 76193d7c 2003-09-30 devnull void
754 2c0f3733 2006-04-20 devnull outTsv(Hmesg type, int s, vlong v)
755 76193d7c 2003-09-30 devnull {
756 76193d7c 2003-09-30 devnull outstart(type);
757 76193d7c 2003-09-30 devnull outshort(s);
758 2c0f3733 2006-04-20 devnull outvlong(v);
759 2c0f3733 2006-04-20 devnull journaln(1, v);
760 76193d7c 2003-09-30 devnull outsend();
761 76193d7c 2003-09-30 devnull }
762 76193d7c 2003-09-30 devnull
763 76193d7c 2003-09-30 devnull void
764 76193d7c 2003-09-30 devnull outstart(Hmesg type)
765 76193d7c 2003-09-30 devnull {
766 76193d7c 2003-09-30 devnull journal(1, hname[type]);
767 76193d7c 2003-09-30 devnull outmsg[0] = type;
768 76193d7c 2003-09-30 devnull outp = outmsg+3;
769 76193d7c 2003-09-30 devnull }
770 76193d7c 2003-09-30 devnull
771 76193d7c 2003-09-30 devnull void
772 76193d7c 2003-09-30 devnull outcopy(int count, void *data)
773 76193d7c 2003-09-30 devnull {
774 76193d7c 2003-09-30 devnull memmove(outp, data, count);
775 76193d7c 2003-09-30 devnull outp += count;
776 76193d7c 2003-09-30 devnull }
777 76193d7c 2003-09-30 devnull
778 76193d7c 2003-09-30 devnull void
779 76193d7c 2003-09-30 devnull outshort(int s)
780 76193d7c 2003-09-30 devnull {
781 76193d7c 2003-09-30 devnull *outp++ = s;
782 76193d7c 2003-09-30 devnull *outp++ = s>>8;
783 76193d7c 2003-09-30 devnull }
784 76193d7c 2003-09-30 devnull
785 76193d7c 2003-09-30 devnull void
786 76193d7c 2003-09-30 devnull outlong(long l)
787 76193d7c 2003-09-30 devnull {
788 76193d7c 2003-09-30 devnull *outp++ = l;
789 76193d7c 2003-09-30 devnull *outp++ = l>>8;
790 76193d7c 2003-09-30 devnull *outp++ = l>>16;
791 76193d7c 2003-09-30 devnull *outp++ = l>>24;
792 76193d7c 2003-09-30 devnull }
793 76193d7c 2003-09-30 devnull
794 76193d7c 2003-09-30 devnull void
795 2c0f3733 2006-04-20 devnull outvlong(vlong v)
796 76193d7c 2003-09-30 devnull {
797 76193d7c 2003-09-30 devnull int i;
798 76193d7c 2003-09-30 devnull
799 2c0f3733 2006-04-20 devnull for(i = 0; i < 8; i++){
800 2c0f3733 2006-04-20 devnull *outp++ = v;
801 2c0f3733 2006-04-20 devnull v >>= 8;
802 2c0f3733 2006-04-20 devnull }
803 76193d7c 2003-09-30 devnull }
804 76193d7c 2003-09-30 devnull
805 76193d7c 2003-09-30 devnull void
806 76193d7c 2003-09-30 devnull outsend(void)
807 76193d7c 2003-09-30 devnull {
808 76193d7c 2003-09-30 devnull int outcount;
809 76193d7c 2003-09-30 devnull
810 78439d25 2007-01-12 devnull if(outp >= outdata+nelem(outdata))
811 78439d25 2007-01-12 devnull panic("outsend");
812 76193d7c 2003-09-30 devnull outcount = outp-outmsg;
813 76193d7c 2003-09-30 devnull outcount -= 3;
814 76193d7c 2003-09-30 devnull outmsg[1] = outcount;
815 76193d7c 2003-09-30 devnull outmsg[2] = outcount>>8;
816 76193d7c 2003-09-30 devnull outmsg = outp;
817 78439d25 2007-01-12 devnull if(!outbuffered){
818 76193d7c 2003-09-30 devnull outcount = outmsg-outdata;
819 76193d7c 2003-09-30 devnull if (write(1, (char*) outdata, outcount) != outcount)
820 76193d7c 2003-09-30 devnull rescue();
821 76193d7c 2003-09-30 devnull outmsg = outdata;
822 76193d7c 2003-09-30 devnull return;
823 76193d7c 2003-09-30 devnull }
824 76193d7c 2003-09-30 devnull }
825 76193d7c 2003-09-30 devnull
826 78439d25 2007-01-12 devnull int
827 78439d25 2007-01-12 devnull needoutflush(void)
828 78439d25 2007-01-12 devnull {
829 7103ceb0 2007-01-12 devnull return outmsg >= outdata+DATASIZE;
830 78439d25 2007-01-12 devnull }
831 78439d25 2007-01-12 devnull
832 76193d7c 2003-09-30 devnull void
833 76193d7c 2003-09-30 devnull outflush(void)
834 76193d7c 2003-09-30 devnull {
835 76193d7c 2003-09-30 devnull if(outmsg == outdata)
836 76193d7c 2003-09-30 devnull return;
837 78439d25 2007-01-12 devnull outbuffered = 0;
838 7103ceb0 2007-01-12 devnull /* flow control */
839 76193d7c 2003-09-30 devnull outT0(Hack);
840 76193d7c 2003-09-30 devnull waitack = 1;
841 76193d7c 2003-09-30 devnull do
842 76193d7c 2003-09-30 devnull if(rcv() == 0){
843 76193d7c 2003-09-30 devnull rescue();
844 76193d7c 2003-09-30 devnull exits("eof");
845 76193d7c 2003-09-30 devnull }
846 76193d7c 2003-09-30 devnull while(waitack);
847 76193d7c 2003-09-30 devnull outmsg = outdata;
848 78439d25 2007-01-12 devnull outbuffered = 1;
849 76193d7c 2003-09-30 devnull }