|
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: »treaduscat«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »treaduscat«
<*read user catalog (tramos-type) 1981-12-03 Anders Lindgård *> procedure writeentry(desc,listz,extended); value extended; boolean extended; integer array desc; zone listz; begin integer i,j; long array field n,in_f,out_f,term; long array con(1:2); con(1):=long <:conso:> add 'l'; con(2):=long <:e:>; n:=4; in_f:=48; out_f:=in_f+8; term:=out_f+8; if desc(1)=-1 then write(listz,"nl",2,<:empty entry:>) else if desc(1)=-2 then write(listz,"nl",2,<:deleted entry:>) else if desc(1)<0 then write(listz,"nl",<:impossible:>,desc(1)) else begin write(listz,"nl",2, <:proc :>,true,12,desc.n, "nl",1,<:sem conaccess :>,desc(1), "nl",1,<:prio, mask :>,desc(2) shift (-12) extract 12, desc(2) extract 12, "nl",1,<:buf , area :>,desc(9) shift (-12) extract 12, desc(9) extract 12, "nl",1,<:intern, func :>,desc(10) shift (-12) extract 12, desc(10) extract 12, "nl",1,<:mode :>,desc(11), "nl",1,<:max bases :>,<< -dddddddd>,desc(12),desc(13), "nl",1,<:std bases :>,desc(14),desc(15), "nl",1,<:size :>,desc(16), "nl",1,<:user bases :>,desc(21),desc(22)); n:=32; write(listz, "nl",1,<:program :>,desc.n, "nl",1,<:project,user :>,<< ddddddd>,desc(23) shift (-8) extract 16, desc(23) extract 8, "nl",1,<:usercatno :>,desc(24), "nl",1,<:in :>); if desc.in_f(1)=0 then write(listz,con) else write(listz, desc.in_f); write(listz, "nl",1,<:out :>); if desc.out_f(1)=0 then write(listz,con) else write(listz, desc.out_f); write(listz, "nl",1,<:term :>); if desc.term(1)=0 then write(listz,con) else write(listz, desc.term); write(listz,"nl",1,<:job state :>,desc.conjobstate); write(listz,<: temp perm set used type entries segment entries segment entries segment entries segment:>); for i:=1 step 1 until no_of_bs do begin fi:=12*i-12; fi:=usercatbs.fi(6); write(listz,"nl",1,<< dddddd>,desc.fi(1), desc.fi(2),desc.fi(3),desc.fi(4), desc.fi(6),desc.fi(7),desc.fi(8),desc.fi(9), << dd>,desc.fi(5)); end listbs; if extended then begin <*console descriptor*> write(listz,"nl",1,<:pda in :>,desc.conprocin, "nl",1,<:pda out :>,desc.conprocout, "nl",1,<:pda term :>,desc.contermpda, "nl",1,<:descrip term :>,desc.condesterm, "nl",1,<:job name :>,desc.conjobname, "nl",1,<:child no :>,desc.concurchild, "nl",1,<:child pda :>,desc.concurchildpda, "nl",1,<:terminal no :>,desc.contermno, "nl",1,<:descrip reference:>,desc.conref, "nl",1,<:job number :>,desc.conjob); end console descriptor; end non empty entry; end write entry; boolean procedure read_user_cat(name,desc,list,listz); value list; boolean list; long array name; integer array desc; zone listz; begin integer i,j,hkey,bs; boolean found; integer array field fi,d,iaf; long array field n; fi:=n:=0; setbaseusercat; i:=connectcuri(usercatname); readusercat:=false; if i=0 then begin if name(1)=0 then disable begin <*entry 0*> setposition(in,0,0); inrec6(in,512); if list then begin write(listz,"nl",1,<:usercat entry 0:>, << ddd >, "nl",1,<:entry length :>,in.fi(2), "nl",1,<:entry0 length :>,in.fi(3), "nl",1,<:catalog size :>,in.fi(4), "nl",1,<:no of users :>,in.fi(5), "nl",1,<:updated :>); writetime(listz,in.fi(10)); write(listz, "nl",2,<:device name slicelength reference:>); end list; n:=0; d:=0; for fi:=20 step 12 until lengthusercatentry0 do begin for i:=1 step 1 until 6 do desc.d(i):=in.fi(i); if list then write(listz,"nl",1, true,11,desc.d.n, << ddd >,desc.d(5), "sp",8,desc.d(6)); d:=d+12; end for; unstackcuri; end entry 0 else begin h_key:=hash(name,size_user_cat); found:=search_user_cat(in,h_key,sizeusercat,name,desc); if -,found then found:=search_user_cat(in,0,h_key,name,desc); if found and list then disable writeentry(desc,listz,false); found:=found and desc.conusercatno<=usercatusers+10; if found then begin for i:=1,2 do desc.con_jobname(i):=desc.con_procname(i):=name(i); for bs:=1 step 1 until noofbs do begin iaf:=(bs-1)*12; iaf:=usercatbs.iaf(6); for i:=3,4 do perm_bs_claimed(desc.conusercatno,bs,i):= desc.iaf(i); for i:=1,2 do perm_bs_claimed(desc.conusercatno,bs,i):= desc.iaf(5+i); end; end found; readusercat:=found; unstackcuri; end other entry; end connect; resetbase; end read user cat; algol list.off; integer procedure hash(name, catsize); ___________________________________ comment compute hashvalue; long array name; integer catsize; begin integer nv; long name1; name1 := name(1) + name(2); nv := name1 extract 24 + name1 shift (-24); if nv < 0 then nv := - nv; hash := nv mod catsize; end; boolean procedure search_user_cat(s_cat,start_segm, end_segm, proc_name,desc); ___________________________________________________________ comment search segment; comment find <proc_name> entry in user_catalog; value start_segm, end_segm; integer start_segm, end_segm; integer array desc; long array proc_name; zone s_cat; begin integer track,h_key,rest,i,res,rep; boolean found; integer array field fi; fi:=0; search_user_cat:= found := false; rep:=0; repeat rep:=rep+1; setbaseusercat; createareaprocess(usercatname); if res=1 then delay(1); res:=reserveprocess(usercatname); resetbase; until res=0 or rep=10; if res=0 then begin setposition(s_cat, 0, start_segm); for track := start_segm + 1 step 1 until end_segm do begin repeat rest := inrec_6(s_cat, length_user_cat_entry); h_key := s_cat.con_access; if h_key <> -1 and h_key <> -2 and _ s_cat.con_proc_name(1) = proc_name(1) and _ s_cat.con_proc_name(2) = proc_name(2) then begin search_user_cat:= found := true; for i:=length_user_cat_entry//2 step -1 until 2 do desc(i):=s_cat.fi(i); <*desc(1) is a semaphore*> end; until rest < length_user_cat_entry or found; end; end res=0; releaseprocess(usercatname); end search; algol list.on; ▶EOF◀