|
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: 10752 (0x2a00) Types: TextFile Names: »pppp«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »pppp«
<*reads commands from a given terminal and put them into a console description 1982.03.30 Anders Lindgård*> boolean procedure readcommand_list(c_buffer,descriptor,opened); value opened; boolean opened; zone c_buffer; integer array descriptor; begin integer i,j,syntax,notallowed,command,commandtype,del,int,nexttype, res,errortype,bs,usn,jobno,jte; long t; real r; integer array param(1:3),bserror(1:no_of_bs); long array consolename,n,name,nextname(1:2); boolean ok,verify,nname,sys,other,exist; boolean connect; zone very(17,1,disconnect); integer array field ct,pda,bref,ref,qref,cpda,cur; long array field nf; procedure disconnect(z,i,j); integer i,j; zone z; if (i shift (-4)) extract 1 then begin verify:=connect:=false; termdisconnect:=termdisconnect+1; end disconnect; sys:=sysconpda=descriptor.contermpda; connect:=true; verify:=opened or testop(3); for i:=1,2 do consolename(i):=descriptor.condesterm(i); if -,opened then open(c_buffer,8,consolename,1 shift 9); open(very,8,consolename,1 shift 9); <*+2*> if testop(5) then write(very,"nl",1,<:read called:>,"nl",1); if verify then write(very,"nl",1,"*",1); setposition(very,0,0); <*-2*> nexttype:=0; errortype:=0; syntax:=50; notallowed:=syntax+1; commandtype:=0; nname:=false; for i:=1,2,3 do param(i):=0; name(1):=name(2):=nextname(1):=nextname(2):=0; for command:=if errortype=0 then nextparam(c_buffer,n,int,del) else 0 while command>0 and commandtype<syntax do begin AGAIN: if false then write(very,"nl",1,<:;:>,command,<:,:>,nexttype,<:;:>); if command mod 4=1 and nexttype=1 then begin if nname then begin for i:=1,2 do nextname(i):=n(i); nname:=false; end else begin for i:=1,2 do name(i):=n(i); nname:=true; end; nexttype:=case commandtype of(2,0,0,0,0,0,2, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,if nname then 1 else 0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0); if verify and false then write(very,n,"sp",1); end else if command mod 4=1 and nexttype<2 then begin <*find a name in the list and convert it to a number*> commandtype:=syntax; i:=0; for i:=i+1 while i<syntax and commandtype=syntax do if n(1)=long (case i of (<:job:>,<:call:>,<:remov:> add 'e', <:stop:>,<:proc:>,<:run:>,<:bs:>, <:prog:>,<:in:>,<:out:>, <:term:>,<:con:>,<:prio:>, <:buf:>,<:area:>,<:int:>, <:size:>, <:creat:> add 'e',<:load:>,<:start:>, <:list:>,<:max:>,<:init:>, <:limit:> add 's',<:break:> , <:listb:> add 's',<:listd:> add 'e', <:claim:>,<:stat:>,<:end:>, <:submi:> add 't',<:queue:>,<:what:>, <:searc:> add 'h',<:kill:>, <:login:>,<:logou:>add 't', <:clear:> add 'd',<:get:>,<:lists:> add 't', <:relea:> add 's',<:setpr:> add 'i', <:test:>,<:monit:> add'o',<:btime:>, <:inclu:> add 'd',<:exclu:> add 'd', <:lock:>,<:unloc:> add 'k' )) then commandtype:=i; nexttype:=case commandtype of(1,2,0,0, 1,0,1,1,1,1,1,0,2,2,2,2,2, 0,0,0,0,0,0,0,0,1,0,0,0,0,1, 0,0,2,2,0,0,0,1,0,2,2,2,1,2,2,2,0,0,-1); <*+2*> if verify and false then write(very,case commandtype of ( <:job:>,<:call:>,<:remove:>, <:stop:>,<:proc:>,<:run:>,<:bs:>,<:prog:>,<:in:>, <:out:>,<:term:>,<:con:>,<:prio:>,<:buf:>,<:area:>,<:int:>, <:size:>, <:create:>,<:load:>,<:start:>,<:list:>, <:max:>,<:init:>,<:limits:>,<:break:>, <:listbs:>,<:listdescriptor:>,<:claim:>, <:stat:>,<:end:>,<:submit:>, <:queue:>,<:what:>,<:search:>,<:kill:>, <:login:>,<:logout:>,<:cleardescriptor:>, <:get:>,<:liststd:>,<:release:>,<:setprio:>, <:test:>,<:monitor:>,<:btime:>, <:include:>,<:exclude:>,<:lock:>,<:unlock:>, <:syntax:>),<:(nt=:>,nexttype, <:) :>); <*-2*> end name or name. else if command mod 4=2 and nexttype>=2 then begin <*integer*> param(nexttype-1):=int; nexttype:=case commandtype of( 0,1,0,0,0,0,if nexttype=2 then 3 else 0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0); <*+2*> if verify and false then write(very,<<d>,int,"sp",1); <*-2*> end integer or integer. else if command mod 4=1 and nexttype=2 and (commandtype=1 or commandtype=39) then begin <*skip integer*> nexttype:=0; end else begin commandtype:=syntax; <*+2*> if verify and false then write(very,<:***syntax:>); <*-2*> end syntax error; if lock and -,sys then commandtype:=notallowed; <*execute commands*> if descriptor.conjob=0 and descriptor.contermpda<>sysconpda then commandtype:=case commandtype of( commandtype,commandtype,notallowed, notallowed,notallowed,notallowed,notallowed, notallowed,notallowed,notallowed, notallowed,commandtype,notallowed, notallowed,notallowed,notallowed, notallowed, notallowed,notallowed,notallowed, commandtype,commandtype,notallowed, commandtype,notallowed, commandtype,commandtype, notallowed,commandtype,commandtype, commandtype, commandtype,commandtype,commandtype,commandtype, commandtype,commandtype,commandtype, commandtype,commandtype,syntax,syntax, commandtype,commandtype,commandtype, commandtype,commandtype,syntax,syntax,syntax,notallowed); if descriptor.con_job=1 and commandtype<>1 <*job*> and commandtype<>39 <*get*> then sys:=sys or logand(descriptor.con_prio_and_commands,bit_priv)<>0; if nexttype=0 or commandtype>=syntax or del='nl' then begin case commandtype of begin if name(1)=0 and connect then writeerror(very,errornameunknown,bserror) else if name(1)=0 then else begin <*_1_job*> if verify then write(very,<:job :>,name); ok:=readusercat(name,descriptor,testop(4),very) and curchildren<maxchildren; if sys then ok:=ok and (logand(descriptor.con_prio_and_commands,bit_c1)<>0 or logand(descriptor.con_prio_and_commands,bit_priv)<>0); if ok and (descriptor.con_job_id=0 or descriptor.con_job_id=param(1)) then begin descriptor.con_job:=1; descriptor.conprocin:=descriptor.conprocout:=descriptor.contermpda; std_claim(descriptor); std_bs(descriptor,very); end else begin errortype:=4; if connect then writeerror(very,errornameunknown,bserror); end; if errortype=0 and (del='nl' or del='em') then begin errortype:=createchild(descriptor,false,very,ct); set_prio_child(descriptor); if errortype=0 then errortype:=load_and_modify(descriptor,very,opened) else errortype:=errortype+64; if errortype=0 then errortype:=setbs(descriptor,bserror,very,true); if errortype=0 and descriptor.con_jobstate=0 then errortype:=startchild(descriptor); if errortype>0 then errortype:=errortype+128; end execute; if command mod 4=1 and del<>'nl' then begin goto AGAIN; end; end job; begin <*_2_call*> if verify then write(very,<:call :>,int,"sp",1,name,"sp",1); errortype:=5; if sys or (int>=firstmt and int<=lastmt) then begin errortype:=create_peripheral(name,int); if errortype>0 then begin if connect then writeerror(very,case errortype+1 of( errorready,errorresultimpossible,errorcatalogerror, errornameconflict,errordeviceunknown, errordevicereserved,errorresultimpossible),bserror); end error; end allowed else if connect then writeerror(very,error_not_allowed,bserror); end call; begin <*_3_remove*> if verify then write(very,<:remove :>); errortype:=checkchild(descriptor,true,very,ct); if errortype=0 then begin errortype:=stopchild(descriptor); if errortype=0 then begin other:=sysconpda=descriptor.termpda and sysconpda<>childtable.ct.ct_termpda; ref:=childtable.ct.ct_ref; if other then wait(condesc.ref.conaccess); errortype:=removechild(descriptor,very); if other then signal(condesc.ref.conaccess); end removed; end; end remove; begin <*_4_stop*> if verify then write(very,<:stop:>); errortype:=checkchild(descriptor,true,very,ct); if errortype=0 then begin errortype:=stopchild(descriptor); end else begin errortype:=b_check_child(descriptor,ct); if errortype=0 then begin waitch(bmessline,bref,free,0); d.bref(1):=1; d.bref(2):=-1; d.bref(3):=ct; signalch(bmessline,bref,cmess); end bchild; end check b child; end stop; begin <*_5_proc*> if verify then write(very,<:proc :>,name,"sp",1); for i:=1,2 do descriptor.conprocname(i):=name(i); end proc; if descriptor.conjob=0 then errortype:=notallowed else begin <*_6_run*> if verify then write(very,<:run :>); pda:=process_description(descriptor.conprocname); if if pda=0 then true else (pda>0 and ( descriptor.concurchildpda=pda or core.pda.parentref<>ownpda)) then begin errortype:=createchild(descriptor,false,very,ct); set_prio_child(descriptor); if errortype=0 then errortype:=setbs(descriptor,bserror,very,true); end else errortype:=checkchild(descriptor,true,very,ct); if errortype=0 then errortype:=loadandmodify(descriptor,very,opened); if errortype=0 and descriptor.con_job_state=0 then errortype:=startchild(descriptor); end run; begin <*_7_bs*> if verify then write(very,<:bs :>,name,param(1),param(2),"sp",1); exist:=checkchild(descriptor,false,very,ct)=0; usn:=descriptor.conusercatno; bs:=noofbs+1; for i:=1 step 1 until noofbs do begin bserror(i):=0; nf:=ref:=i*12-12; ref:=usercatbs.ref(6); if usercatbs.nf(1)=name(1) and usercatbs.nf(2)=name(2) then bs:=i; if exist then descriptor.ref(8):=descriptor.ref(9):=0; end for; if bs=no_of_bs+1 then begin if connect then writeerror(very,errorbsdeviceunknown,bserror); end else if exist then begin <*give the process claims*> ref:=(bs-1)*12; ref:=usercatbs.ref(6); descriptor.ref(8):=param(2); descriptor.ref(9):=param(1); setbs(descriptor,bserror,very,false); end exist else begin ref:=(bs-1)*12; ref:=usercatbs.ref(6); descriptor.ref(8):=param(2); descriptor.ref(9):=param(1); end; end bs; begin <*_8_prog*> if verify then write(very,<:prog :>,name,"sp",1); for i:=1,2 do descriptor.conprogram(i):=name(i); end prog; begin <*_9_in*> if verify then write(very,<:in.:>,name,"sp",1); for i:=1,2 do descriptor.coninname(i):=name(i); end in; begin <*_10_out*> if