|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8448 (0x2100) Types: TextFileVerbose Names: »toperator«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system └─⟦72244f0ef⟧ └─⟦this⟧ »toperator«
process operator(name : alfa; sem_vector : system_vector); (************************************************************************) (* *) (* operator process *) (* *) (************************************************************************) const version = '800626 10.00'; level = 3; pu = 0; (* functions *) read = 1; write = 2; error_write = write + 4; attention = read + 4; (* results *) not_processed = 1; ok = 0; timeout = 2; perm_error = 3; illegal_message = 4; (* attention = 5 *) linelength = 80; first_index = 6 + alfalength; last_index = first_index +linelength - 1; esc = 27; size = 512; priority = -8; undef_name = alfa (alfalength *** '?'); type buffertype = record first, last, next : integer; inc_name : alfa; databuf : array(first_index..last_index) of char end; var <*mask : boolean := false; (* to be removed *) *> operator_sem : ^ semaphore; console_sem : semaphore; bisem : semaphore; messages : pool 2; namemessages : pool 1 of buffertype; stack : reference; driver_msg : reference; name_msg : reference; curname : alfa := undef_name; (* holds current inc-name *) cur_inputname : alfa := undef_name; errorcode : integer; console_sh : shadow; outqueue : semaphore; inqueue : semaphore; read_name : boolean; searchsem : semaphore; i : integer; att_flag: boolean := false; att_char: byte; <* procedure print(text:alfa;nbr:integer); begin if mask then begin printtext('operator: '); printtext(text); printnumber(nbr,4); printnl end end; (* print *) *> procedure putinqueue; var noerror: boolean; begin if stack^.size <= last_index div 2 then begin if ( stack^.size = 0 ) and ( stack^.u1 = attention ) then begin (* assume until further: attention. if not the msg will be kept *) att_flag:=true; att_char := stack^.u4; (* may be: esc or cr *) signal(stack,console_sem); end end else begin (* test buffer-pointers *) lock stack as p: buffertype do with p do noerror := (first_index <= first) and (first <= last) and (last <= last_index); if noerror then case stack^.u1 of write,error_write: begin signal(stack,outqueue); end; read: begin signal(stack,inqueue) end; otherwise end; (* case *) end; (* test on size *) if not nil (stack) then begin stack^.u2 := illegal_message; return(stack) end end; (* put in queue *) procedure empty_operatorsem; var more : boolean; begin more:=true; while more do begin sensesem(stack,operator_sem^); if nil(stack) then more := false else putinqueue; end end; (* empty operator_sem *) procedure init (var msg: reference; code: byte); begin msg^.u1 := code; lock msg as p: buffertype do begin p.first := first_index; if code = read then p.last := last_index else p.last := p.first - 1; end; end; procedure putch (var msg: reference; ch: char); begin lock msg as p: buffertype do begin p.last := p.last + 1; p.databuf (p.last) := ch; end; end; procedure setname (newname: alfa); var i : integer; begin if newname <> curname then begin curname := newname; init (name_msg, write); putch (name_msg, nl); putch (name_msg, '>'); for i := 1 to alfalength do if curname(i) <> sp then putch (name_msg, curname(i)) else i := alfalength; putch (name_msg, nl); signal (name_msg, console_sem); wait (name_msg, bisem); end; end; procedure outtext(index : integer); forward; procedure wrap (func: byte); (* sends 'stack' to console, with given function-code *) begin driver_msg^.u1 := func; push (driver_msg, stack); signal (stack, console_sem); wait (stack, bisem); pop (driver_msg, stack); stack^.u2 := driver_msg^.u2; end; function empty_outqueue : boolean; begin empty_outqueue := false; sensesem(stack,outqueue); if nil(stack) then empty_outqueue := true else begin lock stack as p: buffertype do setname(p.inc_name); case stack^.u1 of write: (* operator console text output *) begin wrap (write); return(stack) end; error_write: (* operator console error message *) begin wrap (write); outtext (stack^.u4); return(stack) end; end; (* case *) end; (* if not nil *) end; procedure outtext(index : integer); const textlength = 30; max =33; type errortext = array(1..textlength) of char; tabletype = array(0..max) of errortext; const table=tabletype("unknown name ", "signal: reference = nil ", "odd operand when even expected", "****f: illegal field (lst<fst)", "stv*f: field overflow ", "iocda/ioib*: nil message ptr ", "iocda: not channel message ", "iocda: not own pu ", "ioibx: not data message ", "ioibx: size too small ", "ioibx: top <= first ", "arithmetic overflow ", "index exception ", "undefined instruction code ", "odd addr. or lengths in sets ", "setad truncation error ", "stack overflow ", "intrs: illegal value ", "break: shadow = nil ", "push: identical arguments ", "pool: no core ", "link: process already linked ", "pop: first param <> nil ", "pop: second param = nil ", "push: first param = nil ", "push: first param not emty ", "remove: shadow = nil ", "start: shadow = nil ", "stop: shadow = nil ", "unlink: process in use ", "subrange type outside limits ", "illegal switch in case constr.", "upper limit in call of succ ", "lower limit in call of pred "); var i,j:integer; begin if (index >= 0) and (index <= max) then begin init (name_msg, write); j := textlength; while table (index, j) = sp do j := j-1; (* find last significant char *) for i := 1 to j do putch (name_msg, table(index, i)); putch (name_msg, nl); signal(name_msg,console_sem); wait(name_msg,bisem); end; end; procedure get_curname (var msg: reference); var i, length: integer; begin lock msg as key : buffertype do begin length := key.next - key.first; if length <> 0 then begin if length > alfalength then length := alfalength; for i := 1 to length do key.inc_name(i) := key.databuf(first_index-1+i); for i := length + 1 to alfalength do key.inc_name(i) := sp; cur_inputname := key.inc_name; end else cur_inputname := curname; curname := cur_inputname; end; (* lock *) end; (* procedure get-curname *) function searchname : boolean; var more : boolean := true; help : reference; begin searchname := false; (* search among pool of inputs *) while more do begin sensesem(stack,inqueue); if nil(stack) then more := false else lock stack as candidate : buffertype do begin if curname = candidate.inc_name then begin searchname := true; more := false; end; end; if more then signal(stack,searchsem) end; (* while more *) more := true; while more do begin sensesem( help , searchsem ); if nil(help) then more := false else signal(help,inqueue) end end; (* searchname *); process console(var consolesem : semaphore; pu,inputlevel,outputlevel : integer); external; begin platoninit; (* to be removed after test*) operator_sem := sem_vector(operatorsem); alloc(driver_msg,messages,operator_sem^); driver_msg^.u1 := attention; signal(driver_msg,console_sem); alloc(driver_msg,messages,bisem); alloc(name_msg,namemessages,bisem); name_msg^.u2 := ok; (* create console driver incarnation *) link('console ',console); i := create(console(console_sem,pu,level,level+1),console_sh,size,pu); start(console_sh,priority); while true do begin empty_operatorsem; if att_flag then begin att_flag := false; if att_char = esc then begin (* read a new inc-name *) init (name_msg, write); putch (name_msg, nl); putch (name_msg, '>'); signal(name_msg,console_sem); wait(name_msg,bisem); if name_msg^.u2 = ok then begin init (name_msg, read); signal(name_msg,console_sem); wait(name_msg,bisem); if name_msg^.u2 = ok then get_curname (name_msg); end; end else (* att-char <> esc *) setname (cur_inputname); case name_msg^.u2 of ok: begin empty_operatorsem; if searchname then begin wrap (stack^.u1); if stack^.u2 = attention then putinqueue else return(stack) end else outtext(0); end; (* ok *) attention: ; timeout: ; end; (* case *) end else if empty_outqueue then begin (* idle *) wait(stack,operator_sem^); putinqueue; end end; (* while *) end . (* operator *) «eof»