|
|
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: 48384 (0xbd00)
Types: TextFile
Names: »tsave«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦ebd72877b⟧ »tfput«
└─⟦this⟧
begin
procedure program(out); zone out;
begin
message rc 1978.03.17 save;
boolean infile;
zone entry(128,1,caterror), zhelp(1,1,stderror);
array input(1:4),fpparam(1:2);
integer array iarr(1:20),modekind,entrybase(1:2);
integer segm,sep,fpno,paramnos,spacename,pointname,
pointinteger,i,catalogs,ownbase1,ownbase2,errors,rejected;
real ownname1, ownname2;
procedure caterror(z,s,b);
zone z;
integer s,b;
if s shift (-18) extract 1=1 then b:=34 else
if s shift (-2) extract 1=0 then stderror(z,s,b);
procedure nextfp;
begin
fpno:=fpno+1;
if infile then readfp else sep:=system(4,fpno,fpparam);
end nextfp;
procedure lastfp;
begin
fpno:=fpno-1;
sep:=system(4,fpno,fpparam);
end lastfp;
procedure readfp;
begin
integer cl,val,i;
real r;
begin
i:=0;
sep:=10;
for cl:=readchar(entry,val)
while cl<>2 and cl<>6 and val<>25 do sep:=val;
sep:=if val=25 then 0 else
(if sep=46 then 8 else if sep=10 or sep=32 then 4 else 1)
shift 12 add (if cl=2 then 4 else 10);
if cl=2 then
begin
repeatchar(entry);
read(entry,fpparam(1))
end
else
if cl=6 then
begin
fpparam(1):=fpparam(2):=r:=real<::>;
for i:=i+1 while (cl=2 or cl=6) do
begin
r:=r shift 8 add val;
if i=6 then
begin
fpparam(1):=r;
r:=real<::>
end;
cl:=readchar(entry,val);
end
end;
if i>12 then sep:=1;
if i<>0 and i<>7 then
fpparam(if i<=6 then 1 else 2):=
r shift (8*(7-(if i mod 6=0 then 6 else i mod 6)));
repeatchar(entry);
end
end readfp;
infile:=false;
sep:=system(4,1,fpparam);
if sep<>6 shift 12+10 then system(4,0,fpparam);
i:=1;
open(entry,0,string fpparam(increase(i)),0);
monitor(76)lookup head and tail:(entry,0,iarr);
close(entry,false);
ownname1:=fpparam(1);
ownname2:=fpparam(2);
ownbase1:=iarr(2);
ownbase2:=iarr(3);
segm:=iarr(14) shift (-8) extract 4;
open(zhelp,0,<::>,0);
system(5)move core area:(92,iarr);
catalogs:=(iarr(3)-iarr(1))/2-1;
fpno:=if sep<>6 shift 12+10 then 0 else 1;
comment ignore lefthand side;
pointname:=8 shift 12+10;
pointinteger:=8 shift 12+4;
spacename:=4 shift 12 + 10;
paramnos:=-1;
nextfp;
for sep:=sep while sep<>0 do
begin
if sep=spacename then paramnos:=paramnos+1;
nextfp
end;
lastfp;
if sep=pointname then
begin
lastfp;
if sep=spacename and fpparam(1)=real<:in:> then
begin
nextfp;
i:=1;
input(1):=fpparam(1);
input(2):=fpparam(2);
open(entry,4,string input(increase(i)),0);
i:=1;
if monitor(76)lookup head and tail:(entry,0,iarr)<>0 then
begin
write(out,<:<10>***save, infile :>,
string input(increase(i)),<: unknown:>);
goto savenotok
end;
for i:=0,i+1 while readstring(entry,fpparam,1)<>0 do;
paramnos:=paramnos-2+i;
end
end;
close(entry,true);
fpno:=if paramnos<1 then 1 else paramnos;
begin
boolean listnames,listmore,ok,endtape,sysdump,sp,hard,bodoc,release,
missingclock;
integer i,j,k,paramno,copies,volumes,actualkitno,permkey,
scopekey,entryno,segmno,totalsegm,actualscope,
actualnewscope,vol,cop,blocksize,block,posvol,size1,size2,free,buf,sum,const;
long interval1,interval2,interval3,interval4,interval5,
interval6,interval7,interval8,interval9,interval10,
entrybase1,entrybase2;
real r,scopedoc1,scopedoc2;
integer field keys,kind,shortclock,contents;
integer array field base;
real array field tail,name,docname,raf;
boolean array labelparam(1:2);
integer array fileno,date,hour,startfp(1:2),interval(1:10),
device(1:2),param,fpscope,fpnewscope,fpkitno(1:fpno),slices,segm_pr_slice,entries(-1:catalogs);
array catname(-1:catalogs,1:4),tapenames,dumplabelname(1:2,1:2),
fpname,fpdocname(1:fpno,1:2);
long array field document;
real procedure dumplabel(i,type);
integer i;
integer type;
begin
real spaces,stop;
comment returns the ith real of a dumplabel
1 : dump
2-3 : tapename
4 : fileno
5 : empty , vers. og cont.
6 : date
7 : hour
8 : segments
9-10 : dumplabelname
11 : in.
12-13: infile
14: nl
15: em
the dumplabel is a textstring which may be read by edit;
real procedure convintg(n);
value n;
integer n;
comment converts a non negative integer
to a textportion with the layout <<zddddd>;
convintg:= if n < 10 then real<:00000:> add (n+48)
else convintg(n//10) shift 8 add (n mod 10 + 48);
real procedure spacefill(text);
value text;
real text;
begin
comment spacefill will replace trailing nulls by spaces;
integer i;
if text = real<::> then text:= spaces
else
begin
i:= -1;
for i:= i+1 while text extract 8=0 do text:=text shift(-8);
for i:= i-1 while i>-1 do text:=text shift 8 add 32;
end;
spacefill:= text;
end spacefill;
spaces:=real<: :> add 32;
stop:=real<:<10>:>;
dumplabel:= case i of (
spacefill(real<:dump:>),
spacefill(tapenames( cop, 1)),
spacefill(tapenames( cop, 2)),
spacefill(convintg(fileno(cop))shift 24),
spacefill(case type of(real<:vers.:>,real<:empty:>,real<:cont.:>)),
convintg(date(cop)),
spacefill(real<: .:> add
(convintg(hour(cop)) extract 16) shift 24),
if type=2 then spaces else
spacefill(real<:s=0:> shift (-24) add segm shift 24),
if (dumplabelname(cop,1)=spaces or dumplabelname(cop,1)=stop)
and -,infile then stop else spacefill(dumplabelname(cop,1)),
if (dumplabelname(cop,2)=spaces or dumplabelname(cop,2)=stop
or dumplabelname(cop,2)=real<::>)
and -,infile then stop else spacefill(dumplabelname(cop,2)),
if infile then real<: in:> add 46 else stop,
if infile then spacefill(input(1)) else stop,
if infile then spacefill(input(2)) else stop,
stop,real<:<25>:> shift (-8));
end dumplabel;
procedure writelabel(type);
integer type;
comment writes and prints a label;
begin
integer i;
zone zlabel(25, 1, error);
procedure error(z,s,b); zone z; integer s,b;
if s shift 5>=0 then stderror(z,s,b); <*ignore eot*>
real r;
i:= 1;
open(zlabel, modekind(cop), string tapenames(cop,increase(i)),0);
systime(1, 0, r);
date(cop):= systime(2, r, r);
hour(cop):= r/10000 - 0.3;
setposition(zlabel, if type=3 then 1 else fileno(cop), 0);
outrec6(zlabel, 4*25);
for i:= 1 step 1 until 15 do zlabel(i):= dumplabel(i,type);
for i:=16 step 1 until 25 do zlabel(i):=real<::>;
i:=1;
write(out,<:<10>written::>,
if infile then <:<10>:> else <: :>,
string zlabel(increase(i)));
if type=3 then
zlabel(25):=real<::> add entryno shift 24 add (segmno-1);
close(zlabel,if release and type=2 then false add 1 else false);
end writelabel;
procedure readlabel;
comment readlabel reads, lists and checks a dumplabel if any;
begin
integer i,modecase;
boolean last;
zone zlabel(25,1,nodump); integer array ia(1:8);
procedure nodump(z,s,b);
zone z;
integer s,b;
begin
b:=0;
if s shift (-14) extract 1=0 then alarm3(0);
if modecase=0 then
begin
modecase:=1;
setposition(zlabel,0,0);
setposition(zlabel,0,0);
modecase:=2;
goto next
end
else
if modecase=2 then
begin
write(out,<:<10>***save mode error:>);
goto savenotok
end;
end nodump;
procedure alarm3(i);
integer i;
begin
if i=0 then
begin
write(out,<:<10>no dumplabel on file:>,fileno(cop));
goto exitreadlabel
end;
write(out,<:<10>***save: :>);
write(out,<:dumplabel :>,
case i of (<:tapename:>,
<:fileno:>,
<:version label: file already used by save:>));
goto savenotok
end alarm3;
i:=1;
last:=fileno(cop)=0;
if last then fileno(cop):=1;
mount_med_ring;
open(zlabel,modekind(cop),string tapenames(cop,increase(i)),0);
modecase:=0;
next:
setposition(zlabel,fileno(cop),0);
i:=inrec6(zlabel,0);
if i<>100 then alarm3(0) else inrec6(zlabel,100);
if zlabel(1)<>dumplabel(1,1) then alarm3(0);
if last and (zlabel(5)=dumplabel(5,1) or zlabel(5)=dumplabel(5,3)) then
begin
fileno(cop):=fileno(cop)+1;
goto next
end;
comment repair old versions of dumplabels;
for i:=9 step 1 until 14 do
if zlabel(i)=real<:<10><25>:> then zlabel(i):=real<:<10>:>;
i:=1;
write(out,if zlabel(11)=real<:<10>:> then <:<10>read : :>
else <:<10>read:<10>:>,string zlabel(increase(i)));
if zlabel(4)<>dumplabel(4,1) then alarm3(2);
if -,labelparam(cop) and zlabel(5)=dumplabel(5,1) then
alarm3(3);
if -,labelparam(cop) then
begin
dumplabelname(cop,1):=zlabel(9);
dumplabelname(cop,2):=zlabel(10);
end;
exitreadlabel:
close(zlabel,false);
end readlabel;
procedure mount_med_ring;
begin integer array ia(1:12),m(1:8);
integer i;
zone z(128,1,stderror);
m(5):=tapenames(cop,1) shift (-24) extract 24;
m(6):=tapenames(cop,1) extract 24;
m(7):=tapenames(cop,2) shift (-24) extract 24;
m(8):=tapenames(cop,2) extract 24;
i:=1; open(z,0,string tapenames(cop,increase(i)),0);
if monitor(4)process descr:(z,0,ia)=0 then
begin
m(1):=16<*opmess*> shift 12;
m(2):=real<:rin:> shift (-24) extract 24;
m(3):=real<:g:> shift (-24) extract 24;
m(4):=32 shift 16;
system(10,0,m);
end;
sense:
monitor(6)initialize process:(z,0,ia);
getshare6(z,ia,1);
ia(4):=0 <*sense*>;
setshare6(z,ia,1);
monitor(16)send mess:(z,1,ia);
if monitor(18)wait answ:(z,1,ia)<>1<*not normal*> then
begin <*not mounted*>
ia(1):=(if device(cop)=0 then 14 shift 12 else
32 shift 12 + 1 shift 9) + 1 shift 0;
ia(2):=real<:mou:> shift (-24) extract 24;
ia(3):=real<:nt:> shift (-24) extract 24;
ia(4):=device(cop);
for i:=5 step 1 until 8 do ia(i):=m(i);
system(10,0,ia);
goto sense
end
else
begin <*test om ring*>
if ia(1) shift (-15) extract 1=0 then
begin
close(z,false);
i:=1;
open(z,modekind(cop),string tapenames(cop,increase(i)),0);
ia(1):=18<*ring*> shift 12 + 1 shift 0;
ia(2):=real<:rin:> shift (-24) extract 24;
ia(3):=real<:g:> shift (-24) extract 24;
ia(4):=0;
for i:=5 step 1 until 8 do ia(i):=m(i);
system(10,0,ia);
goto sense;
end
end;
close(z,false);
end mount med ring;
boolean procedure findentryscope(actualscope,owns);
integer actualscope;
boolean owns;
comment returns the actual scope of the entry;
begin
boolean found;
integer no;
no:=0;
for i:=8 step -1 until 5 do
if no=0 then
begin
if (case 9-i of (permkey=0 and
entrybase1=interval1 and entrybase2=interval2,
permkey=2 and
entrybase1=interval3 and entrybase2=interval4,
permkey=3 and
entrybase1=interval5 and entrybase2=interval6,
permkey=3 and
entrybase1=interval7 and entrybase2=interval8))
then no:=i
end;
found:=no<>0;
if -,found and -,owns then
begin
found:=permkey=3 and
entrybase1=interval9 and entrybase2=interval10;
if found then no:=3
end;
actualscope:=no;
findentryscope:=found
end findentryscope;
procedure listentry(bo);
boolean bo;
begin
procedure outmodekind;
begin integer i,modekind;
modekind:=entry.kind;
for i:=1 step 1 until 21 do
begin
if modekind=(case i of (
<*ip*> 1 shift 23 + 0 shift 12 + 0,
<*bs*> 1 shift 23 + 0 shift 12 + 4,
<*tw*> 1 shift 23 + 0 shift 12 + 8,
<*tro*> 1 shift 23 + 0 shift 12 + 10,
<*tre*> 1 shift 23 + 2 shift 12 + 10,
<*trn*> 1 shift 23 + 4 shift 12 + 10,
<*trf*> 1 shift 23 + 6 shift 12 + 10,
<*tpo*> 1 shift 23 + 0 shift 12 + 12,
<*tpe*> 1 shift 23 + 2 shift 12 + 12,
<*tpn*> 1 shift 23 + 4 shift 12 + 12,
<*tpf*> 1 shift 23 + 6 shift 12 + 12,
<*tpt*> 1 shift 23 + 8 shift 12 + 12,
<*lp*> 1 shift 23 + 0 shift 12 + 14,
<*crb*> 1 shift 23 + 0 shift 12 + 16,
<*crd*> 1 shift 23 + 8 shift 12 + 16,
<*crc*> 1 shift 23 + 10 shift 12 + 16,
<*mto*> 1 shift 23 + 0 shift 12 + 18,
<*mte*> 1 shift 23 + 2 shift 12 + 18,
<*nrz*> 1 shift 23 + 4 shift 12 + 18,
<*nrze*> 1 shift 23 + 6 shift 12 + 18,
<*pl*> 1 shift 23 + 0 shift 12 + 20 ))
then goto found
end;
found:
if i=22 then
begin
write(out,<<ddddd>,modekind shift (-12),<:.:>,
<<d>,modekind extract 12,sp,
if modekind extract 12<10 then 2 else 1);
end
else
begin
write(out,case i of (
<: ip :>,
<: bs :>,
<: tw :>,
<: tro :>,
<: tre :>,
<: trn :>,
<: trf :>,
<: tpo :>,
<: tpe :>,
<: tpn :>,
<: tpf :>,
<: tpt :>,
<: lp :>,
<: crb :>,
<: crd :>,
<: crc :>,
<: mto :>,
<: mte :>,
<: nrz :>,
<: nrze :>,
<: pl :> ) );
end
end outmodekind;
real k;
integer i,j,p;
monitor(72,zhelp,0,interval);
i:=1;
if bo then
begin
write(out,<:<10>:>);
write(out,sp,(if listmore then 11 else 0)
-write(out,string entry.name(increase(i))));
end;
if listmore then
begin
if entry.kind<0 then outmodekind
else
write(out,<< dddd>,entry.kind,sp,2);
if sysdump then write(out,<<d>,permkey,<:.:>)
else write(out,case scopekey-2 of (
<: system.:>,<::>,
<:project.:>,
<: user.:>,
<: login.:>,
<: temp.:>));
k:=entry.docname(1) ;
j:=1;
i:=if k=0.0 or k=1.0 then write(out,<<d>,k) else
write(out,string entry.docname(increase(j)));
write(out,sp,11-i);
if sysdump then
begin
write(out,
<< -ddddddd>,entry.base(1),entry.base(2));
end;
i:=entry.contents shift (-12);
if i<>4 and i<32 then
begin
i:=entry.shortclock;
missingclock:=false;
if i<>0 then
write(out,<: d.:>,<<zddddd>,
systime(4,(if i>0 then i else i + extend 1 shift 24)
/625*1 shift 15+12,r),
<:.:>,<<zddd>,r/100)
end
else
if entry.kind>0 then missingclock:=true;
end;
monitor(72,zhelp,0,entrybase);
end listentry;
integer procedure findkitno;
begin
integer i;
findkitno:=-2;
for i:=-1 step 1 until catalogs do
if fpparam(1)=catname(i,1) and
fpparam(2)=catname(i,2) then findkitno:=i;
end findkitno;
procedure getmtname(file);
integer file;
begin integer i;
zone zhelp(1,1,stderror);
file:=-1;
i:=1;
open(zhelp,0,string fpparam(increase(i)),0);
i:=monitor(42)lookup entry tail:(zhelp,0,iarr);
if i=0 and iarr(1) extract 12=18 then
begin
modekind(cop):=iarr(1) extract 23;
fpparam(1):=real<::> add iarr(2) shift 24 add iarr(3);
fpparam(2):=real<::> add iarr(4) shift 24 add iarr(5);
file:=iarr(7);
end;
close(zhelp,true)
end getmtname;
begin
comment read fpparameters;
integer min;
real array catalog(1:2);
integer array help(1:1);
integer procedure findscopeno;
begin
integer i,j;
i:=0;
for j:=1 step 1 until 9 do
if fpparam(1)=real (case j of (<:all:>,
<:perm:>,
<:syste:> add 109,
<:own:>,
<:proje:> add 99,
<:user:>,
<:login:>,
<:temp:>,
<:std:>))
then i:=j;
if i=5 and fpparam(2)<>real<:t:> then i:=0;
findscopeno:=i;
end findscopeno;
procedure listfp;
begin long array field laf;
laf:=0;
for sep:=sep while sep<>0 do
begin
write(out,if sep shift (-12)=8 then <:.:> else <: :>);
if sep extract 12=10 then write(out,fpparam.laf)
else write(out,<<d>,fpparam(1));
nextfp;
end
end listfp;
procedure readtapeparams;
begin
integer lastsep,file;
procedure alarm1;
begin
write(out,<:<10>***save: error in tapeparam: :>);
listfp;
goto savenotok;
end alarm;
lastsep:=sep;
if sep=0 and copies=1 then goto exitreadtapeparam;
copies:=copies+1;
cop:=copies;
modekind(cop):=18;
if false then
mountspecif:
nextfp;
r:=fpparam(1);
if r=real<:mount:>add<*s*>115 and
fpparam(2)=real<:pec:> then
begin
nextfp;
if sep<>pointinteger then alarm1;
device(cop):=fpparam(1);
goto mountspecif
end
else
if r=real<:mto:> or r=real<:nrz:> then
begin
modekind(cop):=(if r=real<:mto:> then 0 else 4)
shift 12 + 18;
goto mountspecif
end
else
if r=real<:relea:>add<*s*>115 and fpparam(2)=real<:e:> then
begin
nextfp;
r:=fpparam(1);
if sep<>pointname or
(r<>real<:yes:> and r<>real<:no:>) then alarm1;
release:=r=real<:yes:>;
goto mountspecif
end;
getmtname(file);
tapenames(copies,1):=fpparam(1);
tapenames(copies,2):=fpparam(2);
nextfp;
if lastsep<>spacename or (sep=pointinteger
and tapenames(copies,1)=real<:segm:>) or
-,(sep=pointinteger and (fpparam(1)<>0 and file=-1 or
file+fpparam(1)>0) or
sep=pointname and fpparam(1)=real<:last:>) then
begin
if (sep=pointname or sep=spacename or sep=0 or
tapenames(copies,1)=real<:segm:>) and copies=2 then
begin
copies:=1;
lastfp;
goto exitreadtapeparam
end
else
alarm1
end;
fileno(copies):=if sep=pointname then 0 else
if file=-1 then fpparam(1) else file+fpparam(1);
startfp(copies):=fpno-1;
nextvol:
nextfp;
if sep=spacename or sep=0 then goto exitreadtapeparam;
if sep<>pointname then alarm1;
r:=fpparam(1);
if r<>real<:label:> then
begin
volumes:=volumes+1;
if volumes>10 then alarm1;
goto nextvol
end;
more:
if fpparam(1)=real<:label:> then
begin
if labelparam(copies) then alarm1;
labelparam(copies):=true;
nextfp;
if sep<>pointname then alarm1;
dumplabelname(copies,1):=fpparam(1);
dumplabelname(copies,2):=fpparam(2);
end
else alarm1;
nextfp;
if sep=pointname or sep=pointinteger then goto more;
exitreadtapeparam:
if copies=2 then
begin
if vol<>volumes then alarm1
end;
end readtapeparams;
procedure alarm2;
begin
write(out,<:<10>***save: error in param: :>);
listfp;
goto savenotok;
end alarm2;
for i:= 0 step 1 until catalogs do entries(i):= slices(i):= 0;
for i:=1,2 do for j:=1,2 do
tapenames(i,j):=real<::>;
labelparam(1):=labelparam(2):=false;
dumplabelname(1,1):=dumplabelname(1,2):=
dumplabelname(2,1):=dumplabelname(2,2):=real<: :> add 32;
date(1):=date(2):=hour(1):=hour(2):=0;
device(1):=device(2):=0;
name:=6;
docname:=16;
shortclock:=26;
contents:=32;
keys:=2;
base:=2;
kind:=16;
tail:=14;
endtape:=sysdump:=false;
release:=true;
sp:=false add 32;
errors:=rejected:=0;
system(11)get interval:(0,interval);
interval1:=interval(1);
interval2:=interval(2);
interval3:=interval(3);
interval4:=interval(4);
interval5:=interval(5);
interval6:=interval(6);
interval7:=interval(7);
interval8:=interval(8);
interval9:=-8388607;
interval(9):=interval9;
interval10:=8388605;
interval(10):=interval10;
catname(-1,1):=catname(-1,3):=real<:main:>;
catname(-1,2):=catname(-1,4):=real<::>;
system(5)move core area:(92,iarr);
k:=iarr(1);
for j:= 0 step 1 until catalogs do
begin
system(5,k,help); k:= k + 2;
system(5,help(1)-18,iarr);
segm_pr_slice(j):= iarr(6);
catname(j,1):= catname(j,3):= real<::> add iarr(1) shift 24
add iarr(2);
catname(j,2):= catname(j,4):= real<::> add iarr(3) shift 24
add iarr(4);
end;
fpno:=0;
nextfp;
if sep<>6 shift 12+10 then fpno:=0;
nextfp;
paramno:=0;
if paramnos=-1 then alarm2;
copies:=0;
volumes:=1;
paramno:=1;
readtapeparams;
vol:=volumes;
volumes:=1;
paramno:=2;
readtapeparams;
volumes:=vol;
paramno:=copies-1;
listnames:=true;
listmore:=true;
blocksize:=8+512*segm;;
specialparam:
paramno:=paramno+1;
r:=fpparam(1);
i:=if r=real<:segm:> then 1 else
if r=real<:list:> then 2 else 3;
if i<3 then
begin
nextfp;
if i=1 then
begin
comment segm;
if sep<>pointinteger then lastfp else
begin
if fpparam(1)=0 or fpparam(1)>9 then alarm2;
segm:=fpparam(1);
blocksize:=8+512*segm;
nextfp;
goto specialparam;
end
end
else
begin
comment list;
if sep=pointinteger then alarm2;
r:=fpparam(1);
if r=real<:yes:> or r=real<:no:> or
r=real<:name:> or r=real<:names:> then
begin
listnames:=r<>real<:no:>;
listmore:=r=real<:yes:>;
nextfp;
goto specialparam
end
else
lastfp;
end;
end;
paramnos:=0;
actualnewscope:=4;
actualkitno:=-1;
loop:
if sep=0 then goto exitloop;
if sep shift (-12)<>4 then alarm2;
paramno:=paramno+1;
fpname(paramnos+1,1):=fpparam(1);
fpname(paramnos+1,2):=fpparam(2);
bodoc:=fpparam(1)=real<:docna:> add 109 and fpparam(2)=real<:e:>;
fpdocname(paramnos+1,1):=fpdocname(paramnos+1,2):=real<::>;
fpscope(paramnos+1):=0;
fpnewscope(paramnos+1):=actualnewscope;
fpkitno(paramnos+1):=actualkitno;
nextfp;
actualscope:=findscopeno;
if sep=0 or sep=spacename then paramnos:=paramnos+1
else
if sep=pointname and fpparam(1)=real<:scope:> then
begin
comment textscope;
nextfp;
if sep=0 or sep=spacename then
begin
if bodoc then goto docnameparam else alarm2
end;
paramnos:=paramnos+1;
actualscope:=findscopeno;
if actualscope>8 then alarm2;
fpscope(paramnos):=actualscope;
if actualscope=0 then
begin
if bodoc and fpparam(1)=real<:scope:> then
begin
fpname(paramnos,1):=fpname(paramnos,2):=real<::>;
fpdocname(paramnos,1):=real<:scope:>;
nextfp;
if sep<>pointname then alarm2;
actualscope:=findscopeno;
fpscope(paramnos):=actualscope;
if actualscope=0 or actualscope>8 then alarm2;
end
else
alarm2
end;
nextfp;
end
else
if fpname(paramnos+1,1)=real<:chang:> add 101 and
fpname(paramnos+1,2)=real<:kit:> then
begin
i:=findkitno;
if i=-2 and fpparam(1)=real<:all:> then i:=-1;
if i=-2 then alarm2;
nextfp;
if sep<>pointname and sep<>pointinteger then alarm2;
if sep=pointinteger and fpparam(1)>1 then alarm2;
catname(i,3):=fpparam(1);
if i=-1 then
for k:=0 step 1 until catalogs do
begin
catname(k,3):=fpparam(1);
catname(k,4):=fpparam(2);
end;
catname(i,4):=fpparam(2);
nextfp;
end
else
if fpname(paramnos+1,1)=real<:kit:> then
begin
actualkitno:=findkitno;
if actualkitno<-1 then alarm2;
nextfp
end
else
if fpname(paramnos+1,1)=real<:newsc:> add 111 and
fpname(paramnos+1,2)=real<:pe:> then
begin
if actualscope=9 then actualscope:=4;
if actualscope<4 then alarm2;
actualnewscope:=actualscope;
nextfp;
end
else
if fpname(paramnos+1,1)=real<:scope:> then
begin
paramnos:=paramnos+1;
fpscope(paramnos):=actualscope;
if actualscope>8 or actualscope=0 then alarm2;
fpname(paramnos,1):=fpname(paramnos,2):=real<::>;
nextfp
end
else
if bodoc then
begin
docnameparam:
paramnos:=paramnos+1;
fpname(paramnos,1):=fpname(paramnos,2):=real<::>;
fpdocname(paramnos,1):=fpparam(1);
fpdocname(paramnos,2):=fpparam(2);
nextfp;
if sep=pointname then
begin
if fpparam(1)<>real<:scope:> then alarm2;
nextfp;
if sep<>pointname then alarm2;
actualscope:=findscopeno;
if actualscope=0 or actualscope>8 then alarm2;
fpscope(paramnos):=actualscope;
nextfp;
end;
end
else
if fpname(paramnos+1,1)=real<:in:> and -,infile then
begin
nextfp;
if sep<>0 then begin paramno:=paramno+1; alarm2 end;
lastfp;
i:=1;
open(entry,4,string fpparam(increase(i)),0);
infile:=true;
nextfp;
end
else
alarm2;
goto loop;
exitloop:
if paramnos=0 then
begin
paramnos:=1;
fpscope(1):=7;
fpnewscope(1):=if actualnewscope=4 then 7 else actualnewscope;
fpkitno(1):=actualkitno;
fpname(1,1):=fpname(1,2):=
fpdocname(1,1):=fpdocname(1,2):=real<::>;
end;
close(entry,true);
for i:=1 step 1 until paramnos do
begin
param(i):=i;
fpscope(i):=fpscope(i)-
(if fpname(i,1)<>real<::> then 20 else
if fpdocname(i,1)<>real<::> then 10 else 0)
end;
for i:=1 step 1 until paramnos-1 do
begin
min:=fpscope(param(i));
k:=i;
for j:=i+1 step 1 until paramnos do
begin
cop:=fpscope(param(j));
if cop<min then
begin
min:=cop;
k:=j
end;
end;
if i<>k then
begin
min:=param(k);
param(k):=param(i);
param(i):=min
end;
end;
for i:=1 step 1 until paramnos do
fpscope(i):=fpscope(i)+
(if fpname(i,1)<>real<::> then 20 else
if fpdocname(i,1)<>real<::> then 10 else 0);
end parameterindlæsning;
open(entry,4,<:catalog:>,1 shift 18);
if monitor(52)create area process:(entry,0,iarr)>0 then
begin
write(out,<:<10>***save, create area process not possible:>);
goto savenotok
end;
vol:=1;
for cop:=1 step 1 until copies do
begin
readlabel;
writelabel(1);
end;
<*
1 buffer = segm*512.
if free core > (16000 bytes + 2 buffers) then
16000 bytes are reserved to avoid algolsegmentation
in central-loop and the remaining bytes are shared
between tape-zone and disc-zone as follows :
2 or 3 buffers available: 1 buffer for singlebuffered
tape-zone and the rest for single-
buffered disc-zone.
more than 3 buffers available: 2 buffers for doublebuffered
tape-zone and the rest for single-
buffered disc-zone.
if free core <= (16000 bytes + 2 buffers) then 1 buffer is reserved
for singlebuffered tape-zone and 1 buffer for singlebuffered disc-
zone.
*>
free:= system(2,0,input);
free:= if free > (16008+segm*512*2)
then free-16000
else segm*512*2 + 8;
buf:= if free < 4*segm*512 then 1 else 2;
size1:= buf*(2+segm*128);
size2:= (free-size1*4)//(segm*512)*segm*128;
begin
zone zbs(size2,1,harderror);
zone array ztape(copies,round(size1/copies)+(copies-1),buf*copies,tapeproc);
integer file,block;
procedure sterror(z,s,b);
zone z;
integer s,b;
begin
monitor(72)set catbase:(zhelp,0,interval);
stderror(z,s,b);
end sterror;
procedure tapeproc(z,s,b);
zone z;
integer s,b;
begin
if s shift (-18) extract 1=0 then sterror(z,s,b);
endtape:=true;
end tapeproc;
procedure changevol(int); integer int;
begin
integer i,j;
monitor(72,zhelp,0,interval);
if int=-1 then
write(out,<:<10>backspace to previous tape:>)
else
write(out,<:<10>tape shift:<10>:>,<<ddd>,entryno,
<: entr.,:>,<< ddddd>,totalsegm+segmno,<: segm.:>);
vol:=vol+int;
for cop:=1 step 1 until copies do
begin
outrec6(ztape(cop),blocksize);
changerec6(ztape(cop),100);
ztape(cop,1):=r:=real<::> add 4 shift 24 add 16;
ztape(cop,2):=real<::> add entryno shift 24
add (totalsegm+segmno);
fpno:=startfp(cop):=startfp(cop)+int;
infile:=false;
nextfp;
getmtname(0);
tapenames(cop,1):=fpparam(1);
tapenames(cop,2):=fpparam(2);
if vol>volumes then
tapenames(cop,1):=tapenames(cop,2):=real<::>;
ztape(cop,3):=tapenames(cop,1);
ztape(cop,4):=tapenames(cop,2);
for i:=5 step 1 until 25 do ztape(cop,i):=r;
end;
for cop:= 1 step 1 until copies do
begin
close(ztape(cop))release:(false add 1);
if vol > volumes then sterror(ztape(cop),1 shift 18,0);
end;
for cop:= 1 step 1 until copies do
begin
mount_med_ring;
writelabel(3);
i:= 1;
open(ztape(cop),modekind(cop),string tapenames(cop,increase(i)),
1 shift 18);
if int = 1 then setposition(ztape(cop),1,1);
end;
endtape:=false;
monitor(72,zhelp,0,entrybase);
end changevol;
procedure harderror(z,s,b);
zone z;
integer s,b;
begin
monitor(72,zhelp,0,interval);
if -,hard then
begin
if -,listnames then listentry(true);
errors:=errors+1;
hard:=true
end;
if s shift (-2) extract 1=1 or s shift (-5) extract 1=1 then
begin
write(out,<: entry in use:>);
if posvol<>vol then changevol(-1);
for cop:=1 step 1 until copies do
setposition(ztape(cop),if vol=1 then fileno(cop)
else 1, block);
rejected:=rejected+1;
entries(actualkitno):= entries(actualkitno)-1;
errors:=errors-1;
entryno:=entryno-1;
monitor(72,zhelp,0,entrybase);
goto exitdump
end;
write(out,<:<10> bad area::>);
for i:=23,i-1 while s<>0 do
begin
if s<0 then write(out,<:+1<60>:>,<<d>,i);
s:=s shift 1;
end;
b:=0;
monitor(72,zhelp,0,entrybase);
end harderror;
procedure listclock;
begin
integer field inf,clockadr,startext,seg;
boolean started;
procedure outdate;
begin
inf:=clockadr-2;
write(out,<: d.:>,<<zddddd>,zbs.inf,<:.:>);
end;
procedure outclock;
begin
write(out,<<zddd>,zbs.clockadr/100);
missingclock:=false;
end;
startext:=entry.contents extract 12+2;
if startext>502 then
begin
monitor(72,zhelp,0,interval);
write(out,<: entry inconsistent:>);
goto exitlistclock
end;
inrec6(zbs,512);
monitor(72,zhelp,0,interval);
seg:=entry.kind-1;
inf:=startext+2;
clockadr:=6+zbs.inf extract 12
+12*zbs.startext extract 12
+2*zbs.startext shift (-12) +startext;
if clockadr<=502 then
begin
outdate;
outclock
end
else
begin
started:=false;
nextsegm:
if clockadr=504 then
begin
outdate;
started:=true
end;
inf:=504; inf:=zbs.inf extract 12;
if clockadr<6 or inf>500 or seg=0 then
begin
write(out,<: code inconsistent:>);
goto exitlistclock
end;
clockadr:=clockadr-502+inf;
inrec6(zbs,512); seg:=seg-1;
if startext=502 then
begin
startext:=0;
clockadr:=clockadr-inf;
inf:=inf+2;
clockadr:=clockadr+zbs.inf extract 12;
end;
if clockadr>502 then goto nextsegm;
if -,started then outdate;
outclock;
end;
exitlistclock:
setposition(zbs,0,0);
monitor(72,zhelp,0,entrybase);
end listclock;
if copies = 2 then
begin
comment make two zones of a zonearray point at the
same buffer. ;
integer array bufsize,shares(1:2),ia(1:20);
bufsize(1):= size1; bufsize(2):= 2;
shares(1):= shares(2):= buf;
initzones(ztape,bufsize,shares);
allocbuf(ztape(2),ztape(1),0,size1*4);
getzone6(ztape(1),ia);
setzone6(ztape(2),ia);
end;
if listmore and sysdump then
write(out,<:<10>:>,sp,43,<:base:>);
for cop:=1 step 1 until copies do
begin
i:=1;
open(ztape(cop),modekind(cop),
string tapenames(cop,increase(i)),1 shift 18);
comment call blockproc at eot;
setposition(ztape(cop),fileno(cop),1);
end;
totalsegm:=entryno:=0;
inrecentry:
i:=inrec6(entry,34);
if i=0 then goto endinrecentry;
if entry.keys<>-1 then
begin
permkey:=entry.keys extract 3;
entrybase1:=entry.base(1); entrybase(1):=entrybase1;
entrybase2:=entry.base(2); entrybase(2):=entrybase2;
if entry.kind>=0 then
begin
fpparam(1):=entry.docname(1);
fpparam(2):=entry.docname(2);
actualkitno:=findkitno
end
else
begin
actualkitno:=entry.keys shift (-12);
if actualkitno>=2048 then actualkitno:=(actualkitno-2048)/2;
end;
k:=1;
kparam:
;
comment scan fpparameters;
paramno:=param(k);
ok:=fpkitno(paramno)=actualkitno or fpkitno(paramno)=-1;
if ok then
begin
r:=fpname(paramno,1);
scopekey:=fpscope(paramno);
actualscope:=if r<>real<::> then 10 else
if fpdocname(paramno,1)<>real<::> then 11
else scopekey;
nameandscopeloop:
ok:=case actualscope of (
entrybase1>=interval3 and entrybase2<=interval4,
permkey=3 and
entrybase1>=interval3 and entrybase2<=interval4,
permkey=3 and
entrybase1 =interval9 and entrybase2 =interval10,
findentryscope(actualscope,true),
permkey=3 and
entrybase1 =interval7 and entrybase2= interval8,
permkey=3 and
entrybase1 =interval5 and entrybase2 =interval6,
permkey=2 and
entrybase1 =interval3 and entrybase2 =interval4,
permkey=0 and
entrybase1 =interval1 and entrybase2 =interval2 ,
false,
entry.name(1)=r and entry.name(2)=fpname(paramno,2),
entry.docname(1)=fpdocname(paramno,1) and
entry.docname(2)=fpdocname(paramno,2) );
sysdump:=actualscope<3;
if ok then
begin
if actualscope>9 and scopekey<>0 then
begin
actualscope:=scopekey;
goto nameandscopeloop
end
else
if scopekey=0 then ok:=findentryscope(actualscope,false);
if actualscope=0 and fpnewscope(paramno)<>4 then
ok:=entrybase1<=interval1 and entrybase2>=interval2;
end
end;
if ok then
begin
i:= if scopekey=0 then 1 else
if scopekey=3 then 9 else (9-actualscope)*2-1;
iarr(1):=if sysdump then entrybase1 else interval(i);
iarr(2):=if sysdump then entrybase2 else interval(i+1);
monitor(72)set catbase:(zhelp,0,iarr);
if scopekey=0 and actualscope<>8 then
begin
comment check whether entry has smallest scope;
i:=1;
open(zbs,0,string entry.name(increase(i)),0);
close(zbs,false);
monitor(76)lookup head and tail:(zbs,0,iarr);
ok:=permkey=iarr.keys extract 3 and
entrybase1=iarr.base(1) and
entrybase2=iarr.base(2);
end;
if ok then
begin
comment dump;
k:=paramnos;
r:=entry.name(1);
if entrybase1 = -8388607 and
entrybase2 = 8388606 and
permkey = 1 then
begin
monitor(72,zhelp,0,interval);
outtext(out,-11,entry.name,1);
write(out,<: entry outside system - no dump :>);
rejected:= rejected + 1;
goto exitdump ;
end;
if r=real<:c:> or r=real<:v:> or r=real<:fp:> or
r=real<:primo:> add 117 and entry.name(2)=real<:t:> then
begin
if (scopekey=1 or scopekey=4 or scopekey=8)
and (r=real<:c:> or r=real<:v:>)
or (scopekey=1 or scopekey=4 or scopekey=7)
and r=real<:primo:> add 117
then goto exitdump;
monitor(72,zhelp,0,interval);
outtext(out,-11,entry.name,1);
write(out,<: not allowed:>);
rejected:=rejected+1;
goto exitdump
end;
i:=1;
open(zbs,4,string entry.name(increase(i)),1 shift 5 +1 shift 2);
if entry.kind>0 then
begin
i:=monitor(52<*create area proc*>,zbs,0,iarr);
if i<>0 then
begin
if i=1 then
begin
write(out,<:<10>create area process, areas exceeded:>);
goto save_not_ok;
end;
write(out,<:<10>catalog error, create area process, :>,
<:<10>monitor 52, result=:>,i);
goto inrecentry;
end;
end;
entryno:=entryno+1; entries(actualkitno):= entries(actualkitno)+1;
if endtape then changevol(1);
for cop:=1 step 1 until copies do
begin
comment entry record;
getposition(ztape(cop),i,block);
posvol:=vol;
outrec6(ztape(cop),blocksize);
changerec6(ztape(cop),100);
ztape(cop,1):=r:=real<::> add 1 shift 24
add (if sysdump then 52 else 48);
ztape(cop,2):=real<::> add entryno shift 24 add
(if entry.kind<0 then 0 else entry.kind);
ztape(cop,3):=entry.name(1);
ztape(cop,4):=entry.name(2);
if entry.kind>=0 then
begin
comment kitname;
entry.docname(1):=catname(actualkitno,3);
entry.docname(2):=catname(actualkitno,4);
end;
for i:=1 step 1 until 5 do
ztape(cop,4+i):=entry.tail(i);
scopekey:=fpnewscope(paramno)extract 10;
scopekey:=if sysdump then permkey else
if scopekey=4
then actualscope else scopekey;
ztape(cop,10):=scopekey;
ztape(cop,11):=catname(actualkitno,3);
ztape(cop,12):=catname(actualkitno,4);
ztape(cop,13):=if -,sysdump then r else
real<::> add entrybase1 shift 24 add entrybase2;
for i:=14 step 1 until 25 do ztape(cop,i):=r;
end entry record;
segmno:=0;
hard:=false;
listentry(listnames);
if entry.kind<=0 then goto exitdump;
if missingclock and listmore then listclock;
raf:= 8;
for i:= inrec6(zbs,0) while i > 2 do
begin comment segment record;
i:= i mod (segm*512);
if i = 0 then i:= segm*512;
if endtape then changevol(1);
for cop:= 1 step 1 until copies do
begin
outrec6(ztape(cop),blocksize);
if i+8 <> blocksize then changerec6(ztape(cop),8+i);
ztape(cop,1):= real<::> add 2 shift 24 add (8+i);
ztape(cop,2):= real<::> add entryno shift 24 add segmno;
end;
inrec6(zbs,i);
tofrom(ztape(1).raf,zbs,i);
segmno:= segmno+i//512;
end;
if segmno<>entry.kind then
begin
if -,hard and -,listnames then listentry(true)
else monitor(72,zhelp,0,interval);
write(out,<:<10> bad area, segm. saved =:>,
segmno);
monitor(72,zhelp,0,entrybase);
end;
slices(actualkitno):= slices(actualkitno) +
(segmno-1)//segm_pr_slice(actualkitno)+1;
totalsegm:=totalsegm+segmno;
exitdump:
fpnewscope(paramno):=fpnewscope(paramno)+1 shift 10;
close(zbs,-,(entry.name(1)=ownname1 and entry.name(2)=ownname2 and
entrybase1=ownbase1 and entrybase2=ownbase2));
end dump;
end ok;
k:=k+1;
if k<=paramnos then goto kparam;
end;
goto inrecentry;
endinrecentry:
monitor(72,zhelp,0,interval);
for cop:=1 step 1 until copies do
begin
comment end record;
outrec6(ztape(cop),blocksize);
changerec6(ztape(cop),100);
ztape(cop,1):=r:=real<::> add 3 shift 24add 8;
ztape(cop,2):=real<::> add entryno shift 24 add totalsegm;
for i:=3 step 1 until 25 do ztape(cop,i):=r;
close(ztape(cop),false);
end;
write(out,<:<10>:>,<<ddd>,entryno,<: entr.,:>,
<< ddddd>,totalsegm,<: segm.<10><10><10><10>:>);
document:= 8; sum:= 0;
for i:= 0 step 1 until catalogs do
begin
if slices(i) <> 0 then
begin
j:= slices(i) * segm_pr_slice(i);
sum:= sum + j;
write(out,sp,12-write(out,catname.document));
write(out,<:::>,<<dddd>,slices(i),<: slices * :>,
<<ddd>,segm_pr_slice(i),<: = :>,<<dddddd>,j,
<: segments:>,<< dddd>,entries(i),
<: entries<10>:>);
end;
document:= document + 16;
end;
if sum > 0 then write(out,<:<10>:>,sp,25,<:total = :>,
<<dddddd>,sum,<: segments <10><10>:>);
if rejected>0 then
write(out,<:<10>:>,<<ddd>,rejected,<: entr. rejected:>);
ok:=true;
for paramno:=1 step 1 until paramnos do
if fpnewscope(paramno) shift (-10)=0 then
begin
actualscope:=fpscope(paramno);
write(out,if ok then <:<10><10>***not found::> else
<:<10> :>);
ok:=false;
i:=1;
if fpname(paramno,1)<>real<::> then
write(out,string fpname(paramno,increase(i)),
if actualscope<>0 then <:.:> else <::>);
i:=1;
if fpdocname(paramno,1)<>real<::> then
write(out,<:docname.:>,string fpdocname(paramno,increase(i)),
if actualscope<>0 then <:.:> else <::>);
if actualscope<>0 then
write(out,<:scope.:>,case actualscope of (
<:all:>,<:perm:>,<:system:>,<:own:>,
<:project:>,<:user:>,<:login:>,<:temp:>));
i:=1;
if fpkitno(paramno)<>-1 then
write(out,<: kit.:>,
string catname(fpkitno(paramno),increase(i)));
end;
for cop:=1 step 1 until copies do
begin
comment write label on following file;
fileno(cop):=if vol<>1 then 2 else fileno(cop)+1;
infile:=false; writelabel(2);
end;
close(zbs,true);
open(zbs,0,<::>,0);
monitor(72)set catbase:(zbs,0,interval);
end block;
end;
if rejected>0 or errors>0 then
savenotok:
begin
write(out,<:<10>***save not ok :>,<<d>,errors+rejected);
errorbits:=1;
end
end;
boolean procedure openout(z,name);
zone z; array name;
begin integer i,result;
integer array ia(1:17);
long projectbaselow,projectbaseup;
system(11,0,ia);
projectbaselow:=ia(7);
projectbaseup :=ia(8);
i:=1; open(z,4,string name(increase(i)),0);
openout:=true;
result:=monitor(76,z,0,ia);
if result=2 then
begin
openout:=false; goto exit_openout;
end;
if result=0 <*found and system*> and
(extend ia(2)<projectbaselow or extend ia(3)>projectbaseup)
or result=3 <*not found*> then
begin
ia(1):=8<*size*>;
ia(2):=1;
for i:=3 step 1 until 10 do ia(i):=0;
ia(6):=systime(7,0,0.0);
openout:=monitor(40,z,0,ia)=0;
end
else
if result=0 then
begin
monitor(42,z,0,ia);
i:=ia(9) shift (-12);
if i=4 or i>=32 then ia(8):=0;
ia(6):=systime(7,0,0.0);
ia(7):=ia(9):=ia(10):=0;
openout:=monitor(44,z,0,ia)=0;
end;
exit_openout:
end openout;
integer procedure changearea(z,i); zone z; integer i;
begin integer array tail(1:10),ia(1:20);
monitor(42<*lookup*>,z,0,tail);
if i extract 1=1 then
begin
getzone6(z,ia);
tail(1):=ia(9);
end;
if i shift(-1) extract 1=1 then tail(6):=systime(7,0,0.0);
changearea:=monitor(44<*change*>,z,0,tail);
end changearea;
begin integer sep;
array fpparam(1:2);
real array field raf;
sep:=system(4,1,fpparam); raf:=0;
if sep shift (-12)<>6 then goto curout else
begin
zone z(128,1,stderror);
system(4,0,fpparam);
if -,openout(z,fpparam.raf) then goto curout;
program(z); write(z,false add 25,1);
changearea(z,1); close(z,true);
end;
end;
if false then
curout: program(out);
end
▶EOF◀