|
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: 6912 (0x1b00) Types: TextFile Names: »textract«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦162d2eb5b⟧ »talgprog« └─⟦this⟧
(mode list.yes extract=algol connect.no blocks.yes if warning.no extract list.no mode list.no) 1980-10-27 begin boolean list,search,all,convert,from,test; integer lb,ub,segm,i,j,char,result,area; integer array field rec; long array field doc,name,lo; array field r; integer array bases(1:8),t,pt,ct(1:10); array pname,cname,inp(1:3),sname(1:25,1:2); boolean array sfound(1:25); boolean procedure disccopy(infile,fsegm,outfile,tail); value fsegm; integer fsegm; string infile,outfile; integer array tail; begin integer result,i,free, blocklength,s; integer array todesc,fromdesc(1:20),t(1:10); array inname,outname(1:3); free:=((system(2,i,inname)-1536)//512)+1; blocklength:=free*512; disccopy:=true; cleararray(inname); movestring(inname,1,infile); cleararray(outname); movestring(outname,1,outfile); for i:=1 step 1 until 10 do t(i):=tail(i); result:=createentry(outname,t); if result>0 then begin i:=1; write(out,<:<10>**:>,string outname(increase(i)), <: create entry result :>,result,t(1)); disccopy:=false; end outfile improper else begin permentry(outname,2); i:=setenbase(outname,bases(5),bases(6)); if i<>0 then write(out,"nl",1,"*",2,true,12,outname.lo,<: set entry base:>); if i<>0 and test then write(out,bases(5),bases(6)); end; if result=0 then begin zone z(free*128,1,stderror); procedure flip; begin getzone6(z,fromdesc); setzone6(z,todesc); end; procedure flop; begin getzone6(z,todesc); setzone6(z,fromdesc); end; getzone6(z,todesc); i:=1; open(z,4,string inname(increase(i)),0); setposition(z,0,fsegm); flip; i:=1; open(z,4,string outname(increase(i)),0); s:=tail(1); if test then write(out,"nl",1,"*",1,outname.lo,<: free :>,free, <: first :>,fsegm,<: segments :>,s);; for i:=1 step free until s do begin flop; inrec6(z,free*512); flip; outrec6(z,free*512); outrec6(z,0); if test then write(out,"nl",1,<:free moved :>,free*512); end; flop; i:=(tail(1) mod free)*512; if test then write(out,"nl",1,<:rest :>,i); inrec6(z,i); flip; outrec6(z,i); close(z,true); flop; close(z,true); flip; close(z,true); flop; end zone; end disccopy; boolean procedure extractfile(lib,list,search,all,name); boolean list,search,all; long array lib; array name; begin integer field segm,w; array field sn,r; long array field n,doc; boolean field firstbyte; integer array field t; integer i,j,k,l,entry,entries; zone cat(128,1,stderror); extractfile:=all; open(cat,4,lib,0); w:=512; inrec6(cat,512); entries:=cat.w; sn:=n:=6; doc:=16; segm:=16; firstbyte:=1; r:=0; t:=14; setposition(cat,0,0); for entry:=1 step 1 until entries do begin inrec6(cat,34); i:=1; if list or all then begin write(out,"nl",1,"sp",4,true,12,cat.n, <<ddddd>,cat.segm); outshortcl(out,cat.t(6)); i:=j:=k:=l:=1; if all then begin if disccopy(string lib.r(increase(i)),cat.firstbyte extract 12, string cat.n.r(increase(j)),cat.t) and convert then convert:=printfile(string pname(increase(k)), string cat.n.r(increase(l)))>0; end all; end else if search or from then begin if cat.sn(1)=name(1) then begin if cat.sn(2)=name(2) then begin extractfile:=true; write(out,"nl",1,true,12,cat.n, <<ddddd>,cat.segm); outshortcl(out,cat.t(6)); write(out,<: on :>,true,12,lib); i:=j:=k:=l:=1; if disccopy(string lib(increase(i)),cat.firstbyte extract 12, string cat.n.r(increase(j)),cat.t) and convert then printfile(string pname(increase(k)), string cat.n.r(increase(l))); end name part 2; end name part 1; end search; end entry; close(cat,true); end extractfile; rec:=0; lo:=r:=0; name:=6; doc:=16; for i:=1 step 1 until 25 do sfound(i):=false; cleararray(sname); lookup_tail(<:catalog:>,t); segm:=t(1); system(11,0,bases); readbfp(<:test:>,test,false); all:=readsfp(<:all:>,cname,<::>); from:=false; if -,all then from:=readsfp(<:from:>,cname,<::>); if from then begin result:=lookuptail(cname,t); if result<>0 then alarm("nl",1,cname.lo,<: does not exist:>); if t(1)<0 or t(9) shift (-12) extract 12 <>10 then alarm("nl",1,"*",3,cname.lo,<: not a contract file:>); end; readbfp(<:list:>,list,false); search:=fpinareas>0; connectcuri(<:catalog:>); convert:=readlsfp(pname); if convert then begin result:=lookuptail(pname,pt); i:=1; if result>0 or pt(1) <>(-1) shift 23+14 then alarm("nl",1,"*",3,<:extractfile printer error :>, string pname(increase(i))); end convert; if all or from then begin result:=lookuptail(cname,ct); if result>0 or ct(9) shift (-12) extract 12<>10 then alarm("nl",1,"*",3,string cname(increase(i)), if result>0 then <: does not exist:> else <: is not a contract file:>); if from then begin for area:=1 step 1 until fpinareas do begin readinfp(inp,area); i:=1; if -,extractfile(cname.lo,list,true,false,inp) then write(out,"nl",1,"*",2,string inp(increase(i)), <: not found:>); end; end else extractfile(cname.lo,list,true,all,cname); end all or from else if search or list then begin for area:=1 step 1 until fpinareas do begin readinfp(inp,area); for j:=1,2 do sname(area,j):=inp(j); end; setposition(in,0,0); lb:=bases(5); ub:=bases(6); for segm:=segm step -1 until 1 do begin inrec6(in,512); for rec:=0 step 34 until 512-34 do begin if in.rec(1)<>-1 then begin if lb=in.rec(2) and ub=in.rec(3) then begin if in.rec(16)shift (-12) extract 12=10 and in.rec(1) extract 3>2 then begin if -,search then begin write(out,"nl",1,true,13,in.rec.name,true,6,in.rec(8), true,12,in.rec.doc); outshortcl(out,in.rec(6+7)); end; if list then extractfile(in.rec.name,list,false,false,inp) else for area:=1 step 1 until fpinareas do begin for j:=1,2 do inp(j):=sname(area,j); if -,sfound(area) then sfound(area):= extractfile(in.rec.name,list,true,false,inp); end; end content; end user base; end entry; end record; end segments; if search then begin for area:=1 step 1 until fpinareas do begin for j:=1,2 do inp(j):=sname(area,j); j:=1; if -,sfound(area) then write(out,"nl",1,"*",2,true,12, string inp(increase(j)),<: not found:>); end; end; end; end; ▶EOF◀