|
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: 36096 (0x8d00) Types: TextFile Names: »tcatsort«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦ebd72877b⟧ »tfput« └─⟦this⟧
begin procedure program(out); zone out; begin message rc 1978.04.25 catsort; integer array limits(1:4); integer catalogs, main_dev_no, main_dev_chain_addr; system(5)move core area:(92,limits); main_dev_chain_addr:=limits(4); catalogs:=(limits(3)-limits(1))/2-1; <*no. of catalogs-1*> <*limits(1):=addr of first drum chain in nametable*> <* - (2):= - - - disc - - - *> <* - (3):= - - - unused - - *> <* - (4):= - - chaintable for doc with main catalog *> <*The aux catalogs are internally numbered 0, ... , catalogs*> <*The main catalog is internally numbered -1 *> begin <*second level procedure program*> comment implementation details: the program sorts and lists the catalog. by a call of system(5)move core area:(92,limits) the address of the catalog names are found. a sortarea is created by means of a monitor call. the catalog is moved to the sortarea by inrec and outrec, while at the same time all empty entries, non-specified entries and the sortarea is skipped. if the parameter docsort.yes is specified, each record is prolonged by 10 bytes holding entryname and 0 or, if the entry is a subentry, then document name and 1, thus making a sorting on these items possible. the sorting is performed by a variation of sldisksort. at last the sorted entries are output, maybe skipping system files; procedure discsort(filnavn,læ,antalindiv,segmprblok,ngl); value segmprblok; string filnavn; integer læ,antalindiv,segmprblok; integer array ngl; begin integer fysisksubbloklængde, fysiskbloklængde, b; integer array ia(1:20); array ra(1:2); fysisksubbloklængde := 512 * segmprblok; b:=system(2,b,ra); if (b-6*512)//(2*fysisksubbloklængde)<1 then begin errorbits:=1; write(out,<:<10>***catsort, process size too small<10>:>); goto exit; end; b:=(b-9*512)//(2*fysisksubbloklængde); if b<1 then b:=1; <* will be slow *> fysiskbloklængde := b * fysisksubbloklængde; segmprblok := b * segmprblok; begin integer diff, fa, indivlæ2, logiskbloklængde, logisksubbloklængde, nedbasis, nedplads, nedslut, opbasis, opplads, opslut, slut2, start2, subblokstart, transporter; array field m, ned, op; integer array nuvblok(0:1); zone z(fysiskbloklængde//2,1,blproc); long r; long field i; integer j; integer field indivlæ; integer field nøgle1, nøgle2, nøgle3, nøgle6; long field nøgle4, nøgle5, nøgle7, nøgle8; long prim4, prim5, prim7, prim8, mid4, mid5, mid7,mid8, prim1,prim2,mid1,mid2; integer prim3,mid3,prim6, mid6; boolean bo1,bo2,bo3,bo4,bo5,bo6,bo7,bo8; procedure blproc(z,s,b); zone z; integer s, b; if s extract 19 < 1 shift 18 or ia(4)<>5 shift 12 then <*status indeholder ikke 1<18: end doc and operation<>output*> stderror(z,s,b); procedure io(plads,operation); integer plads, operation; begin b:=nuvblok(plads)*segmprblok; if b>=0 then begin ia(4):= operation shift 12; ia(7):= b; ia(5):= b:= fa + plads*fysiskbloklængde; ia(6):= b + fysiskbloklængde - 2; setshare6(z,ia,1); monitor(16,z,1,ia); check(z); end end io; procedure quicksort(start,slut,enblok); value start, slut, enblok; integer start, slut; boolean enblok; begin for m:=(start+slut)//indivlæ2*indivlæ while start<slut-indivlæ2 do begin op:= start-opbasis; ned:= slut-nedbasis; if enblok then m:=m-opbasis else begin transporter:=0; transport(m,0,opplads,nedplads); nedslut:=ned; opslut:=op; end; mid1:= if nøgle1=0 then 0 else z.m.nøgle1; mid2:= if nøgle2=0 then 0 else z.m.nøgle2; mid3:= if nøgle3=0 then 0 else z.m.nøgle3; mid4:= if nøgle4=0 then 0 else z.m.nøgle4; mid5:= if nøgle5=0 then 0 else z.m.nøgle5; mid6:= if nøgle6=0 then 0 else z.m.nøgle6; mid7:= z.m.nøgle7; mid8:= z.m.nøgle8; søgned: ned:= ned-indivlæ; if ned < nedslut then begin transport(ned,nedbasis,nedplads,opplads); nedslut:= subblokstart; end; prim1:= if nøgle1=0 then 0 else z.ned.nøgle1 - mid1; prim2:= if nøgle2=0 then 0 else z.ned.nøgle2 - mid2; prim3:= if nøgle3=0 then 0 else z.ned.nøgle3 - mid3; prim4:= if nøgle4=0 then 0 else z.ned.nøgle4 - mid4; prim5:= if nøgle5=0 then 0 else z.ned.nøgle5 - mid5; prim6:= if nøgle6=0 then 0 else z.ned.nøgle6 - mid6; prim7:= z.ned.nøgle7 - mid7; prim8:= z.ned.nøgle8 - mid8; bo8:= prim8>0; bo7:=if prim7=0 then bo8 else prim7>0; bo6:=if prim6=0 then bo7 else prim6>0; bo5:=if prim5=0 then bo6 else prim5>0; bo4:=if prim4=0 then bo5 else prim4>0; bo3:=if prim3=0 then bo4 else prim3<0; bo2:=if prim2=0 then bo3 else prim2<0; bo1:=if prim1=0 then bo2 else prim1>0; if bo1 then goto søgned; søgop: op:= op+indivlæ; if op >= opslut then begin transport(op,opbasis,opplads,nedplads); opslut:= subblokstart + logisksubbloklængde; if transporter=3 then enblok:= nedslut=subblokstart; end; prim1:= if nøgle1=0 then 0 else z.op.nøgle1 - mid1; prim2:= if nøgle2=0 then 0 else z.op.nøgle2 - mid2; prim3:= if nøgle3=0 then 0 else z.op.nøgle3 - mid3; prim4:= if nøgle4=0 then 0 else z.op.nøgle4 - mid4; prim5:= if nøgle5=0 then 0 else z.op.nøgle5 - mid5; prim6:= if nøgle6=0 then 0 else z.op.nøgle6 - mid6; prim7:= z.op.nøgle7 - mid7; prim8:= z.op.nøgle8 - mid8; bo8:=prim8<0; bo7:=if prim7=0 then bo8 else prim7<0; bo6:=if prim6=0 then bo7 else prim6<0; bo5:=if prim5=0 then bo6 else prim5<0; bo4:=if prim4=0 then bo5 else prim4<0; bo3:=if prim3=0 then bo4 else prim3>0; bo2:=if prim2=0 then bo3 else prim2>0; bo1:=if prim1=0 then bo2 else prim1<0; if bo1 then goto søgop; if op+opbasis < ned+nedbasis then begin for i:=4 step 4 until indivlæ do begin r:=z.op.i; z.op.i:=z.ned.i; z.ned.i:=r end; if indivlæ extract 2 = 2 then begin j:=z.op.indivlæ; z.op.indivlæ:=z.ned.indivlæ; z.ned.indivlæ:=j end; goto søgned; end; slut2:= op+opbasis; start2:= start; start:= ned+nedbasis; if slut-start < slut2-start2 then begin i:=slut; slut:=slut2; slut2:=i; i:=start; start:=start2; start2:=i; end; if start2<slut2-indivlæ2 then quicksort(start2,slut2,enblok); end for m; end quicksort; procedure transport(fysisk,basis,plads,andenplads); integer fysisk, basis, plads, andenplads; begin integer logisk, blok, blokrel, subbloknr, blokbasis; logisk:= fysisk+basis; blok:= logisk//logiskbloklængde; blokrel:= logisk mod logiskbloklængde; if blok = nuvblok(0) then plads := 0 else if blok = nuvblok(1) then plads := 1 else begin plads := 1-andenplads; io(plads,5); nuvblok(plads):= blok; io(plads,3); end; subbloknr := blokrel//logisksubbloklængde; blokbasis := plads * fysiskbloklængde; fysisk := blokrel + subbloknr * diff + blokbasis; subblokstart := subbloknr * fysisksubbloklængde + blokbasis; basis := logisk - fysisk; transporter := transporter + 1; end transport; open(z,4,filnavn,1 shift 18); close(z,false); getzone6(z,ia); fa:=ia(19)+1; getshare6(z,ia,1); indivlæ:=læ; indivlæ2:=2*indivlæ; nøgle1:= ngl(1); nøgle2:= ngl(2); nøgle3:= ngl(3); nøgle4:= ngl(4); nøgle5:= ngl(5); nøgle6:= ngl(6); nøgle7:= ngl(7); nøgle8:= ngl(8); diff:= fysisksubbloklængde mod indivlæ; logisksubbloklængde := fysisksubbloklængde - diff; logiskbloklængde := b * logisksubbloklængde; nuvblok(0) := nuvblok(1) := -1; opbasis:= nedbasis:= nedplads:= 0; quicksort(-indivlæ, indivlæ*antalindiv, false); io(0,5); io(1,5); end zone blok; end discsort; zone z(128, 1, stderror); integer array cattable(0:catalogs,1:7), ia(1:20), key(1:8), help(1:1); real array param(1:3),fpparam1,fpparam2(1:2),catname(1:6); long array field laf; real array field raf; boolean tempbase, maincat_specified; array field name,doc, tailname; integer array field interval; integer field f,f1,f2,f16; integer i, j, k, l, length, cat, lim, old1, old2, new1, new2,new,old, rec,sysbase,baselow,baseup,contents,sep,t,segno,segm,sum,total, c1,c2,line,page,projectlow,projectup,perm,entrylines,shortclock, userlow,userup,persegm,totpersegm; long lg; real r; boolean array catyes(-1:catalogs); boolean mini,sp,systemonly,systemyes,basesortyes,docsortyes, nosortyes,slicesortyes,nameyes,docnameyes,baselim,skip,bo1,bo2; procedure outshortclock(shortclock); integer shortclock; begin real r; write(out,<:d.:>,<<zddddd>, systime(4,(if shortclock>0 then shortclock else shortclock + extend 1 shift 24) /625*1 shift 15+12,r), <:.:>,<<zddd>,r/100) end outshortclock; procedure outmodekind; begin integer i; for i:=1 step 1 until 21 do begin if segm=(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>,segm shift (-12),<:.:>, <<d>,segm extract 12,sp, if segm extract 12<10 then 2 else 1); end else begin write(out,sp,1,case i of ( <: ip:>, <: bs:>, <: tw:>, <: tro:>, <: tre:>, <: trn:>, <: trf:>, <: tpo:>, <: tpe:>, <: tpn:>, <: tpf:>, <: tpt:>, <: lp:>, <: crb:>, <: crd:>, <: crc:>, <: mto:>, <: mte:>, <: nrz:>, <:nrze:>, <: pl:> ), sp, 4) end end outmodekind; procedure outcr(rest); value rest; integer rest; begin line:= line - 1; if line < rest then outpage else write(out, <:<10>:>); end; procedure outpage; begin integer i; i:=1; page:= page + 1; if mini then write(out,<:<12><10><10>:>,string catname(increase(i)),<::<10>:>) else begin write(out, <:<12><10>catsort page :>,<<d>,page, <:, name of catalog: :>,string catname(increase(i)),sp,6); outshortclock(shortclock); write(out,<:<10><10>:>); end; line:= entrylines-4; end; comment initialization; tempbase:=false; param(3):=real<::>; lim:=limits(1)-2; raf:=10; <*fields dic name in array catname*> for i:=0 step 1 until catalogs do begin laf:=i*14; lim:=lim+2; <*next chain in nametable*> system(5,lim,help); <*help(1)=address of next chain table*> if help(1)=main_dev_chain_addr then main_dev_no:=i; <*internal no of chaintable for device containing main cat*> system(5,help(1)-28,catname); <*name of aux. catalog, slice length, doc name etc.*> tofrom(cattable.laf,catname.raf,8); <*document name*> cattable(i,5):=catname(6) shift (-24) extract 24; <*slice length*> end; interval:=2; f2:=2; f16:=16; name:=6; tailname:=2; doc:=16; page:=0; sp:=false add 32; catyes(-1):=true; maincat_specified:=false; for i:=0 step 1 until catalogs do catyes(i):=false; systemonly:=false; systemyes:=false; basesortyes:=true; docsortyes:=false; slicesortyes:=false; nosortyes:=false; nameyes:=false; docnameyes:=false; baselim:=false; mini:=false; k:=1; if system(4)fpparam:(k,param)=6 shift 12+10 then k:=2; <*=, name follows*> system(4,k-1,param); <*program name*> i:=1; open(z,0,string param(increase(i)),0); <*program name -> z*> monitor(42<*lookup*>,z,0,ia); <*lookup program name*> entrylines:=ia(7) shift (-12) extract 11; <*file count bruges til layout*> close(z,true); sep:=system(4,k,param); <*first param*> for sep:=sep while sep<>0 do begin t:=0; for i:=1 step 1 until 10 do if t=0 then begin case i of begin if param(1)=real<:mainc:> add 97 and param(2)=real<:t:> then t:=1; if param(1)=real<:subca:> add 116 then t:=2; if param(1)=real<:syste:> add 109 then t:=3; if param(1)=real<:bases:> add 111 and param(2)=real<:rt:> then t:=4; if param(1)=real<:docso:> add 114 and param(2)=real<:t:> then t:=5; if param(1)=real<:nosor:> add 116 then t:=6; if param(1)=real<:name:> then t:=7; if param(1)=real<:docna:> add 109 and param(2)=real<:e:> then t:=8; if param(1)=real<:base:> then t:=11; if param(1)=real<:slice:> add 115 and param(2)=real<:ort:> then t:=12; end end; if t=0 then goto paramerror; k:=k+1; sep:=system(4,k,param); <*next param*> if t<>2 and t<>11 and sep<>8 shift 12+10 or (t=2 or t=11) and sep shift (-12)<>8 then goto paramerror; if t<>11 then begin if t=2 and sep=8 shift 12+4 <*point integer*> then t:=9; if t=2 and param(1)<>real<:yes:> and param(1)<>real<:no:> then t:=13; if t=3 and param(1)=real<:only:> then t:=10; if (t<7 or t=12) and param(1)<>real<:yes:> and param(1)<>real<:no:> then goto paramerror; case t of begin catyes(-1):=maincat_specified:=param(1)=real<:yes:>; begin bo1:=param(1)=real<:yes:>; for i:=0 step 1 until catalogs do catyes(i):=bo1; catyes(-1):=maincat_specified or -,bo1; <*subcat.yes => -,maincat unless specified*> end; systemyes :=param(1)=real<:yes:>; basesortyes:=param(1)=real<:yes:>; docsortyes:=param(1)=real<:yes:>; nosortyes:=param(1)=real<:yes:>; begin nameyes:=true; fpparam1(1):=param(1); fpparam1(2):=param(2) end; begin docnameyes:=true; fpparam2(1):=param(1); fpparam2(2):=param(2) end; begin if param(1)>catalogs or param(1)<0 then goto paramerror; catyes(param(1)):=true; catyes(-1):=maincat_specified; <*subcat.<integer> => not maincat unless specified*> end; systemonly:=systemyes:=true; ; slicesortyes:=param(1)=real<:yes:>; <*13*> begin for i:=0 step 1 until catalogs do begin raf:=0; if param.raf(1)=real<::> add cattable(i,1) shift 24 add cattable(i,2) and param.raf(2)=real<::> add cattable(i,3) shift 24 add cattable(i,4) then begin catyes(i):=true; catyes(-1):=maincat_specified; <*subcat.<name> => not maincat unless specified*> goto catname_found; end; end; goto paramerror; catname_found: end; end end else begin baselim:=true; if sep=8 shift 12+10 then begin t:=0; for i:=1,2,3,4 do if t=0 then begin if param(1)=real(case i of (<:temp:>,<:login:>,<:user:>, <:proje:> add 99)) then t:=i*2; end; if t=0 then goto paramerror; k:=k+1; sep:=system(4,k,param); if sep shift (-12)<>8 then k:=k-1 else begin if param(1)<>real<:min:> then goto paramerror; mini:=true; end; system(11)get intervals:(0,ia); userlow:=ia(5); userup:=ia(6); projectlow:=ia(7); projectup:=ia(8); baselow:=ia(t-1); baseup:=ia(t); if t=2 then tempbase:=true; end else begin baselow:=param(1); k:=k+1; sep:=system(4,k,param); if sep<>8 shift 12+4 then goto paramerror; baseup:=param(1); end end; k:=k+1; sep:=system(4,k,param); end read parameters; if slicesortyes then basesortyes:=docsortyes:=false; if nosortyes then begin systemyes:=true; nameyes:=docnameyes:=basesortyes:=docsortyes:= baselim:=systemonly:=false; end; comment central loop. lookup all catalogs, sort and list each of them; for cat:=-1 step 1 until catalogs do <*main cat = -1, aux cats = 0, ... , catalogs*> if catyes(cat) then begin <*central loop, catalog specified*> lim:=limits(1)+2*(if cat=-1 then main_dev_no else cat); <*entry in nametable to find address of chaintable*> <*for main cat chaintable for disc containing main cat*> system(5)move core:(lim, help); <*help(1):=addr of chaintable*> system(5)move core:(help(1)-28, catname); <*name of auxcat, size, doc name, last slice no of doc, *> <*first slice of chaintable area *> if cat=-1 then begin <*aux cat name for main dev exchanged with <:catalog:>*> catname(1):=real <:catal:> add 111; catname(2):=real <:g:> ; end; if catname(1) shift (-24) extract 24 <> 0 then begin <*sort and print the catalog*> comment move the catalog into a sortarea; zone oldcat(128, 1, waitproc); procedure waitproc(z,s,b); zone z; integer s,b; begin own integer wait; if s shift (-2) extract 1=1 then begin <*rejected*> wait:=wait+1; if wait>10000 then begin bad: line:=0; outcr(0); write(out,<:<10>device :>, if wait>10000 then <:inaccessible<10>:> else <:disconnected<10>:>); wait:=0; close(oldcat,true); goto hopeless end end else if s shift (-4) extract 1=1 then goto bad <*disconnected*> else stderror(z,s,b); end waitproc; systime(1,0,r); lg:=r*625; shortclock:=lg shift (-15) extract 24; i:=1; open(oldcat, 4, string catname(increase(i)), 0); <*actual catalog entry*> monitor(76)lookup head and tail:(oldcat,0,ia); sysbase:=ia.interval(2)-1; <*upper base of entry name-1*> comment system files are identified by baseup; monitor(42)lookup catalog:(oldcat, 0, ia); length:= ia(1); <*no. of segments in the catalog*> if docsortyes and -,(nameyes or docnameyes) then ia(1):=(ia(1)*15)//11+1; <*length of sortarea (11 recs a 46 bytes pr segm)*> rec:=if docsortyes then 46 else if slicesortyes or basesortyes then 36 else 34; <*rec length in sortrea*> if nosortyes then begin length:=15*length; <*no. of entries in the catalog*> totpersegm:=0; close(oldcat,true); goto sorted end; ia(2):= 0; <*document name=0 <=> pref. drum*> comment document = pref.drum; open(z, 4, <::>, 0); <*entry name=<::> <=> work name*> if monitor(40)create entry sortarea:(z, 0, ia)<>0 then begin write(out,<:<10>***catsort, create sortarea impossible:>); errorbits:=1; close(oldcat,true); goto exit end; system(11,0,ia); old1:=ia(1); <*l. catalog base*> old2:=ia(2); <*u. - - *> comment base of actual process; getzone6(z,ia); <*descr. of actual work area*> i:=15*length; <*no. of entries in the catalog*> length:=0; for i:= i step -1 until 1 do begin <*one entry at a time*> inrec6(oldcat,34); skip:=false; comment skip empty; if oldcat.f2 shift (-12)=4095 and -,nosortyes then skip:=true; <*empty entry*> if -,skip and baselim then begin comment skip outsides specified base; skip:=oldcat.interval(1)<baselow or oldcat.interval(2)>baseup; if tempbase and oldcat.f2 extract 3<>0 then skip:=true; <*temp=>-, login*> end; if -,skip and (nameyes or docnameyes) then begin comment skip unspecified names; bo1:=nameyes and (fpparam1(1)<>oldcat.name(1) or fpparam1(2)<>oldcat.name(2)); bo2:=docnameyes and (fpparam2(1)<>oldcat.doc(1) or fpparam2(2)<>oldcat.doc(2)); skip:=if nameyes and docnameyes then bo1 and bo2 else bo1 or bo2; end; comment skip system files; if -,skip and -,systemyes then skip:=oldcat.interval(2)=sysbase; comment skip non-system files; if -,skip and systemonly then skip:=oldcat.interval(2)<>sysbase; comment skip actual work area; if -,skip and ia.tailname(1)=oldcat.name(1) then skip:=ia.tailname(2)=oldcat.name(2) and old1=oldcat.interval(1) and old2=oldcat.interval(2); if skip and nosortyes then begin skip:=false; oldcat.f2:=-1 <*simulates empty entry*> end; if -,skip then begin outrec6(z,rec); length:=length+1; <*counts recs in sortarea*> tofrom(z,oldcat,34); <*entry=17 words*> f:=36; if basesortyes then begin z.f:=z.f2; z.f2:=z.f2 extract 3; end else if slicesortyes then z.f:=z.f2 shift (-12); if docsortyes then for f:=38 step 2 until rec do begin k:=if z.f16<>2048 shift 12 add 4 then 0 else 1; <*area or bs entry*> f1:=f-(if k=0 then 30 else 20); z.f:=if f=46 then k else z.f1 end; end; end <*one entry at a time*>; close(oldcat, true); setposition(z, 0, 0); comment sort the catalog; for i:=1 step 1 until 6 do key(i):=0; key(7):=10; <*namesort*> key(8):=14; <* - *> if basesortyes then begin key(1):=4; <*lower entry base*> key(2):=6; <*upper - - *> key(3):=2; <*1. slice, namekey*> end; if slicesortyes then key(6):=36 <*1. slice*> else if docsortyes then begin key(4):=40; <*document name*> key(5):=44; <*document name*> key(6):=46; <*subentry or not*> end; i:=1; if length>1 then discsort(string ia.tailname(increase(i)),rec,length,1,key); sorted: if nosortyes then begin i:=1; open(z,4,string catname(increase(i)),0); end; for i:=0 step 1 until catalogs do cattable(i,6):=cattable(i,7):=0; <*slices, entries*> comment list the catalog; sum:=total:=c1:=c2:=segno:=line:=old:=old1:=old2:=perm:=0; for i:=length step -1 until 1 do begin <*list the catalog*> if nosortyes and i<>length and i mod 15=0 then begin inrec6(z,2); persegm:=z.f2; totpersegm:=totpersegm+persegm; end; inrec6(z,rec); new1:=z.interval(1); new2:=z.interval(2); f:=32; contents:=z.f shift (-12); f:=if docsortyes then 36 else 8; new:=z.f shift (-16) extract 8; comment print one line. print layout; if basesortyes and (new1 <> old1 or new2<>old2 or perm<>z.f2) then begin if i<>length then begin write(out,<:<10>:>,sp, if basesortyes then 13 else 30, <<-ddddd>,sum,<: segm.:>,c1,<: entr.:>); line:=line-1; sum:=c1:=0; outcr(5); end; outcr(0); write(out,<: base::>,<<-ddddddd>,new1,new2); if baselim and z.f2=3 then write(out,if new1=userlow and new2=userup then <: user:> else if new1=projectlow and new2=projectup then <: project:> else <: perm:>) else write(out,case z.f2+1 of (<: temp:>,<: key1:>,<: login:>,<: perm:>)); outcr(1); end else if nosortyes then begin if i mod 15=0 and i<>length then write(out,<:<10>:>,<<d>,persegm,<: entries<10>:>); outcr(if i mod 15=0 then 5 else 0); end else begin if new<>old and -,basesortyes and -,slicesortyes then outcr(5); outcr(0) end; if nosortyes and i mod 15=0 then begin write(out,<<d>,segno,<:. segm.<10>:>); line:=line-1; segno:=segno+1 end; old1:=new1; old2:=new2; old:=new; perm:=z.f2 extract 3; comment print one entry; k:=1; if z.f2 shift (-12)=4095 then segm:=0 else begin <*empty entry*> segm:=z.f16; c1:=c1+1; c2:=c2+1 end; if z.f2 shift (-12)<>4095 then begin <*non empty entry*> if segm>=0 then begin <*area entry*> if cat=-1 then begin <*main cat, the proper auxcat no is found*> j:=-1; for j:=j+1 while -,(z.doc(1)=real<::> add cattable(j,1) shift 24 add cattable(j,2) and z.doc(2) =real <::> add cattable(j,3) shift 24 add cattable(j,4)) and j<catalogs do; end else <*aux cat, the aux cat no is cat*> j:=cat; cattable(j,6):=cattable(j,6)+ (segm+cattable(j,5)-1)//cattable(j,5); cattable(j,7):=cattable(j,7)+1; sum:=sum+segm; total:=total+segm end else begin <*non area entry*> f:=if basesortyes then 36 else f2; if z.f shift (-12) <> 0 then begin <*first slice<>0 <=> entry belongs to an aux cat*> j:=(z.f shift (-12) extract 11)//2; cattable(j,7):=cattable(j,7)+1; end; <*non area entries belonging to main cat only*> <*are not counted *> end; end <*non empty entry*>; if nosortyes and z.f2 shift (-12)=4095 then write(out,<: -:>) else begin <*print one line*> write(out, sp, 14 - write(out, sp,if docsortyes and segm=2048 shift 12 add 4 then 2 else 0, string z.name(increase(k)))); if -,basesortyes then begin write(out, <<dddd>, z.f2 shift(-12), z.f2 shift(-3) extract 9, z.f2 extract 3, sp,1); comment first slice, segment, key; write(out,<< -ddddddd>,new1,new2); comment interval; end; if segm >= 0 then write(out, <<ddddd>, segm, sp,4) else outmodekind; comment length or mode.kind; f:= 18; raf:=10; <*to field docname in array catname*> k:= 1; write(out, sp, 12 - write(out, if segm>=0 and cat<>-1 then string catname.raf(increase(k)) else string z.doc(increase(k)))); <* document name of area entries in aux cats are taken*> <*from the doc name of the catalog,for area entries*> <*in the main catalog or non area entries from the *> <*doc name of the entry itself *> for f:= 26 step 2 until 34 do begin write(out, <: :>); if f=26 and z.f<>0 and contents<>4 and contents<=32 then outshortclock(z.f) else begin if mini then goto endline; if z.f shift(-12) <> 0 then write(out, <<d>, z.f shift(-12), <:.:>); write(out, <<d>, z.f extract 12); end; comment rest of the tail; end; endline: end print one line; end list the catalog; if basesortyes and c1<>0 then begin write(out,<:<10>:>,sp,13, <<-ddddd>,sum,<: segm.:>,c1,<: entr.:>); end; if nosortyes then begin inrec6(z,2); write(out,<:<10>:>,<<d>,z.f2,<: entries<10>:>); totpersegm:=totpersegm+z.f2; end; if c1=0 then outcr(0); if nosortyes then write(out,<:<10>:>,<<d>,totpersegm,<: entries:>); write(out,<:<10><10>:>,sp,if basesortyes then 6 else 37, <:total: :>,<<-ddddd>,total,<: segm.:>,c2,<: entr.:>); hopeless: close(z, true); outcr(catalogs+5); sum:=0; write(out,<:<10><10><10>:>); for i:=0 step 1 until catalogs do begin if cattable(i,1)<>0 and cattable(i,6)+cattable(i,7)<>0 then begin k:=1; j:=cattable(i,5)*cattable(i,6); sum:=sum+j; write(out,<:<10>:>); write(out,sp,10-write(out,string ( real<::> add cattable(i,increase(k)) shift 24 add cattable(i,increase(k))))); write(out,<:::>,<<dddd>,cattable(i,6),<: slices *:>, <<ddd>,cattable(i,5),<: = :>,<<dddddd>,j,<: segments:>, << dddd>,cattable(i,7),<: entries:>); end; end for i; j:=0; for i:=0 step 1 until catalogs do if cattable(i,6)<>0 then j:=j+cattable(i,5)*cattable(i,6); <*total no of segments in all documents*> if j>1 then begin write(out,<:<10><10><10>:>); write(out,sp,22,<:total = :>,<<dddddd>, j,<: segments:>); end; monitor(48)remove entry:(z, 0, ia); end <*sort and list the catalog*>; end <*central loop, catalog specified*>; if false then paramerror: begin long array field laf; write(out,<:<10>***catsort error param: :>); 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,param.laf) else write(out,<<d>,param(1)); k:=k+1; sep:=system(4,k,param); end; errorbits:= 1; end listfp; exit: end second level procedure program end procedure program ; 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◀