|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 26880 (0x6900)
Types: TextFile
Names: »cc «
└─⟦cde9d517b⟧ Bits:30007477 RC8000 Backup tape fra HT's bus-radio system
└─⟦6a563b143⟧
└─⟦this⟧ »cc «
tkermit d.940306.2340
1 begin
2 integer i, mk, state, abort, breakstate, retrycount,
3 incount, inseq, inpackettype, checksum, crc,
4 outcount, outseq, outpackettype, indatacount, outdatacount,
5 packetsize, timeout, numpad, padchar, endchar, startchar,
6 cntrlquote, bit8quote, checktype, repchar,
7 state_ri, state_rf, state_rd, state_si, state_sf, state_sd,
8 state_sz, state_sb, state_c, state_a, state_t, xon, xoff;
9 boolean localecho, series1, xonxoff, waitxon, running, logging,
10 forprinter, activecommandfile, gotsoh, dtrcheck;
11 integer array recvdata, senddata(1:86), tail(1:10), filename(1:4),
12 saveattr(1:8), shd(1:12);
13 long array primary_device(1:2);
14 long array field laf;
15
15 procedure init_kermit;
16 begin
17 integer i;
18
18 i:= 1;
19 state_ri := increase(i);
20 state_rf := increase(i);
21 state_rd := increase(i);
22 state_si := increase(i);
23 state_sf := increase(i);
24 state_sd := increase(i);
25 state_sz := increase(i);
26 state_sb := increase(i);
27 state_c := increase(i);
28 state_a := increase(i);
29 state_t := increase(i);
30 xon:= 'dc1'; xoff:= 'dc3';
31
31 packetsize:= 94;
32 timeout := 60;
33 numpad := 0;
34 padchar := 0;
35 endchar := 'cr';
36 startchar := 'soh';
37 cntrlquote := '#';
38 bit8quote := '&';
39 checktype := '1';
40 repchar := 'nul';
41
41 <* default settings *>
42 gotsoh := false;
43 running := true;
44 end;
45
45 integer procedure tochar(x);
46 value x; integer x;
47 begin
48 tochar:= x+' ';
49 end;
50
50 integer procedure unchar(x);
51 value x; integer x;
52 begin
53 unchar:= x-' ';
54 end;
55
55 integer procedure ctrl(x);
56 value x; integer x;
57 begin
58 ctrl:= (if x>='@' then (x-'@') else (x+'@'));
59 end;
60
60 procedure crc_check(c);
61 value c; integer c;
62 begin
63 integer q;
64
64 c:= c extract 7;
65 q:= exor(crc,c) extract 4;
66 crc:= exor(crc shift (-4),q * 4225);
67 q:= exor(crc,c shift (-4)) extract 4;
68 crc:= exor(crc shift (-4),q * 4225);
69 end;
70
70 procedure timer(z,s,b);
71 zone z; integer s,b;
72 begin
73 if (s extract 1) = 1 then stderror(z,s,b)
74 else
75 begin
76 z(1):= real<:<'em'>:>;
77 b:= 2;
78 end;
79 end;
80
80 zone zin(16,1,timer), zout(16,1,stderror), zf, zh(128,1,stderror);
81
81 boolean procedure readch(c);
82 integer c;
83 begin
84 readchar(zin,c);
85 readch:= c<>'em';
86 end;\f
87 message kermit - packet procedures, page 1;
88
88 <*********************>
89 <* packet procedures *>
90 <*********************>
91
91 procedure send_packet;
92 begin
93 integer i, sum, checkbytes, achar, ochar;
94 boolean soh_echo;
95
95 soh_echo:= -,(localecho or series1);
96 achar:= 0;
97
97 if waitxon then
98 while achar<>xon do if -,readch(achar) then achar:=xon;
99 waitxon:= xonxoff;
100
100 setposition(zin,0,0); <* throw away all previous incomming data *>
101 sum:= crc:= 0;
102 checkbytes:= 1;
103
103 if (outpackettype='S') or (outpackettype='I') or
104 ( inpackettype='S') or ( inpackettype='I') or
105 ( inpackettype='R')
106 then <* leave checkbytes = 1 *>
107 else
108 if checktype='2' then checkbytes:= 2 else
109 if checktype='3' then checkbytes:= 3 ;
110
110 outchar(zout,startchar); setposition(zout,0,0); <* SOH *>
111 if soh_echo then <* wait for soh to be echoed back *>
112 while achar<>startchar do if -,readch(achar) then achar:=startchar;
113
113 outcount:= outdatacount + 2 + checkbytes;
114
114 ochar:= tochar(outcount); <* COUNT *>
115 outchar(zout,ochar);
116 sum:= sum+ochar; crc_check(ochar);
117 ochar:= tochar(outseq); <* SEQ *>
118 outchar(zout,ochar);
119 sum:= sum+ochar; crc_check(ochar);
120 ochar:= tochar(outpackettype); <* TYPE *>
121 outchar(zout,ochar);
122 sum:= sum+ochar; crc_check(ochar);
123 if outdatacount > 0 then
124 for i:= 1 step 1 until outdatacount do
125 begin
126 læstegn(senddata,i+0,ochar); <* DATA *>
127 outchar(zout,ochar);
128 sum:= sum+ochar; crc_check(ochar);
129 end;
130
130 if checkbytes = 1 then
131 begin
132 checksum:= (sum + (sum shift (-6) extract 2)) extract 7;
133 outchar(zout,tochar(checksum));
134 end
135 else
136 if checkbytes = 2 then
137 begin
138 checksum:= sum shift (-6) extract 6;
139 outchar(zout,tochar(checksum));
140 checksum:= sum extract 6;
141 outchar(zout,tochar(checksum));
142 end
143 else
144 if checkbytes = 3 then
145 begin
146 outchar(zout,tochar(crc shift (-12) extract 4));
147 outchar(zout,tochar(crc shift (-6) extract 6));
148 outchar(zout,tochar(crc extract 6));
149 end;
150
150 outchar(zout,endchar);
151
151 if numpad > 0 then
152 for i:= 1 step 1 until numpad do outchar(zout,padchar);
153
153 setposition(zout,0,0);
154 end; <* procedure send_packet *>
155
155 boolean procedure recv_packet;
156 begin
157 integer i, sum, resends, inchar, checkbytes;
158 boolean dummy;
159
159 recvpacket:= false;
160
160 if got_soh then
161 begin
162 inchar:= startchar; got_soh:= false;
163 end
164 else
165 inchar:= ' ';
166
166 while inchar<>startchar do <* SOH *>
167 if -, readch(inchar) then goto exit;
168
168 sum:= crc:= 0;
169
169 if -, readch(inchar) then goto exit; <* COUNT *>
170 sum:= sum+inchar;
171 crc_check(inchar);
172 incount:= unchar(inchar);
173
173 if -, readch(inchar) then goto exit; <* SEQ *>
174 sum:= sum+inchar;
175 crc_check(inchar);
176 inseq:= unchar(inchar);
177
177 if -, readch(inchar) then goto exit; <* TYPE *>
178 sum:= sum+inchar;
179 crc_check(inchar);
180 inpackettype:= inchar;
181 checkbytes:= 1;
182 if (outpackettype='S') or
183 ( inpackettype='S') or
184 ( inpackettype='I') or
185 ( inpackettype='R')
186 then
187 else
188 if checktype='2' then checkbytes:= 2 else
189 if checktype='3' then checkbytes:= 3 ;
190
190 indatacount:= incount - 2 - checkbytes;
191 if indatacount > 0 then
192 for i:= 1 step 1 until indatacount do
193 begin
194 if -, readch(inchar) then goto exit; <* DATA *>
195 sum:= sum+inchar;
196 crc_check(inchar);
197 skrivtegn(recvdata,i+0,inchar);
198 end;
199
199 recv_packet:= true;
200
200 if checkbytes = 1 then
201 begin
202 checksum:= (sum + (sum shift (-6) extract 2)) extract 7;
203 if -,readch(inchar) then
204 else if inchar<>tochar(checksum) then recv_packet:= false;
205 end
206 else
207 if checkbytes = 2 then
208 begin
209 checksum:= sum shift (-6) extract 6;
210 if -,readch(inchar) then
211 else if inchar<>tochar(checksum) then recv_packet:= false;
212 checksum:= sum extract 6;
213 if -,readch(inchar) then
214 else if inchar<>tochar(checksum) then recv_packet:= false;
215 end
216 else
217 if checkbytes = 3 then
218 begin
219 checksum:= crc shift (-12) extract 4;
220 if -,readch(inchar) then
221 else if inchar<>tochar(checksum) then recv_packet:= false;
222 checksum:= crc shift (-6) extract 6;
223 if -,readch(inchar) then
224 else if inchar<>tochar(checksum) then recv_packet:= false;
225 checksum:= crc extract 6;
226 if -,readch(inchar) then
227 else if inchar<>tochar(checksum) then recv_packet:= false;
228 end;
229 exit:
230 end; <* procedure recv_packet *>
231
231 procedure decode_file(z);
232 zone z;
233 begin
234 integer pos, ch, repcount, bit8;
235
235 pos:= 1;
236 while pos <= indatacount do
237 begin
238 læstegn(recvdata,pos,ch);
239
239 if ch=repchar then
240 begin
241 læstegn(recvdata,pos,ch);
242 repcount:= unchar(ch);
243 læstegn(recvdata,pos,ch);
244 end
245 else
246 repcount:= 1;
247
247 if ch=bit8quote then
248 begin
249 bit8:= 128;
250 læstegn(recvdata,pos,ch);
251 end
252 else
253 bit8:= 0;
254
254 if ch=cntrlquote then
255 begin
256 læstegn(recvdata,pos,ch);
257 ch:= cntrl(ch);
258 end;
259
259 ch:= (ch mod 128) + bit8;
260
260 for i:= 1 step 1 until repcount do
261 outchar(z,ch);
262 end;
263 end; <* procedure decode_file *>
264
264 integer procedure decode_data(buf);
265 integer array buf;
266 begin
267 integer pos, p, ch, repcount, bit8;
268
268 pos:= 1;
269 p:=1;
270 while pos <= indatacount do
271 begin
272 læstegn(recvdata,pos,ch);
273
273 if ch=repchar then
274 begin
275 læstegn(recvdata,pos,ch);
276 repcount:= unchar(ch);
277 læstegn(recvdata,pos,ch);
278 end
279 else
280 repcount:= 1;
281
281 if ch=bit8quote then
282 begin
283 bit8:= 128;
284 læstegn(recvdata,pos,ch);
285 end
286 else
287 bit8:= 0;
288
288 if ch=cntrlquote then
289 begin
290 læstegn(recvdata,pos,ch);
291 ch:= cntrl(ch);
292 end;
293
293 ch:= (ch mod 128) + bit8;
294
294 for i:= 1 step 1 until repcount do
295 skrivtegn(buf,p,ch);
296 end;
297
297 decode_data:= p-1;
298 repeat skrivtegn(buf,p,0) until (p mod 6)=1;
299 end; <* procedure decode_data *>
300
300 procedure encode_data(buf);
301 integer array buf;
302 begin
303 integer i, pos, p, ch;
304
304 pos:= 1; p:=1;
305 while ((p-1)<packetsize-3-4) and (læstegn(buf,pos,ch) extract 12 <> 0) do
306 begin
307 if ch >= 128 then
308 skrivtegn(senddata,p,bit8quote);
309 ch:= ch mod 128;
310 if ch<' ' or ch='del' then
311 begin
312 skrivtegn(senddata,p,cntrlquote);
313 skrivtegn(senddata,p,cntrl(ch));
314 else
315 if ch=bit8quote or ch=cntrlquote then
316 begin
317 skrivtegn(senddata,p,cntrlquote);
318 skrivtegn(senddata,p,ch);
319 end
320 else
321 skrivtegn(senddata,p,ch);
322 end;
323 outdatacount:= p-1;
324 end; <* procedure encode_data *>
325
325 procedure resendit(retries);
326 value retries; integer retries;
327 begin
328 retry_count:= retrycount+1;
329 if retries > 0 then
330 begin
331 send_packet;
332 if recv_packet then
333 begin
334 if inpackettype='Y' then else
335 if inpackettype='N' then resendit(retries-1)
336 else state:= state_a; <* Abort *>
337 end
338 else
339 state:= state_a; <* Abort *>
340 end
341 else
342 state:= state_a; <* Abort *>
343 end; <* procedure resendit *>
344
344 procedure send_packettype(packettype,seq);
345 value packettype; integer packettype, seq;
346 begin
347 integer saveseq;
348
348 <* send Ack or Nak or B or Z *>
349 saveseq:= outseq;
350 outseq:= seq;
351 outdatacount:= 0;
352 outpackettype:= packettype;
353 sendpacket;
354 outseq:= saveseq;
355 end; <* procedure send_packettype *>
356
356 procedure send_msg_packet(packettype,msg,seq);
357 value packettype, seq; integer packettype, seq;
358 string msg;
359 begin
360 integer array buf;
361
361 puttext(buf,1,msg);
362 outpackettype:= packettype;
363 outseq:= seq;
364 encode_data(buf);
365 sendpacket;
366 end; <* procedure send_msg_packet *>
367
367 procedure putinitpacket;
368 begin
369 <* put parameters into initpacket *>
370 outdatacount:= 9;
371 outseq:= 0;
372 skrivtegn(senddata,1,tochar(packetsize));
373 skrivtegn(senddata,2,tochar(timeout));
374 skrivtegn(senddata,3,tochar(numpad));
375 skrivtegn(senddata,4,tochar(padchar));
376 skrivtegn(senddata,5,tochar(endchar));
377 skrivtegn(senddata,6,cntrlquote);
378 skrivtegn(senddata,7,bit8quote);
379 skrivtegn(senddata,8,checktype);
380 skrivtegn(senddata,9,repchar);
381 if bit8quote=0 then outdatacount:= 6 else
382 if checktype=0 then outdatacount:= 7 else
383 if repchar=0 then outdatacount:= 8 ;
384 end; <* procedure putinitpacket *>
385
385 procedure getinitpacket;
386 begin <* get init parameters *>
387 integer ch;
388
388 if indatacount >=1 then læstegn(recvdata,1,ch); packetsize:= unchar(ch);
389 if indatacount >=2 then læstegn(recvdata,2,ch); timeout:= unchar(ch);
390 if indatacount >=3 then læstegn(recvdata,3,ch); numpad:= unchar(ch);
391 if indatacount >=4 then læstegn(recvdata,4,ch); padchar:= unchar(ch);
392 if indatacount >=5 then læstegn(recvdata,5,ch); endchar:= unchar(ch);
393 if indatacount >=6 then læstegn(recvdata,6,cntrlquote);
394 if indatacount >=7 then
395 begin
396 læstegn(recvdata,7,bit8quote);
397 if bit8quote='Y' then bit8quote:= '&';
398 if (bit8quote < '!') or ('ü' < bit8quote) or
399 ('?' < bit8quote and bit8quote < '`') then bit8quote:= 0;
400 end
401 else bit8quote:= 0;
402 if indatacount >=8 then
403 begin
404 læstegn(recvdata,8,checktype);
405 if -,('1' <= checktype and checktype <= '3') then checktype:= '1';
406 end
407 else checktype:= '1';
408 if indatacount >=9 then
409 begin
410 læstegn(recvdata,9,repchar);
411 if (repchar < '!') or ('ü' < repchar) or
412 ('?' < repchar and repchar < '`') then repchar:= 0;
413 end
414 else repchar:= 0;
415 end; <* procedure getinitpacket *>
416
416 <*--------------- end of packet procedures ---------------*>\f
417
417 message kermit - main body, page 1;
418
418 <**************** start of main program body ****************>
419 trap(exit);
420
420 laf:= 0;
421 system(7,mk,primary_device);
422 open(zin,mk,primary_device,1 shift 21);
423 open(zout,mk,primaty_device,0);
424
424 <* lookup termial attributes *>
425 open(zh,0,primary_device,0);
426 getshare6(zh,shd,1);
427 shd(1):= 1;
428 shd(4):= 134 shift 12;
429 for i:= 5 step 1 until 11 do shd(i):= 0;
430 setshare6(zh,shd,1);
431 monitor(16)send_message:(zh,1,shd);
432 monitor(18)wait_answer:(zh,1,saveattr);
433
433 <* set tiomeoutvalue and echo off *>
434 getshare6(zh,shd,1);
435 shd(1):= 1;
436 shd(4):= 132 shift 12;
437 for i:= 5 step 1 until 11 do shd(i):= saveattr(i-3);
438 shd(5):= shd(5) shift 1 shift (-1);
439 setshare6(zh,shd,1);
440 monitor(16)send_message:(zh,1,shd);
441 monitor(18)wait_answer:(zh,1,shd);
442 close(zh,false);
443
443 init_kermit;
444
444 state:= state_ri;
445 retry_count:= 0;
446 outseq:= 0;
447 <* main loop *>
448 while running do
449 case state of
450 begin
451 <* 1 : Recv_Init *>
452 begin
453 if -, recv_packet then
454 begin
455 increase(retry_count);
456 if retry_count > retry_limit then
457 begin
458 send_msg_packet('E',<:Retrylimit exeeded:>,0);
459 goto exit;
460 end
461 else
462 send_packettype('N',0);
463 end
464 else
465 if (inpackettype='I' or inpackettype='S') and inseq=0 then
466 begin
467 getinitparam;
468 outpackettype:= 'Y';
469 putinitpacket;
470 sendpacket;
471 if inpackettype='S' then
472 begin
473 outseq:= (outseq+1) mod 64; retry_count:= 0;
474 state:= state_rf;
475 end;
476 end
477 else
478 if inpackettype='R' then
479 begin
480 decode_data(filename);
481 state:= state_si;
482 end
483 else
484 begin
485 send_msg_packet('E',<:Packet Type Error:>,0);
486 end;
487 end; <* state_ri *>
488
488 <* 2 : Recv_File *>
489 begin
490 if -, recv_packet then
491 begin
492 increase(retry_count);
493 if retry_count > retry_limit then
494 begin
495 send_msg_packet('E',<:Retrylimit exeeded:>,0);
496 goto exit;
497 end
498 else
499 send_packettype('Y',(out_seq+63) mod 64);
500 end
501 else
502 if inpackettype='F' and inseq=outseq then
503 begin
504 decode_data(filename);
505 open(zf,4,<::>,0);
506 for i:= 1 step 1 until 10 do tail(i):= 0;
507 tail(1):= 1;
508 if monitor(40,zf,0,tail)=0 and monitor(52,zf,0,tail)=0 then
509 begin
510 send_packettype('Y',outseq);
511 outseq:= (outseq+1) mod 64; retry_count:= 0;
512 state:= state_rd;
513 end
514 else
515 begin
516 close(zf,true);
517 send_msg_packet('E',<:Cannot create file:>,outseq);
518 state:= state_a;
519 end;
520 end
521 else
522 if inpackettype='B' and inseq=outseq then
523 begin
524 send_packettype('Y',outseq);
525 state:= state_c;
526 end
527 else
528 if inpackettype='S' and ((inseq+1) mod 64)=outseq then
529 begin
530 increase(retry_count);
531 if retry_count > retry_limit then
532 begin
533 send_msg_packet('E',<:Retrylimit exeeded:>,0);
534 goto exit;
535 end
536 else
537 begin
538 putinitpacket;
539 outpackettype:='Y';
540 outseq:= inseq;
541 sendpacket;
542 outseq:= (outseq+1) mod 64;
543 end;
544 end
545 else
546 if inpackettype='Z' and ((inseq+1) mod 64)=outseq then
547 begin
548 increase(retry_count);
549 if retry_count > retry_limit then
550 begin
551 send_msg_packet('E',<:Retrylimit exeeded:>,0);
552 goto exit;
553 end
554 else
555 send_packettype('Y',inseq);
556 end
557 else
558 begin
559 send_msg_packet('E',<:Protocol Error:>,outseq);
560 state:= state_a;
561 end;
562 end; <* state_RF *>
563
563 <* 3 : Recv_Data *>
564 begin
565 if -, recv_packet then
566 begin
567 increase(retry_count);
568 if retry_count > retry_limit then
569 begin
570 close(zf,true);
571 monitor(48)remove_entry:(zf,0,tail);
572 send_msg_packet('E',<:Retrylimit exeeded:>,outseq);
573 state:= state_a;
574 end
575 else
576 send_packettype('Y',(out_seq+63) mod 64);
577 end
578 else
579 if inpackettype='D' and inseq=outseq then
580 begin
581 decode_file(zf);
582 send_packettype('Y',outseq);
583 outseq:= (outseq+1) mod 64; retry_count:= 0;
584 end
585 else
586 if inpackettype='D' and ((inseq+1) mod 64)=outseq then
587 begin
588 increase(retry_count);
589 if retry_count > retry_limit then
590 begin
591 close(zf,true);
592 monitor(48)remove_entry:(zf,0,tail);
593 send_msg_packet('E',<:Retrylimit exeeded:>,0);
594 state:= state_a;
595 end
596 else
597 send_packettype('Y',inseq);
598 end
599 else
600 if inpackettype='Z' and inseq=outseq and indatacount=0 then
601 begin
602 close(zf,true);
603 i:= monitor(46)rename_entry:(zf,0,filename);
604 if i=3 then
605 begin
606 open(zh,4,filename,0); close(zh,true);
607 i:= monitor(48)remove_entry:(zh,0,tail);
608 if i=0 then i:=monitor(46)rename_entry:(zf,0,filename);
609 end;
610 if i=0 then
611 begin
612 send_packettype('Y',outseq);
613 outseq:= (outseq+1) mod 64; retry_count:= 0;
614 state:= state_rf;
615 end
616 else
617 begin
618 close(zf,true);
619 monitor(48)remove_entry:(zf,0,tail);
620 send_msg_packet('E',<:File Receive Error:>,outseq);
621 state:= state_a;
622 end;
623 end
624 if inpackettype='Z' and inseq=outseq and
625 indatacount > 0 and læstegn(recvdata,1,i) extract 12 = 'D'
626 then
627 begin
628 close(zf,true);
629 monitor(48)remove_entry:(zf,0,tail);
630 send_packettype('Y',outseq);
631 outseq:= (outseq+1) mod 64; retry_count:= 0;
632 state:= state_rf;
633 end
634 else
635 if inpackettype='F' and ((inseq+1) mod 64)=outseq then
636 begin
637 increase(retry_count);
638 if retry_count > retry_limit then
639 begin
640 close(zf,true);
641 monitor(48)remove_entry:(zf,0,tail);
642 send_msg_packet('E',<:Retrylimit exeeded:>,0);
643 goto exit;
644 end
645 else
646 send_packettype('Y',inseq);
647 end
648 else
649 begin
650 close(zf,true);
651 monitor(48)remove_entry:(zf,0,tail);
652 send_msg_packet('E',<:Protocol Error:>,outseq);
653 state:= state_a;
654 end;
655 end; <* state_RD *>
656
656 <* 4 : state Send_Init *>
657 begin
658 end; <* state_SI *>
659
659 <* 5 : state Send_File *>
660 begin
661 end; <* state_SF *>
662
662 <* 6 : state Send_Data *>
663 begin
664 end; <* state_SD *>
665
665 <* 7 : state Send_EOF *>
666 begin
667 end; <* state_SZ *>
668
668 <* 8 : state Send_Break *>
669 begin
670 end; <* state_SB *>
671
671 <* 9 : state Complete *>
672 begin
673 init_kermit;
674 retry_count:= outseq:= 0;
675 state:= state_ri;
676 end; <* state_C *>
677
677 <* 10 : state Abort *>
678 begin
679 init_kermit;
680 retry_count:= outseq:= 0;
681 state:= state_ri;
682 end; <* state_A *>
683
683 <* 11 : state Terminate *>
684 begin
685 running:= false;
686 end;
687 end; <* case state - main loop *>
688
688 exit:
689 <* reset terminal attributes *>
690 getshare6(zin,shd,1);
691 for i:= 1 step 1 until 8 do
692 shd(3+i):= saveattr(i);
693 shd(4):= 132 shift 12;
694 setshare6(zin,shd,1);
695 monitor(16)send_message:(zin,1,shd);
696 monitor(18)wait_answer:(zin,1,shd);
697
697 close(zin,true);
698 close(zout,true);
699 end
\f
6. line 257 . 2 undeclared
line 291 . 2 undeclared
line 313 . 4 undeclared
line 314 . 0 termination
line 325 . 0 delimiter
line 326 . 0 delimiter
line 326 . 1 delimiter
line 329 . 1 undeclared
line 335 . 3 undeclared
line 344 . 0 delimiter
line 345 . 0 delimiter
line 345 . 1 delimiter
line 350 . 2 undeclared
line 352 . 2 undeclared
line 356 . 0 delimiter
line 357 . 0 delimiter
line 357 . 2 delimiter
line 358 . 0 delimiter
line 360 . 1 delimiter
line 361 . 1 undeclared
line 361 . 4 undeclared
line 362 . 2 undeclared
line 363 . 2 undeclared
line 367 . 0 delimiter
line 385 . 0 delimiter
line 423 . 4 undeclared
line 456 . 2 undeclared
line 458 . 1 undeclared
line 462 . 1 undeclared
line 467 . 1 undeclared
line 469 . 1 undeclared
line 634 . 0 termination
algol end 63
▶EOF◀