|
|
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: 87552 (0x15600)
Types: TextFile
Names: »incsavetxt«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦this⟧ »incsavetxt«
incsave=algol list.no xref.no blocks.no
begin
message vk 1981.03.30 incsave;
boolean last,total,std,list,outp,sys;
integer outres,date,i,segm,psegm;
long array input(1:2);
real array outarr(1:3);
long array tapename(1:2),ptapename(1:2),t1tapename(1:2);
zone zhelp(1,1,stderror);
procedure openout;
begin
long array outname(1:2);
outp:=true;
outname(1):=input(1);outname(2):=input(2);
fpproc(29)stack current out:(0,out,outarr);
outres:=201;
fpproc(28)connect out:(outres,out,outname);
if outres <> 0 then
begin
outp:=false;
fpproc(30)unstack out:(0,out,outarr);
write(out,<:<10> connect error= :>,outres);
end;
end;
procedure closeout;
begin
write(out,<:<10>:>);
if outp then
begin
fpproc(34)close up:(0,out,25);
fpproc(79)terminatezoe:(0,out,0);
fpproc(30)unstack out:(0,out,outarr);
end;
end;
\f
procedure readallparam;
begin
real array field rf;
comment
********************************************************
* *
* This procedure reads all the parameters to incsave. *
* *
********************************************************;
last:=true;
list:=true;total:=false;std:=false;
sys:=true;
rf:=0;
segm:=8;psegm:=8;
for i:= readparam(input) while i <> 0 do
begin
if i = -1 then
openout else
if input(1) = long <:segm:> then
begin
i:=readparam(input);
if i = 3 then segm:=input.rf(1) else paramerror(6);
end else
if input(1) = long <:since:> then
begin
i:=readparam(input);
if input(1) = long <:last:> then last:=true else
if i = 3 then
begin
last:=false;
date:=readdate;
end
else
paramerror(1);
end else
if input(1) = long <:total:> then
begin
i:=readparam(input);
if input(1) = long <:yes:> then total:=true
else if input(1) = long <:no:> then total:=false
else paramerror(2);
end else
if input(1) = long <:tape:> then
begin
sys:=false;
i:=readparam(tapename);
end else
if input(1) = long <:std:> then
begin
i:=readparam(input);
if input(1) = long <:yes:> then std:= true
else if input(1) = long <:no:> then std:=false
else paramerror(3);
end else
if input(1) = long <:list:> then
begin
i:=readparam(input);
if input(1) = long <:yes:> then list:=true
else if input(1) = long <:no:> then list := false
else paramerror(4);
end;
end;
end;
integer procedure readparam(val);long array val;
begin
own integer q;
integer ik;
if q>=0 then
begin
ik:= system(4,q,val);
ik:= (if ik shift (-12) = 8 then 2 else 0)+
ik shift(-2) extract 2;
if q = 0 then
begin
long array a(1:2);
if system(4,1,a)=6 shift 12 + 10 then ik:=-1;
end;
q:= if ik = 0 then -1 else q+1;
readparam:=ik;
end else readparam:=0;
end readparam;
\f
integer procedure readdate;
begin
real array field rf;
long array ra(1:2);
long d;
integer dd,mo,aa,hh,mm,ss,a,feb;
rf:=0;
d:=0;
a:=68;
hh:=0;mm:=0;ss:=0;
ra(1):=input.rf(1);
if ra(1) > 99 or ra(1) < 79 then paramerror(5);
aa:=ra(1); readparam(ra);
if ra.rf(1) >12 or ra.rf(1) < 1 then paramerror(5);
mo:=ra.rf(1); readparam(ra);
if ra.rf(1) < 1 then paramerror(5);
dd:=ra.rf(1); readparam(ra);
if ra.rf(1) > 23 then paramerror(5);
hh:=ra.rf(1);readparam(ra);
if ra.rf(1) > 59 then paramerror(5);
mm:=ra.rf(1);
feb:= if aa // 4*4=a/4*4 then 29 else 28;
if dd>(case mo of (31,feb,31,30,31,30,31,31,30,31,30,31))
then paramerror(5);
for i := i while a<aa do
begin
d:=d+(if a//4*4=a/4*4 then 366 else 365);
a:=a+1;
end;
d:=d+dd-1;
if aa//4*4=aa/4*4 and mo > 2 then d:=d+1;
if mo > 1 then
d:=d+(case mo-1 of (31,59,90,120,151,181,212,243,273,304,334,365));
d:=d*24*60*60+(hh*60*60+mm*60+ss);
readdate:=(d*320000) shift (-24) extract (24);
end readdate;
\f
procedure paramerror(errornum);
integer errornum;
begin
comment **************************************************
* *
* This procedure is used to write the errormessa-*
* ges.When tis procedure is entered the error *
* is hard and the program is terminated. *
* *
**************************************************;
case errornum of
begin
<*1*> write(out,<:<10>*** wrong since specification :>);
<*2*> write(out,<:<10>*** wrong total specification :>);
<*3*> write(out,<:<10>*** wrong standard specification :>);
<*4*> write(out,<:<10>*** wrong list specificaption :>);
<*5*> write(out,<:<10>*** wrong date specification :>);
<*6*> write(out,<:<10>*** wrong segm specefication:>);
<*7*> write(out,<:<10>*** wrong psegm specification:>);
end;
write(out,<:<10> insave stopped ***** :>);
goto halt;
end;
\f
procedure incrementdump;
begin
comment **************************************************
* *
* Declarations of global variabels. *
* *
**************************************************;
integer hashentries,pagenr,nooflisten,dumpensize,bittsize,
restondumps,dkey,mtrsize,ntape,noofentries,noofsegm,antalsegm,
notapen,mtsize,device,nenintemp,notapsegm,modekind,pfileno,
stofentry,filno,entrystart,blockno,bitpattern,newstofentry,
pblockno,pfno,pbno,takind,totalsegm,entryno,ntshift,tntshift,
dumpsize,outres,pdate,segmno,blocksize,trecordsize,
ptapenr,tapenr,labelno,i,ii,j,k,l,m,ik,jk,kk,today,
noofrecs,result,explanation,noofeninaux,totalsegmno,tq1;
real array sortname(1:6);
long array dcname(1:2),mt1pool(1:2),mtpool(1:2),
tname(1:2),dump1name(1:2),p2catname(1:2),pcatname(1:2),t2name(1:2),
tempname(1:2),tempdoc(1:2),
temp1name(1:2),
entryname(1:2),xlabel(1:25);
real array field raf;
long array field name,mtname,taname,docname,dname,tadocname,lo;
integer field lbase,ubase,mtdate,mtnr,permkey,talbase,taubase,
mttotal,tasize,size,kind,wordno,key,dbase1,dbase2,tasegmno,
startofbit,catnr,shortclock,contents,ih,mtno,dumpkey,proaddr;
integer array field startofbitt;
long rx;
real wdate,r,whour,lastdate,eof,maxhashsize;
boolean found,tapeshift,endtape,tendtape,identical,
ttest,t1test,missingclock,listmore,sysdump,int,ptapeshift,savenotok,
harderror,nomess1;
integer array entrybase(1:2),tail(1:10),iarr(1:10),interval(1:8),
param(1:7),keydescr(1:4,1:2),ttail(1:17);
zone entry(128,1,stderror);
zone newcat(128,1,stderror);
zone cat(128,1,stderror);
zone cat1(128,1,stderror);
zone outfil(128,1,stderror);
zone help(1,1,stderror);
zone help1(1,1,stderror);
zone mtrecord(128,1,stderror);
zone mt1record(128,1,stderror);
\f
procedure tapeproc(z,s,b);
zone z;
integer s,b;
begin
comment
***************************************************
* *
* This procedure is a blockprocedure used to test *
* endtape.If endtape is reached the boolean end- *
* tape is set to true. *
* *
***************************************************;
if s shift (-18) extract 1 = 0 then stderror(z,s,b);
endtape:=true;
end;
\f
procedure ptapeproc(z,s,b);
zone z;
integer s, b;
begin
comment
**************************************************
* *
* This procedure is also used to test endtape. *
* It is necsacary to have two becaurse this *
* procedure is working with an ther tape. *
* *
**************************************************;
if s shift (-18) extract 1 = 0 then stderror(z,s,b);
tendtape:=true;
end;
\f
procedure warning(warningno);
integer warningno;
begin
case warningno of
begin
<*1*>
begin
ii:=1;
write(out,<:<10> *** area process can not be created :>,
entry.name,<: not saved.:>);
if ttest then
begin
write(out,<:<10> size =:>,entry.kind);
write(out,<:<10>result of create= :>,i);
end;
end;
<*2*>
begin
ii:=1;
write(out,<:<10> *** The base of tempcat not ok.:>);
end;
<*3*>
begin
write(out,<:<10>:>);
write(out,<:<10> *** No savelabel on tape.
The label is now written:>);
end;
<*4*>
begin
write(out,<:<10> *** Wrong savelabel on :>);
write(out,tapename);
goto halt;
end;
end;
savenotok:=true;
end;
\f
procedure test(testno);
integer testno;
begin
comment **************************************************
* *
* This procedure is used to test the system. It *
* can be removed if the system is funktioning *
* *
**************************************************;
if ttest then
begin
case testno of
begin
write(out,<:<10>*** test 1:>);
write(out,<:<10>*** test 2:>);
write(out,<:<10>*** test 3:>);
write(out,<:<10>*** test 4:>);
write(out,<:<10>*** test 5:>);
write(out,<:<10>*** test 6:>);
end;
end;
end;
\f
procedure error(errorno);
integer errorno;
begin
comment **************************************************
* *
* This procedure is used to write the errormessa-*
* ges.When tis procedure is entered the error *
* is hard and the program is terminated. *
* *
**************************************************;
case errorno of
begin
<*1*>;
<*2*>;
<*3*>;
<*4*>;
<*5*>;
<*6*>;
<*7*> write(out,<:<10>*** Mtpool does not exist.:>);
<*8*> write(out,<:<10>*** Creation of temporary savecat not ok:>);
<*9*> write(out,<:<10>*** Savecat not renamed:>);
<*10*> write(out,<:<10>*** Tempcat does not exist:>);
<*11*> write(out,<:<10>*** Tempcat not ok :>);
<*12*> write(out,<:<10>*** Renaming tempcat impossibel:>);
<*13*> write(out,<:<10>*** creation of tem1cat not ok:>);
<*14*> write(out,<:<10>*** creation of new tempcat not ok :>);
<*15*> write(out,<:<10>*** creation of tem1cat not ok:>);
<*16*>
begin
write(out,<:<10>*** the catalog can not be sorted:>);
write(out,<: result of mdsortproc = :>,result);
write(out,<: explanantion = :>,explanation);
end;
end;
write(out,<:<10> insave stopped ***** :>);
goto halt;
end;
\f
procedure auxscan(idate);
integer idate;
begin
comment
********************************************************
* *
* This procedure search all auxcat through to find *
* those entries which shall be saved. *
* *
********************************************************;
procedure bsareaproc(z,s,b);
zone z;
integer s,b;
begin
if s shift (-23) extract 1 = 0 then stderror(z,s,b);
noofeninaux:=0;
write(out,<:<10>*** intervention from auxcat : :>);
write(out,auxcat);
int:=true;
end;
long array doc2name(1:2),en2name(1:2);
long array field d2name;
integer array iarr(1:20),ihelp(1:1),t2tail(1:10);
long array field tdocname;
integer field endate,hsize;
boolean field slize;
integer catalogs,ik,csize,coraddr;
long array catalog(1:2),auxcat(1:2),auxdoc1(1:2);
zone dumpcat(128,1,stderror),auxentry(128,1,bsareaproc);
slize:=1;
endate:=18;d2name:=18;
hsize:=16;tdocname:=2;
for i:=1 step 1 until 10 do tail(i):=0;
system(5) move core area:(92,iarr);
catalogs:= (iarr(3)-iarr(1))/2;
begin
long array auxdoc(1:catalogs,1:2);
long array catname(1:catalogs,1:2);
integer array catsize(1:catalogs,1:1);
test(1);
noofentries:=0;noofeninaux:=0;noofsegm:=0;
int:=false;
k:=iarr(1);
for j:=1 step 1 until catalogs do
begin
system(5)move core area:(k,ihelp);
k:=k+2;
system(5,ihelp(1)-2,iarr);
system(5,ihelp(1)-28,catalog);
test(2); open(entry,4, catalog,0);
i:=monitor(76)look up head and tail:( entry,0,iarr);
if ttest then write(out,<:<10> look up head and tail result=:>,i);
close(entry,true);
catname(j,1):=iarr.name(1);
catname(j,2):=iarr.name(2);
catsize(j,1):=iarr.hsize;
auxdoc(j,1):=iarr.docname(1);
auxdoc(j,2):=iarr.docname(2);
if ttest then
begin
write(out,
<:<10> catalog name =:>,iarr.name);
end;
end;
open(dumpcat,4,tname,0);
if monitor(42)lookupentry:(dumpcat,0,tail) <> 0 then
begin
tail(1):=100;
tail(2):=1;tail(3):=0;tail(4):=0;tail(5):=0;
i:=monitor(40)create entry:(dumpcat,0,tail);
if i <> 0 then error(13);
end;
for j:=1 step 1 until catalogs do
begin
test(3);
auxcat(1):=catname(j,1);
auxcat(2):=catname(j,2);
csize:=catsize(j,1);
open(help,0,auxcat,0);
close(help,false);
if monitor(76) lookup head and tail :(help,0,iarr) = 0 then
begin
open(auxentry,4,auxcat,1 shift 23);
noofeninaux:=0;
csize:=csize-1;
if int then goto intven;
for ik := inrec6(auxentry,0)
while ik > 0 and csize >= 0 and -,int do
begin
test(4);
if ttest then
write(out,<:<10> result of inrec6 =:>,ik);
if int then goto intven;
if ik = 2 then
begin
inrec6(auxentry,2);csize:=csize-1;
end else
begin
inrec6(auxentry,34);
if auxentry.key <>-1 and auxentry.key extract 3 = 3 then
begin
monitor(72)set catalog base:(zhelp,0,interval);
if auxentry.kind < 0 then
begin
if auxentry.kind <> 1 shift 23 + 4 then goto tsave else
begin
entryname(1):=auxentry.name(1);
entryname(2):=auxentry.name(2);
if entryname(1) = auxentry.docname(1) and
entryname(2) = auxentry.docname(2) then goto tsave;
entrybase(1):=auxentry.lbase;
entrybase(2):=auxentry.ubase;
i:=monitor(72)set catalog base:(zhelp,0,entrybase);
if i <> 0 then goto nottosave;
open(help,0,auxentry.docname,0);
close(help,false);
ii:=monitor(76)lookup head and tail:(help,0,iarr);
if ttest then
begin
write(out,<:<10> result of lookupheadandtail= :>,i);
write(out,<:<10> doc222name= :>,
iarr.docname);
end;
while iarr.kind < 0 and ii = 0 do
begin
if iarr.kind <> 1 shift 23 + 4 then goto tsave;
entrybase(1):=iarr.lbase;
entrybase(2):=iarr.ubase;
monitor(72)set catalog base:(zhelp,0,entrybase);
open(help,0,iarr.docname,0);
close(help,false);
ii:=monitor(76)look up head and tail:(help,0,iarr);
if ttest then write(out,<:name22= :>,
iarr.docname);
end;
if ii <> 0 then goto tsave;
if ii = 0 then
begin
doc2name(1):=iarr.docname(1);
doc2name(2):=iarr.docname(2);
en2name(1):=iarr.name(1);
en2name(2):=iarr.name(2);
if ttest then write(out,<:<10>docname = :>,
auxentry.docname);
if ttest then write(out,<:<10> doc2name= :>,
doc2name);
ii:=lookupaux(en2name,doc2name,t2tail);
if ii <> 0 and ttest
then write(out,<:<10> result of lookupaux= :>,ii);
if ttest then write(out,<:<10>date =:>,t2tail(2));
if idate > t2tail(2) then goto nottosave;
end else goto nottosave;
end;
end else
if auxentry.endate < idate then goto nottosave;
test(5);
antalsegm:=antalsegm+auxentry.size;
tsave:
monitor(72)set catalog base:(zhelp,0,interval);
entrybase(1):=auxentry.lbase;
entrybase(2):=auxentry.ubase;
entryname(1):=auxentry.name(1);
entryname(2):=auxentry.name(2);
if entryname(1) = mtpool(1) and
entryname(2) = mtpool(2) and
entrybase(1) = interval(5) and
entrybase(2) = interval(6) then goto nottosave;
if entryname(1) = dcname(1) and
entryname(2) = dcname(2) and
entrybase(1) = interval(5) and
entrybase(2) = interval(6) then goto nottosave;
if entryname(1) = pcatname(1) and
entryname(2) = pcatname(2) and
entrybase(1) = interval(5) and
entrybase(2) = interval(6) then goto nottosave;
if t1test and entryname(1) = long <:primo:> add 115 then
begin
write(out,<:<10>entry name =:>,
entryname);
write(out,<:<10> date of entry = :>,auxentry.endate);
end;
open(help,0, entryname,0);
i:=monitor(72)set entry base:(zhelp,0,entrybase);
if i <> 0 then goto nottosave;
if ttest then
begin
write(out,<:<10>entry name:>,
entryname);
write(out,<:<10>set entry base result =:>,i);
end;
i:=monitor(76)lookup head and tail:(help,0,iarr);
if i <> 0 then goto nottosave;
if ttest then
write(out,<:<10> lookup entry result = :>,i);
monitor(72)set catalog base:(zhelp,0,interval);
outrec6(dumpcat,34);
tofrom(dumpcat,auxentry,34);
if iarr.kind >= 0 then
begin
dumpcat.docname(1):=iarr.docname(1);
dumpcat.docname(2):=iarr.docname(2);
end else
begin
dumpcat.docname(1):=auxdoc(j,1);
dumpcat.docname(2):=auxdoc(j,2);
end;
if ttest then
begin
write(out,<:<10>docname=:>,
iarr.docname);
end;
noofeninaux:=noofeninaux+1;
nottosave:
close(help,false);
end;
if ttest and ik = 2 then
write(out,<:<10>csize=:>,csize);
end;
end;
if ttest then
begin
write(out,<:<10> catalog with the following name :>);
write(out, auxcat);
write(out,<: is searched through.:>);
end;
intven:
int:=false;
noofentries:=noofentries+noofeninaux;
close(auxentry,true);
end;
end;
end;
monitor(72)set catalog base:(zhelp,0,interval);
close(dumpcat,true);
end;
long procedure dumplabel(ii ,typ);
integer ii,typ;
begin
long spaces,stop;
comment
*********************************************************
* *
* returns the i'the real of a savelabel *
* 1: dump *
* 2-3: tapename *
* 4: filno *
* 5: vers. *
* 6: date *
* 7: hour *
* 8: segments *
* 9-10: dumplabelname *
* 11: emtty *
* 12-13: emtty *
* 14: <:nl:> *
* 15: <:em:> *
* The dumplabel is a text which may be read by *
* edit. *
* *
*********************************************************;
long procedure convintg(n);
value n;
integer n;
comment
***********************************************************
* *
* Converts a non negative integer to a text portion *
* with the layout <<zddddd>. *
* *
***********************************************************;
convintg:=if n <10 then long <:00000:> add (n+48)
else convintg (n//10) shift 8 add (n mod 10+48);
\f
long procedure spacefill(text);
value text;
long text;
begin
comment spacefill will replace trailing nulls by spaces;
integer i;
if text = long <::> 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:= long <: :> add 32;
stop:= long <:<10>:>;
dumplabel:= case ii of (
spacefill(long <:dump:>),
spacefill(tapename(1)),
spacefill(tapename(2)),
spacefill(convintg(filno) shift 24),
spacefill( case typ of ( long <:vers.:>,
long <:empty:>, long <:cont.:>)),
convintg(wdate),
spacefill(long <: .:> add
( convintg(whour) extract 16) shift 24 ),
if typ = 2 then spaces else
spacefill( long <:s=0:> shift (-24) add segm shift 24),
spacefill(tapename(1)),
spacefill(tapename(2)),
spacefill(spaces),
spacefill(spaces),
spacefill(spaces),
stop,
long <:<25>:> shift (-8));
end dumplabel;
\f
procedure writelabel(typ);integer typ;
begin
zone zlabel(25,1,eror);
procedure eror(z,s,b);zone z; integer s,b;
if s shift 5 >= 0 then stderror(z,s,b); <*ignore eot*>
if sys then
open(zlabel,modekind, t1tapename,0) else
open(zlabel,modekind,tapename,0);
setposition(zlabel,if typ = 2 then 2 else 1,0);
systime(1,0,r);
wdate:=systime(2,r,r);
whour:=r/10000-0.3;
outrec6(zlabel,100);
if typ = 2 then filno:=2 else filno:=1;
for i:=1 step 1 until 15 do zlabel.lo(i):=dumplabel(i,typ);
for i:=16 step 1 until 25 do zlabel.lo(i):= long <::>;
if typ = 2 then setposition(zlabel,-1,0);
if typ = 3 then
zlabel.lo(25):=long <::> add entryno shift 24 add (segmno-1);
if typ = 3 then
begin
for i:=1 step 1 until 25 do xlabel(i):=zlabel.lo(i);
end;
if list and typ = 1 then
begin
for i:=1 step 1 until 25 do xlabel(i):=zlabel.lo(i);
write(out,<:<10>:>);
write(out,<:<10>savelabel: :>, zlabel);
end;
close(zlabel,false);
end;
\f
procedure testlabel(update);
boolean update;
begin
integer array ia(1:8);
zone pttape(2*130,2,tapeproc);
long array field lo;
lo:=0;
labelno:=1;
open(pttape, modekind, tapename,0);
setposition(pttape,labelno,0);
i:=inrec6(pttape,0);
if i <> 100 then
begin
warning(3);
if update then
begin
close(pttape,false);writelabel(1);
goto la;
end;
end
else inrec6(pttape,100);
if pttape.lo(2) <> dumplabel(2,1) or pttape.lo(3) <> dumplabel(3,1) then
begin
tapename(1):=pttape.lo(2);
tapename(2):=pttape.lo(3);
write(out,<:<10>:>);
warning(4);
end;
if update then
begin
setposition(pttape,labelno,0);
systime(1,0,r);
wdate:=systime(2,r,r);
whour:= r/10000 - 0.3;
outrec6(pttape,4*25);
for i:= 1 step 1 until 15 do
pttape.lo(i):= xlabel(i):=dumplabel(i,1);
for i:= 16 step 1 until 25 do pttape.lo(i):= xlabel(i):=long <::>;
if list then
begin
write(out,<:<10>:>);
write(out,<:<12>:>,"sp",60,<:page :>,pagenr);
write(out,<:<10>savelabel: :>, xlabel);
nooflisten:=1;
pagenr:=pagenr+1;
end;
end else
begin
psegm:=pttape(8) shift (-24) extract 8;
psegm:=if psegm = 32 then 1 else psegm-48;
end;
close(pttape,false);
la:
end;
\f
procedure fletcatalog;
begin
integer array ia(1:10);
integer pentryno,pentry;
comment
*******************************************************
* *
* This procedure merged the two catalog tempcat and *
* tem1cat together. *
* *
*******************************************************;
zone dumpcat(128,1,stderror),dump(128,1,stderror),
cat(128,1,stderror);
integer l,antal,catsize;
integer field ih;
long array field lname;
boolean more;
long array field tadocname;
integer array ttail(1:17);
zone help1(1,1,stderror);
procedure indump;
begin
if pentry < pentryno then
begin
inrec6(dump,34);
while dump.key = - 1 do inrec6(dump,34);
pentry:=pentry+1;
if ttest then write(out,<:<10>indump called :>);
end else more:=false;
end;
procedure outdump;
begin
if ttest then
begin
write(out,<:<10>outdump called:>);
write(out,<:<10> navn = :>, dump.name);
end;
notapen:=notapen+1;
outrec6(cat,34);
tofrom(cat,dump,34);
indump;
end;
procedure outcat;
begin
i:=i+1;
if t1test then
begin
write(out,<:<10> antal = :>,i);
write(out,<:<10> navn1= :>, dumpcat.name);
end;
outrec6(cat,34);
tofrom(cat,dumpcat,34);
if i <= noofentries then inrec6(dumpcat,34);
end;
notapen:=0;
lname:=6;more:=true;
monitor(72)set catalog base:(zhelp,0,interval);
open(dumpcat,4, tempname,0);
open(dump,4, pcatname,0);
monitor(42)lookupentry:(dump,0,tail);
pentryno:=tail(10);
pentry:=1;
t2name(1):=0;
t2name(2):=0;
monitor(42)look up entry:(dumpcat,0,tail);
catsize:=tail(1);
k:= monitor(42)look up entry:(dump,0,tail);
if k <> 0 then error(10);
catsize:=catsize+tail(1)+1;
for l:=1 step 1 until 10 do tail(l):= 0;
tail(1):=catsize;
tadocname:=2;
tail(2):=1;
tail(3):=0;tail(4):=0;tail(5):=0;
open(cat,4, p2catname,0);
monitor(48)remove entry:(cat,0,ia);
if monitor(40)create entry:(cat,0,tail) <> 0 then error(14);
setposition(cat,0,0);
if k <> 0 then goto nopcat;
antal:=0;
l:=0;
setposition(dump,0,0);
inrec6(dumpcat,34);inrec6(dump,34);
i:=1;j:=0;
while i <= noofentries or more do
begin
j:=j+1;
if -, more and i <= noofentries then outcat else
begin
if more then
begin
while dump.key = -1 do
begin
indump;
if -,more then goto la1;
end;
end;
open(help1,0, dump.name,0);
entrybase(1):=dump.lbase;entrybase(2):=dump.ubase;
monitor(72) set catalog base:(zhelp,0,entrybase);
k:= monitor(76)look up head and tail:(help1,0,ttail) ;
monitor(72)set catalog base:(zhelp,0,interval);
if k <> 0 or
dump.lbase <> ttail(2) or dump.ubase <> ttail(3) then
begin
if ttest then write(out,<:<10>name=:>,
dump.name);
end;
close(help1,false);
if i > noofentries then outdump else
begin
if dumpcat.lname(1) < dump.lname(1) then outcat else
begin
if dumpcat.lname(1) = dump.lname(1) then
begin
if dumpcat.lname(2) < dump.lname(2) then outcat else
begin
if dumpcat.lname(2) = dump.lname(2) then
begin
if dumpcat.lbase < dump.lbase then outcat else
begin
if dumpcat.lbase = dump.lbase then
begin
if dumpcat.ubase < dump.ubase then outcat else
begin
if dumpcat.ubase = dump.ubase then
begin
outcat;indump;
end else outdump;
end;
end else outdump;
end;
end else outdump;
end;
end else outdump;
end;
end;
end;
la1:
end;
while more and i>= noofentries do
outdump;
noofentries:=noofentries+notapen;
if t1test then write(out,<:<10> no of entries = :>,noofentries);
for i:= 1 step 1 until 15 do
begin
outrec6(cat,34);
for ih:=2 step 2 until 34 do cat.ih:=-1;
end;
tadocname:=0;
setposition(cat,0,0);
close(cat,true);
close(dump,true);
i:=monitor(40)look_up_entry:(cat,0,tail);
tail(1):=(noofentries+1)//15 +1;
i:=monitor(44)change_entry:(cat,0,tail);
if i <> 0 then error(11);
nopcat:
close(dumpcat,true);close(dump,true);
end;
\f
procedure mount_med_ring(ring);
boolean ring;
begin
integer array ia(1:12),m(1:8);
zone z(128,1,stderror);
for i:=1 step 1 until 8 do m(i):=0;
m(5):=tapename(1) shift (-24) extract 24;
m(6):=tapename(1) extract 24;
m(7):=tapename(2) shift (-24) extract 24;
m(8):=tapename(2) extract 24;
open(z,0, tapename,0);
if monitor(4)process desc:( z,0,ia) = 0 then
begin
m(1):=16 <*opmess*> shift 12;
m(2):= long <:rin:> shift (-24) extract 24;
m(3):= long <:g:> shift (-24) extract 24;
m(4):= 32 shift 16;
system(10)parrant message:(0,m);
end;
sense:
monitor (6)initialize process:( z,0,ia);
getshare6(z,ia,1);
ia(4):=0;
setshare6(z,ia,1);
monitor (16)send message:( z,1,ia);
if monitor(18)wait answer:(z,1,ia) <> 1 <*not normal*> then
begin
comment not mounted;
ia(1):= (if device = 0 then 14 shift 12 else
32 shift 12 +1 shift 9) + 1 shift 0;
ia(2):= long <:mou:> shift (-24) extract 24;
ia(3):= long <:nt:> shift(-24) extract 24;
ia(4):= device;
for i:= 5 step 1 until 8 do ia(i):=m(i);
system(10,0,ia);
goto sense;
end
else
if ring then
begin
if ia(1) shift (-15) extract 1 = 0 then
begin
close(z,false);
open(z,4 shift 12 + 18, tapename,0);
ia(1):= 18<*ring*> shift 12 + 1 shift 0;
ia(2):= long <:rin:> shift (-24) extract 24;
ia(3):= long <: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;
\f
procedure inittempcat(rname);
long array rname;
begin
comment
**********************************************************
* *
* This procedure is used to initialise tempcat and tem1- *
* cat. *
* *
**********************************************************;
integer field a;
open(cat,4, rname,0);
i:=monitor(42)look up entry:(cat,0,iarr);
if i <> 0 then
begin
iarr(1):=10;
monitor(40)create entry:(cat,0,iarr);
end;
for i:= 1 step 1 until iarr(1) do
begin
setposition(cat,0,i);
outrec6(cat,512);
for ik := 1 step 1 until 256 do
begin
a:=ik*2;
cat.a:=-1;
end;
end;
close(cat,true);
end;
\f
procedure initnewcat;
begin
comment
*************************************************************
* *
* This procedure initialise the new dumpcat so that every *
* word of it contains -1. This is only done if an reorgani- *
* sation of dumpcat is nessacary. *
* *
*************************************************************;
integer field a;
for i:= 0 step 1 until hashentries-1 do
begin
setposition(newcat,0,i);
outrec6(newcat,512);
for ik:=1 step 1 until 256 do
begin
a:=ik*2;
newcat.a:=-1;
end;
a:=2;newcat.a:=0;
end;
end;
\f
procedure reorg;
begin
\f
procedure computenewhash;
begin
integer array primtal(1:19);
integer primi;
primtal(1):=101;
primtal(2):=167;
primtal(3):=217;
primtal(4):=373;
primtal(5):=557;
primtal(6):=787;
primtal(7):=1103;
primtal(8):=1657;
primtal(9):=2459;
primtal(10):=3671;
primtal(11):=5449;
primtal(12):=8039;
primtal(13):=12073;
primtal(14):=18013;
primtal(15):=27091;
primtal(16):=40111;
primtal(17):=60811;
primtal(18):=90203;
primi:=1;
while hashentries > primtal(primi) do primi:=primi+1;
hashentries:=primtal(primi+1);
end;
integer array duname(1:10);
integer field a;
integer array field point;
long array cname(1:2);
integer oldhashentries;
monitor(72)set catalogbase:(zhelp,0,interval);
point:=0;
write(out,<:<10> --- the dumpcat is reorganised:>);
oldhashentries:=hashentries;
computenewhash;
for i:=1 step 1 until 10 do tail(i):=0;
tail(1):=hashentries;
tail(2):=1;
tail(7):=dumpensize;tail(9):=11 shift 12;
cname(1):=long <::>;cname(2):=long <::>;
open(newcat,4, cname,0);
if monitor(40)create entry:(newcat,0,tail) <> 0 then error(8);
monitor(74)setentry base:(newcat,0,interval);
open(cat,4, dump1name,0);
initnewcat;
for i:=0 step 1 until oldhashentries-1 do
begin
setposition(cat,0,i);
swoprec6(cat,2);
rhashentry;
while cat.catnr=-1 do rhashentry;
dkey:=hashkey(cat.dname);
setposition(newcat,0,dkey);
swoprec6(newcat,2);
if newcat.catnr = -1 then newcat.catnr:=0;
newcat.catnr:=newcat.catnr+1;
swoprec6(newcat,dumpensize);
k:=1;
while newcat.catnr <> -1 do swoprec6(newcat,dumpensize);
tofrom(newcat,cat,dumpensize);
newcat.catnr:=dkey;
end;
for i:=1 step 1 until 10 do duname(i):=0;
for i:=1 step 1 until 4 do duname(i):=dump1name.point(i);
close(cat,true);
monitor(48)remove entry:(cat,0,tail);
close(newcat,true);
if monitor(46)rename_entry:( newcat,0,duname) <> 0 then error(9);
end;
\f
procedure hashtsize;
begin
comment
********************************************************
* *
* This procedure finds out how many entries there are *
* in the hash table and if there is more than maxhash- *
* size it is reorganised *
* *
********************************************************;
integer field c;
integer nr_of_en;
c:=2;
nr_of_en:=0;
open(cat,4, dump1name,0);
for i:=0 step 1 until hashentries-1 do
begin
setposition(cat,0,i);
inrec6(cat,1);
nr_of_en:=nr_of_en+cat.c;
end;
close(cat,true);
if ttest then write(out,<:<10>*** size of hashtable= :>,nr_of_en);
if nr_of_en / (hashentries * 28) > maxhashsize then reorg;
end;
\f
procedure rhashentry;
begin
k:=swoprec6(cat,0);
if k = 0 then
begin
setposition(cat,0,0);
swoprec6(cat,2);
end;
if k = 512 then swoprec6(cat,2);
if k = restondumps then
begin
swoprec6(cat,k);
k:=swoprec6(cat,0);
if k = 0 then
setposition(cat,0,0);
swoprec6(cat,2);
swoprec6(cat,dumpensize);
end
else
swoprec6(cat,dumpensize);
end;
\f
procedure dumpcatupdate(nrfiles,nr,stentry);
integer nrfiles,nr,stentry;
begin
integer bitno;
comment
*******************************************************
* *
* This procedure will for the entries in the catalog *
* to the tape copied that day update in dumpcat. *
* nrfiles: specifies how many entries that is to be *
* updated. *
* nr : specifies the tapenr *
* ststentry: specifies where the entries start in the *
* catalog. *
* *
*******************************************************;
\f
procedure removedumpbit;
begin
comment
******************************************************
* *
* This procedure removes the bit beloning to nr in *
* the whole dumpcat. *
* *
******************************************************;
boolean procedure bitsat(bitnummer);integer bitnummer;
begin
bitsat:= if cat.wordno shift(-bitnummer) extract 1 = 1 then
true else false;
end;
integer noonsegm,nremoved,word1;
integer field place;
boolean empty;
if ttest then write(out,<:<10>bit=:>,bitno,
<:<10>bitmoenster =:>,bitpattern);
empty:=true;
nremoved:=0;
open(cat,4, dump1name,0);
for i:= 0 step 1 until hashentries-1 do
begin
setposition(cat,0,i);
swoprec6(cat,2);
noonsegm:=cat.catnr;
if ttest then write(out,<:<10>antal=:>,noonsegm);
while noonsegm > 0 do
begin
if ttest then write(out,<:<10> antal1 = :>,noonsegm);
rhashentry;
while cat.catnr = -1 do rhashentry;
word1:=cat.wordno;
if bitsat(bitno) then
cat.wordno:=exor(cat.wordno,bitpattern);
if ttest and word1 <> cat.wordno
then write(out,<:word2 = :>,cat.wordno);
for j:=1 step 1 until bittsize do
empty:= empty and (cat.startofbitt(j) = 0);
if empty then
begin
for ik:= 1 step 1 until dumpsize do
begin
place:=ik*2;
cat.place:=-1;
end;
nremoved:=nremoved+1;
end;
noonsegm:=noonsegm-1;
end;
if nremoved > 0 then
begin
setposition(cat,0,i);
swoprec6(cat,2);
cat.catnr:=cat.catnr-nremoved;
nremoved:=0;
end;
end;
close(cat,true);
end;
\f
zone catentry(128,1,stderror);
comment cat is a zone to dumpcat and catentry is a zone to catalog;
integer dkey,noonsegm;
boolean identical,found;
if ttest then write(out,<:<10>bandnr=:>,nr);
bitno:=(nr-1) mod 24;
bitpattern:=1shift(bitno );
wordno:=((nr-1)//24) +startofbit;
if nrfiles <> 1 then removedumpbit;
hashtsize;
open(cat,4, dump1name,0);
open(catentry,4, p2catname,0);
setposition(cat,0,0);
setposition(catentry,0,0);
if ttest then
begin
write(out,<:<10> stentry= :>,stentry,<: nrfiles = :>,nrfiles);
end;
for i:=1 step 1 until stentry do
begin
k:=inrec6(catentry,0);
if k = 2 then inrec6(catentry,2);
inrec6(catentry,34);
if catentry.key = -1 then
begin
k:=inrec6(catentry,0);
if k = 2 then inrec6(catentry,0);
inrec6(catentry,34);
end;
end;
i:=inrec6(catentry,0);
if i = 2 then inrec6(catentry,2);
for i:=1 step 1 until nrfiles do
begin
identical:=found:=false;
inrec6(catentry,34);
while catentry.key = -1 do
begin
k:=inrec6(catentry,0);
if k = 2 then
begin
inrec6(catentry,k);
k:=inrec6(catentry,0);
end;
if k = 0 then goto stop;
inrec6(catentry,34);
end;
dkey:=hashkey(catentry.name);
if ttest then
begin
write(out,<:<10> hash key = :>,dkey);
write(out,<: for the entry with name =:>);
write(out, catentry.name);
end;
setposition(cat,0,dkey);
swoprec6(cat,2);
noonsegm:=cat.catnr;
while noonsegm > 0 do
begin
rhashentry;
while cat.catnr = -1 do rhashentry;
identical:=cat.dname(1)=catentry.name(1) and
cat.dname(2)=catentry.name(2) and
cat.dbase1=catentry.lbase and
cat.dbase2=catentry.ubase and
cat.dumpkey extract 3 = catentry.key extract 3;
if identical then
begin
found:=true;
cat.wordno:=logor(cat.wordno,bitpattern);
noonsegm:=0;
end
else
noonsegm:=noonsegm-1;
end;
if -, found then
begin
setposition(cat,0,dkey);
swoprec6(cat,2);
cat.catnr:=cat.catnr+1;
rhashentry;
while cat.key <> -1 do rhashentry;
cat.key:=dkey;
cat.dname(1):=catentry.name(1);
cat.dname(2):=catentry.name(2);
cat.dbase1:=catentry.lbase;
cat.dbase2:=catentry.ubase;
cat.dumpkey:=catentry.key extract 3;
if catentry.kind >= 0 then cat.dumpkey:=cat.dumpkey + 16;
for j:= 1 step 1 until bittsize do cat.startofbitt(j):=0;
cat.wordno:=bitpattern;
end;
end;
stop:
close(catentry,true);
close(cat,true);
i:=monitor(40)lookupentry:(cat,0,tail);
tail(1):=hashentries;
monitor(44)changeentry:(cat,0,tail);
end;
\f
procedure gettapename(taptotal);
integer taptotal;
begin
comment
*******************************************************
* *
* This procedure will search the mtpool through. It *
* will find the oldest tape which is used to total or *
* not depending on the variabel taptotal. *
* *
*******************************************************;
integer field antal;
long d;
integer tapnr,thisday,a;
integer lastdate;
integer day,mounth,year;
systime(1,0,r);
wdate:=systime(2,r,r);
day:=wdate;
day:=day//10000;
mounth:=wdate;
mounth:=mounth//100 - day*100;
year:=wdate;
year:=year-day*10000-mounth*100;
d:=0;a:=68;
for i:=i while a < year do
begin
d:=d+(if a//4*4=a/4*4 then 366 else 365);
a:=a+1;
end;
d:=d+day-1;
if mounth > 1 then
d:=d+(case mounth-1
of (31,59,90,120,151,181,212,243,273,304,334,365));
d:=d*24*60*60;
a:=0;
thisday:=systime(7,a,0.0);
lastdate:=8388604;
antal:=2;
open(mtrecord,4, mt1pool,0);
i:=monitor(42)look up entry:(mtrecord,0,tail);
if i<> 0 then error(7);
inrec6(mtrecord,2);
ntape:=mtrecord.antal;
for i:= 1 step 1 until ntape do
begin
inrec6(mtrecord,mtrsize);
if ttest then write(out,<:<10>mtnr = :>,mtrecord.mtnr);
if taptotal = mtrecord.mttotal extract 4 and
lastdate > mtrecord.mtdate then
begin
lastdate:=mtrecord.mtdate;
tapnr:=mtrecord.mtnr;
end;
end;
setposition(mtrecord,0,0);
today:=thisday;
swoprec6(mtrecord,2);
for i:=1 step 1 until tapnr do
begin
if ttest then write(out,<:<10>i = :>,i);
swoprec6(mtrecord,mtrsize);
end;
t1tapename(1):=mtrecord.mtname(1);
t1tapename(2):=mtrecord.mtname(2);
tapenr:=mtrecord.mtnr;
mtrecord.mtdate:=thisday;
mtrecord.mttotal:=mtrecord.mttotal+16;
close(mtrecord,true);
if ttest then
begin
for k:= 1 step 1 until 100 do
begin
write(out,<:<10>tape to use = :>, t1tapename);
end;
end;
end;
\f
real procedure dateofpdump;
begin
comment
*****************************************************
* *
* This procedure finds the date of the privios dump *
* in the mtpool. *
* *
*****************************************************;
zone mtrecord(128,1,stderror);
integer field antal;
real gdate;
antal:=2;
gdate:=0;
open(mtrecord,4, mtpool,0);
if monitor(42)look up entry:(mtrecord,0,tail) <> 0 then error(7);
setposition(mtrecord,0,0);
inrec6(mtrecord,2);
ntape:=mtrecord.antal;
for i:=1 step 1 until ntape do
begin
inrec6(mtrecord,mtrsize);
comment if mtrecord.mttotal >= 16 then gdate:=mtrecord.mtdate;
if mtrecord.mtdate > gdate then gdate:=mtrecord.mtdate;
end;
close(mtrecord,true);
dateofpdump:=gdate;
end;
\f
procedure gettape(getdate,number);integer getdate, number;
begin
comment
********************************************************
* *
* This procedure delivers the tapename and tapenr equal*
* to getdate and number, which it finds in mtpool. *
* *
********************************************************;
zone mtrecord(128,1,stderror);
boolean found;
found:=false;
if ttest then
begin
write(out,<:<10>pdate = :>,getdate,<:number = :>,number);
end;
open(mtrecord,4, mt1pool,0);
if monitor(42)look up entry :(mtrecord,0,tail) <> 0 then error(7);
setposition(mtrecord,0,0);
swoprec6(mtrecord,2);
if ttest then write(out,<:<10>getdate = :>,
getdate,<:<10>number = :>,
number);
while -, found do
begin
swoprec6(mtrecord,mtrsize);
if ttest then write(out,<:<10> date = :>,mtrecord.mtdate,
<:<10> mtno =:>,mtrecord.mtno,
<:<10>mttotal = :>,mtrecord.mttotal);
if mtrecord.mtdate = getdate
then
begin
found:=true;
if mtrecord.mttotal > 16 then
begin
nomess1:=false;
ptapename(1):= long <::>;
ptapename(2):= long <::>;
end else
begin
ptapename(1):=mtrecord.mtname(1);
ptapename(2):=mtrecord.mtname(2);
ptapenr:=mtrecord.mtnr;
end;
if mtrecord.mttotal > 2 then
mtrecord.mttotal:=mtrecord.mttotal-16;
end;
end;
close(mtrecord,true);
if ttest then
begin
write(out,<:<10> name of previous tape = :>,
tapename);
end;
end;
\f
integer procedure hashkey(hname);long array hname;
begin
comment
******************************************************
* *
* This procedure computes the hashkey used to insert *
* the entry in the dumpcat. *
* *
******************************************************;
long sum,part_1_of_name,part_2_of_name;
part_1_of_name:= hname(1);
part_2_of_name:= hname(2);
sum:=part_1_of_name+part_2_of_name;
sum:=sum shift (-24)+sum extract (24);
sum:=(sum extract 24 + (sum shift (-12) shift 36) ) shift (-36);
sum:=sum extract 24;
hashkey:= sum mod hashentries;
end;
\f
procedure tapedump;
begin
zone tape(segm*2*130,2,tapeproc);
zone ptape(2*(psegm*130),2,ptapeproc);
\f
procedure changevol(nr);
integer nr;
begin
comment ******************************************************
* *
* This procedure will find a new tape and this is to *
* be mounted. *
* case nr of *
* 1: the tape is used to usual dump *
* 2: the tape is a privius dumptape *
* 3: the tape is a dumttape but somthing is dumped *
* on the privius tape and this has to be removed *
* from that tape. *
* *
******************************************************;
if ttest then
begin
write(out,<:<10> number of entries saved= :>,entryno);
write(out,<:<10> end tape is reached :>);
end;
monitor(72)set catalog base:(zhelp ,0,interval);
if -,sys then
begin
write(out,<:<10>***end tape is reached. :>);
goto stop;
end else
begin
case nr of
begin
begin
ntshift:=ntshift+1;
newstofentry:=entryno;
dumpcatupdate(entryno-stofentry,tapenr,stofentry);
stofentry:=newstofentry+1;
tapename(1):=t1tapename(1);
tapename(2):=t1tapename(2);
if total then gettapename(1) else gettapename(0);
outrec6(tape,blocksize);
changerec6(tape,100);
tape.lo(1):=rx:=long <::> add 4 shift 24 add 16;
tape.lo(2):= long <::> add entryno shift 24
add (totalsegmno);
tape.lo(3):= t1tapename(1);
tape.lo(4):= t1tapename(2);
for i:= 5 step 1 until 25 do tape.lo(i):= rx;
setposition(tape,-1,0);
close(tape,false add 1);
tapeshift:= true;
tapename(1):=t1tapename(1);
tapename(2):=t1tapename(2);
mount_med_ring(true);
testlabel(true);
writelabel(3);
open(tape,modekind, t1tapename,
1 shift 18);
setposition(tape,1,1);
endtape:=false;
end;
begin
tntshift:=tntshift+1;
gettape(pdate,tntshift);
tapename(1):=ptapename(1);
tapename(2):=ptapename(2);
mount_med_ring(false);
testlabel(false);
close(ptape,true);
open(ptape,modekind, tapename,1 shift 18);
setposition(ptape,1,1);
tendtape:=false;
end;
begin
comment ***** backspace to privius tape;
gettape(pdate,ntshift);
ntshift:=ntshift-1;
dumpcatupdate(1,tapenr,entryno);
tapename(1):=ptapename(1);
tapename(2):=ptapename(2);
mount_med_ring(true);
testlabel(true);
close(tape,false);
open(tape,modekind,
t1tapename, 1 shift 18);
setposition(tape,pfno,pbno);
tapeshift:=false;
end;
end;
end;
monitor(72)set catalog base:(zhelp,0,entrybase);
end;
\f
procedure transtape;
begin
comment
*******************************************************
* *
* This procedure will take a file from the privius *
* dumptape and copy that file to the tape used now. *
* *
*******************************************************;
integer tarecordsize,tarsize,ii,ai,ik,ta1recordsize,i1;
begin
notapen:=notapen+1;
entryno:=entryno+1;
if ttest then write(out,<:<10>pfileno=:>,pfileno,
<:<10>pblockno=:>,pblockno);
setposition(ptape,pfileno,pblockno);
nexten:
inrec6(ptape,100);
if ttest then
begin
write(out,<:<10> name = :>, ptape.taname);
write(out,<:<10>lbase = :>,
ptape.talbase,<: ubase= :>,ptape.taubase);
end;
identical:= entry.name(1) = ptape.taname(1) and
entry.name(2) = ptape.taname(2) and
entry.lbase = ptape.talbase and
entry.ubase = ptape.taubase ;
if entry.name(1) < ptape.taname(1) or
( entry.name(1) = ptape.taname(1) and
entry.name(2) < ptape.taname(2) ) or
ptape.taname(1)= long <:mtpoo:> add 108 then
begin
if ttest then
begin
write(out,<:<10>entryname = :>,
entry.name);
write(out,<:<10>tapename=:>,
ptape.taname);
end;
entryno:=entryno-1;
permkey:=entry.key extract 3;
ttail.docname(1):=entry.docname(1);
ttail.docname(2):=entry.docname(2);
if list then listentry(true);
write(out,<:****:>);
write(out,
<:<10>*** entry does not exist on disc or previous tape:>);
pageshift;
goto finis;
end;
if ttest then
begin
write(out,<:<10>navn = :>, entry.name);
write(out,<: lbase = :>,entry.lbase,<:ubase= :>,entry.ubase);
end;
if identical then
begin
outrec6(tape,blocksize);changerec6(tape,100);
tofrom(tape,ptape,100);
if ttest then write(out,<:<10>tagsegmno =:>,ptape.tasegmno);
tape.lo(2):= long <::> add entryno shift 24 add ptape.tasegmno;
permkey:=entry.key extract 3;
ttail.docname(1):=entry.docname(1);
ttail.docname(2):=entry.docname(2);
if list then listentry(list);
if ttest then write(out,<:<10>tasize= :>,ptape.tasize);
if ptape.tasize >= 0 then
tarsize:=ptape.tasize;
if tarsize > 0 then
begin
totalsegmno:=totalsegmno+tarsize;
tarecordsize:=0;segmno:=0;
k:=ptape.tasize//segm;
for i:=0 step 1 until k-1 do
begin
outrec6(tape,blocksize);changerec6(tape,8);
tape.lo(1):=long <::> add 2 shift 24 add blocksize;
tape.lo(2):=long <::> add entryno shift 24 add (i*segm);
for ii:= 1 step 1 until segm do
begin
ai:=inrec6(ptape,0);
if tarecordsize mod psegm = 0 then
begin
inrec6(ptape,8);
ai:=inrec6(ptape,0);
end;
comment if ai mod 128 <> 0 then goto error1;
if endtape then changevol(1);
if tendtape then changevol(2);
outrec6(tape,512);
inrec6(ptape,512);tarecordsize:=tarecordsize+1;
for ik:= 1 step 1 until 128 do tape(ik):=ptape(ik);
end;
end;
ta1recordsize:=tarsize mod segm;
if ta1recordsize > 0 then
begin
if endtape then changevol(1);
outrec6(tape,blocksize);
changerec6(tape,ta1recordsize*512+8);
tape.lo(1):=long <::> add 2 shift 24 add (ta1recordsize*512+8);
tape.lo(2):=long <::> add entryno shift 24 add (k*segm);
for ii:= 0 step 1 until ta1recordsize-1 do
begin
if tarecordsize mod psegm = 0 then inrec6(ptape,8);
ai:=inrec6(ptape,0);
comment if ai mod 128 <> 0 then goto error1;
if tendtape then changevol(2);
inrec6(ptape,512);tarecordsize:=tarecordsize+1;
for ik:= 1 step 1 until 128 do tape(2+ii*128+ik):=ptape(ik);
end;
end;
end;
if tarsize > 0 and tarsize mod psegm <> 0 then
pblockno:=pblockno+1;
pblockno:=pblockno+tarsize//psegm+1;
goto error2;
error1:
setposition(tape,pfno,pbno);
write(out,<:*** cannot be saved:>);
error2:
end
else
begin
if ttest then write(out,<:<10> ta1size= :>,ptape.tasize);
if ptape.tasize > 0 and ptape.tasize mod psegm <> 0 then
pblockno:=pblockno+1;
if ptape.tasize >= 0 then
pblockno:=ptape.tasize//psegm+1+pblockno;
if ttest then write(out,<:<10>pfil=:>,
pfileno,<:pblo=:>,pblockno);
setposition(ptape,pfileno,pblockno);
if tendtape then changevol(2);
goto nexten;
end;
end;
pageshift;
finis:
end <*transtape*> ;
procedure pageshift;
begin
nooflisten:=nooflisten+1;
if nooflisten >= 63 then
begin
nooflisten:=1;
write(out,<:<12>:>,"sp",60,<:page :>,pagenr);
write(out,<:<10>savelabel: :>, xlabel);
pagenr:=pagenr+1;
end;
end;
\f
procedure listentry(listspec);
boolean listspec;
begin
comment
**********************************************************
* *
* This procedure is used to list an entry. The procedu- *
* outmodekind is used to list the kind of a filediscrip- *
* tor. *
* *
**********************************************************;
\f
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," ",
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;
if listspec then
begin
write(out,<:<10>:>);
write(out," ",(if listmore then 11 else 0)
-write(out, entry.name));
end;
if listmore then
begin
if entry.kind<0 then outmodekind
else
write(out,<< dddd>,entry.kind," ",2);
if sysdump then write(out,<<d>,permkey,<:.:>);
i:=write(out, ttail.docname);
write(out," ",12-i);
if sysdump then
begin
write(out,
<< -ddddddd>,entry.lbase,entry.ubase);
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;
\f
procedure dumptape;
begin
zone bsarea(128*2*segm,2,bsproc);
long array field ta;
integer array itail(1:20);
procedure listclock;
begin
integer field inf,clockadr,startext,seg;
boolean started;
procedure outdate;
begin
inf:=clockadr-2;
write(out,<: d.:>,<<zddddd>,bsarea.inf,<:.:>);
end;
procedure outclock;
begin
write(out,<<zddd>,bsarea.clockadr/100);
missingclock:=false;
end;
startext:=entry.contents extract 12+2;
if startext>500 then
begin
monitor(72,zhelp,0,interval);
write(out,<: entry inconsistent:>);
goto exitlistclock
end;
setposition(bsarea,0,0);
inrec6(bsarea,512);
monitor(72,zhelp,0,interval);
seg:=entry.kind-1;
inf:=startext+2;
clockadr:=6+bsarea.inf extract 12
+12*bsarea.startext extract 12
+2*bsarea.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;
if bsarea.inf extract 12>500 or seg=0 then
begin
write(out,<: code inconsistent:>);
goto exitlistclock
end;
clockadr:=clockadr-502+bsarea.inf extract 12;
inrec6(bsarea,512); seg:=seg-1;
if clockadr>502 then goto nextsegm;
if -,started then outdate;
outclock;
end;
exitlistclock:
monitor(72,zhelp,0,entrybase);
end listclock;
procedure bsproc(z,s,b);
zone z;
integer s,b;
begin
comment
*******************************************************
* *
* This block procedure is used when an entry is saved *
* it is then tested if another process is using the *
* entry. *
* *
*******************************************************;
monitor(72)set catalog base:(zhelp,0,interval);
if s shift (-2) extract 1 = 1 or s shift (-5) extract 1 = 1 then
begin
if s shift (-5) extract 1 = 1 and b = 0 then
begin
monitor(72)set catalog base:(zhelp,0,entrybase);
i:=monitor(52)create process:(bsarea,0,iarr);
if i <> 0 and ttest then
write(out,<:<10> result of create process =:>,i);
if i = 0 then goto nextin;
end;
entryno:=entryno-1;
if tapeshift then changevol(3)
else
harderror:=true;
outrec6(tape,blocksize);
setposition(tape,pfno,pbno);
entry.key:=-1;
entry.lbase:=-1;
entry.ubase:=-1;
totalsegmno:=totalsegmno-segmno;
write(out,<:<10> *** entry in use: :>);
write(out, entryname);
pageshift;
if s shift (-2) extract 1 = 1 then write(out,
<: area reserved :>);
if s shift (-5) extract 1 = 1 then write(out,
<: area not created:>);
if ttest then
begin
write(out,<:<10> s=:>,s,<: b= :>,b);
end;
end;
goto next;
end;
monitor(72)set cat base:(zhelp,0,entrybase);
if entry.size >= 0 then
begin
open(bsarea,4,
entryname,1 shift 5 + 1 shift 2);
proaddr:=monitor(4)process description addr:(bsarea,i,itail);
if proaddr > 0 then
begin
system(5)move core area:(proaddr,itail);
if itail(7) <> 0 then
begin
entry.key:=-1;
entry.lbase:=-1;
entry.ubase:=-1;
write(out,<:<10>*** entry reserved: :>,
entryname);
pageshift;
monitor(72)set cat base:(zhelp,0,interval);
goto next;
end;
end;
end;
segmno:=0;
i:=0;
monitor(52)create area process:(bsarea,0,iarr);
entryno:=entryno+1;
nextin:
if endtape then changevol(1);
if ttest then write(out,<:<10>pfno=:>,pfno,<: pbno=:>,pbno);
getposition(tape,pfno,pbno);
outrec6(tape,blocksize);changerec6(tape,100);
tape.lo(1):=rx:=long <::> add 1 shift 24 add 52;
tape.lo(2):= long <::> add entryno shift 24 add
(if entry.kind < 0 then 0 else entry.kind);
tape.lo(3):= entry.name(1);
tape.lo(4):=entry.name(2);
ta:=14;
for i:= 1 step 1 until 5 do tape.lo(4+i):= ttail.ta(i);
permkey:= entry.key extract 3;
tape(10):= entry.key extract 3;
tape.lo(11):=entry.docname(1);
tape.lo(12):=entry.docname(2);
tape.lo(13):= long <::> add entry.lbase shift 24 add entry.ubase;
for i:= 14 step 1 until 25 do tape.lo(i):= rx;
if ttest then write(out,<: size=:>,entry.kind);
if entry.size < 0 then goto nextentry;<*save descriptor*>
for i:=inrec6(bsarea,0) while i > 2 do
begin
if endtape then changevol(1);
outrec6(tape,blocksize);
if i+8 <> blocksize then changerec6(tape,8+i);
tape.lo(1):= long <::> add 2 shift 24 add (8+i);
tape.lo(2):=long <::> add entryno shift 24 add segmno;
inrec6(bsarea,i);
raf:=8;
tofrom(tape.raf,bsarea,i);
segmno:=segmno + i//512;
totalsegmno:=totalsegmno+ i//512;
end;
tapeshift:=false;
nextentry:
if list then listentry(true);
if list and missingclock and entry.size >= 0 then listclock;
if list then pageshift;
next:
if entry.size >= 0 then
close(bsarea,true);
if entryname(1) <> long <:incsa:> add 118
and entryname(2) <> long <:e:> then
begin
monitor(72)set cat base:(zhelp,0,entrybase);
i:=monitor(64)remove process:(bsarea,0,iarr);
if i <> 0 and i <> 3 and ttest then
begin
write(out,<:<10>entryname= :>, entry.name,
<: result of remove = :>,i);
end;
end;
end <*dumttape*>;
comment
*******************************************************
* *
* This procedure dumps the entries on tape. If an en- *
* try can not be saved and something of that entry is *
* saved this will be deleted and the next entry will *
* be saved. *
* *
*******************************************************;
\f
procedure outentry;
begin
long array field doc,tai;
integer field bf;
doc:=14;tai:=0;
for i:=1 step 1 until 5 do tail.tai(i):=ttail.doc(i);
i:=2;
swoprec6(entry,34);
while i <= 34 do
begin
bf:=i;
entry.bf:=ttail.bf;
i:=i+2;
end;
end;
if sys then
open(tape,modekind, t1tapename,1 shift 18) else
open(tape,modekind,tapename,1 shift 18);
setposition(tape,1,1);
open(entry,4, p2catname,0);
setposition(entry,0,0);
for tq1:= 1 step 1 until noofentries do
begin
ii:=monitor(72)set catalog base:(zhelp,0,interval);
if ii <> 0 and ttest then write(out,
<:<10>result of set cat base= :>,ii);
if swoprec6(entry,0) = 2 then swoprec6(entry,2);
i:=swoprec6(entry,0);
if i <> 0 then
begin
swoprec6(entry,34);
if entry.key <> -1 then
begin
entrybase(1):=entry.lbase;
entrybase(2):=entry.ubase;
ii:=monitor(72)set catalog base:( zhelp,0,entrybase);
if ii <> 0 and ttest then write(out,
<:<10>result of set cat base=:>,ii);
entryname(1):=entry.name(1);
entryname(2):=entry.name(2);
open(help,0, entryname,0);
i:= monitor(76)look up head and tail:(help,0,ttail);
tempdoc(1):=entry.docname(1);
tempdoc(2):=entry.docname(2);
if i=0 and entry.lbase = tail(2)
and entry.ubase = tail(3) then tofrom(entry,ttail,34);
entry.docname(1):=tempdoc(1);
entry.docname(2):=tempdoc(2);
if i<>6 then
begin
if ttest then
begin
write(out,<:<10>result of lookup entry = :>,i);
write(out,<:<10> entryname is = :>);
write(out, entryname);
write(out,<: lower base= :>,
ttail(2),<: upper base =:>,ttail(3));
end;
if i = 3 or
entry.lbase <> ttail(2) or entry.ubase <> ttail(3) then
begin
if std and last then
begin
if ptapeshift then
begin
ptapeshift:=false;
open(ptape,modekind,
ptapename,1 shift 18);
setposition(ptape,1,1);
end;
transtape;
end else
begin
entry.key:=-1;
entry.lbase:=-1;
entry.ubase:=-1;
end;
end
else
dumptape;
end
else
begin
write(out,<:<10> tilkald vk:>);
goto halt;
end;
close(help,false);
end;
end;
end;
monitor(72)set catalog base:(zhelp,0,interval);
if sys then
begin
if ntshift > 0 then
dumpcatupdate(entryno-stofentry,tapenr,stofentry)
else
dumpcatupdate(entryno,tapenr,entrystart);
end;
comment dump baandpool
dumtt1name
dump dumpcat;
close(entry,true);
if sys then
begin
t2name(1):=0;t2name(2):=0;
open(entry,4, t2name,0);
tail(1):=1;
tail(2):=1;
tail(3):=0;tail(4):=0;tail(5):=0;
i:= monitor(40)create entry:(entry,0,tail);
setposition(entry,0,0);
entryname(1):=long <:mtpoo:> add 108;entryname(2):=long <::>;
open(mt1record,4, mt1pool,0);
i:=monitor(50)permanent entry:(mt1record,3,tail);
if i <> 0 then error(11);
entrybase(1):=interval(5);entrybase(2):=interval(6);
i:=monitor(74)set entry base:(mt1record,0,entrybase);
if i <> 0 then
begin
warning(2);
pageshift;pageshift;
end;
open(help,0, entryname,0);
close(help,true);
monitor(48)remove entry:(help,0,tail);
tail.tadocname(1):=mtpool(1);
tail.tadocname(2):=mtpool(2);
monitor(46)rename entry:(mt1record,0,tail);
close(mt1record,true);
open(mt1record,4, mtpool,0);
monitor(42)lookupenty:(mt1record,0,tail);
tail(6):=today;
tail(9):=11 shift 12;
monitor(44)changeentry:(mt1record,0,tail);
monitor(76)lookup head and tail:(mt1record,0,ttail);
swoprec6(entry,34);
tofrom(entry,ttail,34);
close(mt1record,true);
if ttest then write(out,<:<10>result of look up entry1= :>,ik);
dumptape;
entryname(1):=long <:savec:> add 97;entryname(2):=long <:t:>;
monitor(72)set cat base:(zhelp,0,interval);
open(cat1,4, dump1name,0);
i:=monitor(50)permanent entry:(cat1,3,tail);
if i <> 0 then error(11);
entrybase(1):=interval(5);
entrybase(2):=interval(6);
i:=monitor(74)set entry base:(cat1,0,entrybase);
if i <> 0 then
begin
warning(2);
pageshift;
pageshift;
end;
open(help,0, entryname,0);
close(help,true);
monitor(48)remove entry:(help,0,tail);
tail.tadocname(1):=dcname(1);
tail.tadocname(2):=dcname(2);
monitor(46)rename entry:(cat1,0,tail);
close(cat1,true);
open(cat1,4, dcname,0);
monitor(42)lookup entry:(cat1,0,tail);
tail(6):=today;
tail(9):=11 shift 12;
tail(10):=dumpensize;
monitor(44)change entry:(cat1,0,tail);
open(help,0, entryname,0);
ik:=monitor(76)lookup head and tail:(help,0,ttail);
outentry;
close(help,true);
if ttest then write(out,<:<10>result of lookup entry2= :>,ik);
dumptape;
entryname(1):=long <:tempc:>add 97;entryname(2):=long <:t:>;
monitor(72)set cat base:(zhelp,0,interval);
close(cat1,true);
open(cat1,4, p2catname,0);
i:=monitor(50)permanent entry:(cat1,3,tail);
if i <> 0 then error(11);
entrybase(1):=interval(5);
entrybase(2):=interval(6);
i:=monitor(74)set entry base:(cat1,0,entrybase);
if i <> 0 then
begin
warning(2);
pageshift;pageshift;
end;
open(help,0, pcatname,0);
close(help,true);
monitor(48)remove entry:(help,0,tail);
tail.tadocname(1):=pcatname(1);
tail.tadocname(2):=pcatname(2);
monitor(46)rename entry:(cat1,0,tail);
close(cat1,true);
open(cat1,4, pcatname,0);
monitor(42)lookupentry:(cat1,0,tail);
tail(6):=today;
tail(9):=11 shift 12;
if total then tail(10):=0 else
tail(10):=entryno-2;
monitor(44)changeentry:(cat1,0,tail);
monitor(76)lookup head and tail:(cat1,0,ttail);
swoprec6(entry,34);
tofrom(entry,ttail,34);
close(cat1,true);
dumptape;
end else close(help,true);
outrec6(tape,blocksize);changerec6(tape,100);
tape.lo(1):=rx:=long <::> add 3 shift 24 add 8;
tape.lo(2):=long <::> add entryno shift 24 add totalsegmno;
for i:=3 step 1 until 25 do tape.lo(i):=rx;
setposition(tape,2,0);
close(tape,false);
if notapen > 0 and sys then
begin
setposition(ptape,-1,0);
close(ptape,true);
end;
end;
\f
comment
******************************
* *
* I N I T A L I S E R I N G *
* *
******************************;
open(zhelp,0,<::>,0);
system(11)get catalog base:(0,interval);
savenotok:=false;
pagenr:=1;nooflisten:=1;
stofentry:=0;
lo:=0;
mtpool(1):=long <:mtpoo:> add 108;
mtpool(2):=long <::>;
entryno:=0;totalsegmno:=0;
notapen:=0;device:=0;maxhashsize:=0.5;
nomess1:=true;
ptapename(1):=long <::>;
ptapename(2):=long <::>;
endtape:=false;
catnr:=2;dumpsize:=8;restondumps:=4;
dbase1:=12;tadocname:=0;dbase2:=14;dname:=2;
entrystart:=0;
startofbit:=18;dumpkey:=16;startofbitt:=16;
modekind:= 18 ;
mtrsize:=16;mtno:=16;mtnr:=2;mtname:=2;mtdate:=12;mttotal:=14;
blocksize:= 8+512*segm;
sysdump:=true;
missingclock:=false;listmore:=true;
shortclock:=26;contents:=32;
t1test:=false;ttest:=false;
tname(1):=long <:dum1c:> add 97;
tname(2):=long <:t:>;
name:=6;kind:=16;key:=2;size:=16;
lbase:=4;
harderror:=false;
taname:=8;tasegmno:=8;tasize:=8;talbase:=50;taubase:=52;
filno:=1;ubase:=6;docname:=16;
tempname(1):= long <:tem1c:> add 97;
tempname(2):=long <:t:>;
dcname(1):= long <:savec:> add 97;
dcname(2):= long <:t:>;
tntshift:=0;
ntshift:=0;
tendtape:=false;
tapeshift:=false;
pfileno:=1;pblockno:=1;ptapeshift:=false;
filno:=1;ubase:=6;docname:=16;
pfno:=1;pbno:=1;
pdate:=dateofpdump;
if ttest then write(out,<:<10>pdate = :>,pdate);
if last then date:=dateofpdump;
if ttest then write(out,<:<10> date of call = :>,date);
comment (* find date *);
p2catname(1):= long <:tem2c:> add 97;
p2catname(2):= long <:t:>;
pcatname(1):= long <:tempc:> add 97;
pcatname(2):=long <:t:>;
mt1pool(1):= long <:mt1po:> add 111;
mt1pool(2):= long <:l:>;
open(mtrecord,4, mtpool,0);
open(mt1record,4, mt1pool,0);
i:=monitor(42)lookup entry:( mtrecord,0,tail);
if i <> 0 then error(7);
mtsize:=tail(1);
if monitor(42)lookup entry:(mt1record,0,ttail) = 0 then
monitor(48) remove entry:(mt1record,0,tail);
tail(1):=1;
tail(2):=1;
tail(3):=0;tail(4):=0;tail(5):=0;
if monitor(40)create entry:(mt1record,0,tail) <> 0 then error(7);
setposition(mtrecord,0,0);setposition(mt1record,0,0);
inrec6(mtrecord,2);bittsize:=((mtrecord.catnr-1)//24)+1;
setposition(mtrecord,0,0);
ik:=0;
while ik < mtsize do
begin
ik:=ik+1;
inrec6(mtrecord,512);outrec6(mt1record,512);
tofrom(mt1record,mtrecord,512);
end;
close(mtrecord,false);close(mt1record,true);
if sys and std then
begin
gettape(pdate,tntshift);
iarr(1):= ( if device = 0 then 14 shift 12 else
32 shift 12 + 1 shift 9) ;
iarr(2):= long <:mou:> shift (-24) extract 24;
iarr(3):= long <:nt:> shift (-24) extract 24;
iarr(4):= device;
iarr(5):=ptapename(1) shift (-24) extract 24;
iarr(6):=ptapename(1) extract 24;
iarr(7):=ptapename(2) shift (-24) extract 24;
iarr(8):=ptapename(2) extract 24;
iarr(9):=0;
iarr(10):=0;
if nomess1 then
system(10,0,iarr);
end;
if sys then
begin
if total then gettapename(1) else gettapename(0);
iarr(1):=( if device = 0 then 14 shift 12 else
32 shift 12 + 1 shift 9) ;
iarr(2):= long <:mou:> shift (-24) extract 24;
iarr(3):= long <:nt:> shift (-24) extract 24;
iarr(4):= device;
iarr(5):= t1tapename(1) shift (-24) extract 24;
iarr(6):= t1tapename(1) extract 24;
iarr(7):= t1tapename(2) shift (-24) extract 24;
iarr(8):= t1tapename(2) extract 24;
iarr(9):= 0;
iarr(10):=0;
system(10,0,iarr);
end;
if total then auxscan(0) else auxscan(date);
open(help,0, tempname,0);
i:=monitor(42)look up entry:(help,0,tail);
if i <> 0 then
begin
tail(1):=200;
tail(2):=1;
tail(3):=0;tail(4):=0;tail(5):=0;
i:=monitor(40)create entry:(help,0,tail);
if i <> 0 then error(15);
i:=monitor(50)permanent entry:(help,3,tail);
if i <> 0 then error(15);
end;
close(help,false);
inittempcat(tempname);
param(1):=1;param(2):=0;
param(3):=1;param(4):=1;
param(5):=34;
param(6):=4;
param(7):=0;
keydescr(1,1):=3;keydescr(1,2):=10;
keydescr(2,1):=3;keydescr(2,2):=14;
keydescr(3,1):=2;keydescr(3,2):=4;
keydescr(4,1):=2;keydescr(4,2):=6;
sortname(1):=real <:dum1c:> add 97;
sortname(2):=real <:t:>;
sortname(3):=real <:tem1c:> add 97;
sortname(4):=real <:t:>;
sortname(5):=real <:disc1:>;
sortname(6):= real <::>;
eof:=-1;
noofrecs:=noofentries;
if ttest then write(out,<:<10> noofentries to save = :>,noofentries);
mdsortproc(param,keydescr,sortname,eof,noofrecs,result,explanation);
if ttest then write(out,<:<10> noofrecs = :>,noofrecs);
if result <> 1 then error(16);
if sys then
begin
notapen:=0;
dump1name(1):= long <:dump1:> add 99;
dump1name(2):= long <:at:>;
open(cat1,4, dump1name,0);
open(cat,4, dcname,0);
i:=monitor(42)look up entry:(cat,0,tail);
if i <> 0 then error(5);
hashentries:=tail(1);
dumpensize:=tail(10);
restondumps:=510 mod dumpensize;
if dumpensize = 0 then dumpensize:=18;
if monitor(42)look up entry:(cat1,0,ttail) = 0 then
monitor(48)remove entry:(cat1,0,ttail);
if monitor(40)create entry:(cat1,0,tail) <> 0 then error(7);
setposition(cat,0,0);
setposition(cat1,0,0);
i:=inrec6(cat,0);
while i > 2 do
begin
inrec6(cat,i);outrec6(cat1,i);
tofrom(cat1,cat,i);
i:=inrec6(cat,0);
end;
close(cat,false);close(cat1,false);
tapename(1):=t1tapename(1);
tapename(2):=t1tapename(2);
end else
begin
p2catname(1):= long <:tem1c:> add 97;
p2catname(2):= long <:t:>;
end;
mount_med_ring(true);
testlabel(true);
if sys then
begin
if std and last then fletcatalog else
begin
p2catname(1):= long <:tem1c:> add 97;
p2catname(2):= long <:t:>;
end;
if notapen > 0 then
begin
if -, ptapeshift then
begin
ptapeshift:=true;
tapename(1):=ptapename(1);
tapename(2):=ptapename(2);
mount_med_ring(false);
testlabel(false);
ptapename(1):=tapename(1);
ptapename(2):=tapename(2);
end;
end;
end;
notapen:=0;
tapedump;
if total then
begin
open(cat,4, pcatname,0);
setposition(cat,0,0);
outrec6(cat,510);
for ih:=2 step 2 until 510 do cat.ih:=-1;
close(cat,true);
monitor(40)lookup entry:(cat,0,tail);
tail(1):=1;
i:=monitor(44)change entry:(cat,0,tail);
if i <> 0 then write(out,<:<10>result of change entry = :>,i);
end;
stop:
tapename(1):=t1tapename(1);
tapename(2):=t1tapename(2);
writelabel(2);
write(out,<:<10> entries =:>,entryno,<: segm=:>,totalsegmno);
if savenotok then write(out,<:<10> save not ok :>)
else write(out,<:<10> save ok :>);
end;
outp:=false;
readallparam;
incrementdump;
halt:
if outp then closeout;
close(zhelp,true);
end
▶EOF◀