|
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: 46080 (0xb400) Types: TextFileVerbose Names: »comint1«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system └─⟦72244f0ef⟧ └─⟦this⟧ »comint1«
process comint( var comint_sem:semaphore; var sys_vector:system_vector; var formatter_sem:semaphore); (*************************************************************************) (* comint *) (* *) (* son_process of ncth *) (* parameters: comint_sem = semaphore receiving inputbuffers from ncp. *) (* sys_vector = only operator_sem is used by inchar. *) (* formatter_sem = semaphore belonging to formatter. Recei- *) (* ves outputbuffers from ncp and comint. *) (* son_processes: none. *) (* external functions: none. *) (* waiting-points: at ?. *) (* function: Interprets messages from operator, and fill out messages *) (* to ncp. *) (*************************************************************************) const maxint=32767; ch_b_sz=256; numbuf_sz = 256; messform=13; dataform=10; var chbuf : array(1..ch_b_sz) of char; def_base : integer := 10; \f const inbuf_error=0; try_again=2; ill_base_val = 25; inbuf_init= operbuf_t(6+alfalength,97,0,"ncth ",?); idbuf_sz = 50; var inbufp:integer:=0; inbuf_ref:reference; inbuf_sem:semaphore; inbuf_pool:pool 1 of operbuf_t; instr: databuft; ch:char; last_ch:integer; idbuf : array ( 0..idbuf_sz - 1) of char; idbufp : integer := 0; procedure print(nr:integer); forward; (************************************************************************) (* *) (* odd *) (* function: true if nr is odd. *) (************************************************************************) function odd(val:integer):boolean; begin odd:=val mod 2 > 0 ; end; procedure reset_inchar; begin inbufp:=0; end; (*************************************************************************) (* *) (* inchar *) (* *) (* external parameters: *) (* inbufp: if inbufp=0 then ready for new operatormessage *) (* if =last_ch then reading last character in message *) (* last_ch: last character to be read in current message *) (* inbuf_ref,inbuf_sem,inbuf_pool: inbuf_zone. *) (* ch: last read character. *) (* internal parameters: *) (* nobreak: false if an unintelligible message is received. *) (* waiting-points: at line ?. *) (* function : reading messages from operator character by character. *) (* only used by lexan *) (*************************************************************************) procedure inchar; var nobreak:boolean:=true; begin while inbufp = 0 do begin repeat if inbufp > 0 then print(try_again); signal(inbuf_ref,sys_vector(operatorsem)^); wait(inbuf_ref,inbuf_sem); inbufp:=succ(inbufp); until ( inbuf_ref^.u2 = 0 ) or ( inbufp > 4 ) ; if inbuf_ref^.u2<>0 then begin nobreak:=false; ch:=esc; print(inbuf_error); end else lock inbuf_ref as inbuf:operbuf_t do begin last_ch:=inbuf.next-6-alfalength; if last_ch <= 0 then inbufp:=0 else inbufp:=1; instr := inbuf.databuf; end; end; if nobreak then begin ch:=instr(inbufp); inbufp:=succ(inbufp); if inbufp>last_ch then inbufp:=0 end; end; (* of inchar *) (**********************************************************************) (* *) (* lexan *) (* *) (* external parameters: *) (* l_st_tab: state-table. *) (* l_act_tab: action-table. *) (* chtab: character-grouping-table *) (* l_att1 - l_att3: containing attr. of detected lex.-sym. *) (* chbuf: acts as characterstringbuffer. Also used at iden- *) (* tifierrecognition. *) (* chbufp: points at first not-used position in charbuf. *) (* def_base: default_base. Normally 10. *) (* no_new_char: Set true if current ch-val is to be re-used. *) (* internal parameters: *) (* oldst,newst: controlling statemashine. *) (* errnr: >0 if an error has occured. *) (* base: = def_base initially, but may be altered if spec. *) (* chgr: the charactergroup determined by chtab. *) (* action: the action to be taken upon state_change. *) (* *) (* call of other procedures: *) (* print,inchar,accnum,accstr *) (* waitingpoints: *) (* via inchar line ? and print line ?. *) (* function: *) (* detecting lexical symbols in operatormessages. possible *) (* symbols defined by lexsym line ?. *) (* *) (**********************************************************************) type lexsym=(notused,eq,id,str,num,d_amp,s_amp,star,comma,colon,semicolon,?,errsym,break); l_r_t=packed array(1..10) of 0..15; l_t_type=array(0..8) of l_r_t; ch_tab_type=packed array(0..127) of 1..15; const a=10; b=11; c=12; d=13; l_st_tab=l_t_type( (*0:*)l_r_t(3,1,4,4,1,2,5,6,8,9), (*1:*)l_r_t(1,1,1,1,1,2,9,9,9,9), (*2:*)l_r_t(2,2,2,2,2,2,9,9,9,9), (*3:*)l_r_t(3,3,3,2,2,2,9,9,9,9), (*4:*)l_r_t(1,1,1,1,1,2,5,9,9,9), (*5:*)l_r_t(5,5,5,9,9,9,9,9,9,9), (*6:*)l_r_t(6,6,6,6,6,6,6,7,6,6), (*7:*)l_r_t(9,9,9,9,9,9,9,6,9,9), (*8:*)l_r_t(9,9,9,9,9,9,9,9,9,9)); l_act_tab=l_t_type( (*0:*)l_r_t(1,2,3,3,2,2,0,0,0,4), (*1:*)l_r_t(2,2,2,2,2,2,6,6,7,7), (*2:*)l_r_t(2,2,2,2,2,2,6,6,8,8), (*3:*)l_r_t(1,1,1,2,2,2,6,6,9,9), (*4:*)l_r_t(2,2,2,2,2,2,0,6,7,7), (*5:*)l_r_t(a,a,a,6,6,6,6,6,9,9), (*6:*)l_r_t(2,2,2,2,2,2,2,0,2,2), (*7:*)l_r_t(6,6,6,6,6,6,6,2,b,b), (*8:*)l_r_t(c,c,c,c,c,c,c,c,d,c)); ch_tab= ch_tab_type( (* 0..9 *)12,12,12,12,12,12,12,12,12,12, (*10..19*)11,12,11,11,12,12,12,12,12,12, (*20..29*)12,12,12,12,12,12,12,13,12,12, (*30..39*)12,12,10,12, 8, 6, 6, 6, 9, 7, (*40..49*)12,12,10, 6,10,10,12,12, 1, 1, (*50..59*) 1, 1, 1, 1, 1, 1, 1, 1,10,10, (*60..69*)13,10,12,12, 6, 2, 3, 2, 3, 2, (*70..79*) 2, 5, 4, 5, 5, 5, 5, 5, 5, 4, (*80..89*) 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, (*90..99*) 5, 5, 5, 5, 6, 6,12, 2, 3, 2, (*00..09*) 3, 2, 2, 5, 4, 5, 5, 5, 5, 5, (*10..19*) 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, (*20..27*) 5, 5, 5, 5, 5, 5,12,12 ); var l_att1,l_att2,l_att3:integer; chbufp:integer:=1; no_new_char:boolean:=false; procedure reset_lexan; begin reset_inchar; no_new_char:=false; end; function lexan:lexsym; const miss_sep=1; ill_digit=3; ill_char=4; numb_ofl=5; chbuf_ofl=6; var oldst:integer; newst:integer:=0; errnr:integer:=0; base :integer; chgr :integer; action:integer; i : integer; procedure accstr; begin if chbufp + l_att3 <= ch_b_sz then chbuf(chbufp+l_att3):=ch else errnr:=chbuf_ofl; l_att3:=l_att3+1; end; (* of accstr *) procedure accnum; var val:integer; begin case ch of "0".."9":val:=ord(ch)-48; "A".."F":val:=ord(ch)-55; "a".."f":val:=ord(ch)-87 otherwise errnr:=9 end; if val < base then if maxint div base >= l_att1 then l_att1:=l_att1 * base + val else errnr:=numb_ofl else errnr:=ill_digit; end; (* of accnum *) begin (* body of lexan *) l_att1:=0; l_att2:=chbufp; l_att3:=0; base:= def_base; while newst < 9 do begin oldst:=newst; if no_new_char then no_new_char:=false else inchar; chgr:=ch_tab(ord(ch)); case chgr of 1..10: begin newst:=l_st_tab(oldst,chgr); action:= l_act_tab(oldst,chgr); end; 11:action:=0; 12:if oldst=6 then action:=2 else action:=5; 13: begin newst:=9; action:=0; lexan:=break; end otherwise errnr:=8 end; (********** lexan - actions *****************************) case action of 0: (* no actions *); 1: begin accnum; accstr; if errnr > 0 then begin newst:=2; errnr:=0; end; end; 2:accstr; 3: begin accstr; case ch of "B","b":base:=2; "D","d":base:=10; "H","h":base:=16; "O","o":base:=8; otherwise errnr:=7 end; end; 4: case ch of sp,"-": newst:=0; (* skip blanks and hyphens *) "=":lexan:=eq; "*":lexan:=star; ",":lexan:=comma; ":":lexan:=colon; ";":lexan:=semicolon; otherwise errnr:=8 end; 5:errnr:=ill_char; 6:errnr:=miss_sep; 7: begin l_att2 := idbufp; lexan:=id; no_new_char:=true; for i := 0 to l_att3 -1 do begin if chbuf(chbufp+i) in (.'A'..']'.) then idbuf(idbufp) := chr(ord(chbuf(chbufp+i))+32) else idbuf(idbufp) := chbuf(chbufp+i); idbufp := (idbufp+1) mod idbuf_sz; end; end; 8,b: begin if action = 8 then l_att1:=2 (* ord(symbn_t) *) else l_att1:=3; (* ord(txtt) *) lexan:=str; chbufp:=chbufp+l_att3; no_new_char:=true; end; 9: begin lexan:=num; no_new_char:=true; end; a:accnum; c: begin lexan:=s_amp; no_new_char:=true; end; d:lexan:=d_amp; otherwise errnr:=9 end; (* of lexan actions *) if errnr > 0 then begin newst:=9; print(errnr); lexan:=errsym; end; end; (* of while *) end; (* of lexan *) \f (************************************************************************) (* syntan *) (* *) (* external parameters: *) (* sactt,sactte: action-table + entry *) (* sstt, sstte: state-table + entry. *) (* snstt,snsttte: reduction-table + entry. *) (* ststack: statestack containing LR-parser-prefixes. *) (* atstack: attribute_stack. *) (* top: current top of stack *) (* state: current state of syntax-analyzer. *) (* symb: current lexical symbol. *) (* nrbufp: next free position in nrbuf ( see seman ) *) (* sess_lev: current session/subsession-level calling syntan. *) (* internal parameters: *) (* entry: used at tablelookup. *) (* rednr: used at reductionactions *) (* action: contains action after tablelookup. *) (* syntsym: contains rednr after reduction-action. *) (* *) (* call of other procedures: *) (* lexan,reset_lexan,print. *) (* waitingpoints: *) (* via lexan: lines *) (* via print: lines *) (* function: *) (* detecting syntactically reducable objects, delivering the- *) (* se reductions to seman. Administrates syntactical and se- *) (* mantical stack. *) (* *) (************************************************************************) type (* used by syntan and successors *) q=packed record symb: 1..11; nact:0..6 end; sacttt=packed array(1..37) of q; sacttet=packed array(0..25) of 1..37; r=packed record symb:1..11; nst:0..27 end; ssttt=packed array(1..58) of r; ssttet=packed array(0..25) of 0..58; s=packed record rednr:1..20; nst:0..27 end; snsttt= array(1..45) of s; snsttet=packed array(0..25) of 1..40; redstt= packed array(1..20) of 1..2; atst_t=record att1,att2,att3,att4:integer; end; const sactt=sacttt( (*0:*) q(11,3),q(2,1),q(5,3),q(7,1),q(8,0), (*1:*) q(11,4),q(2,4), (*2:*) q(11,3),q(2,4), (*3,4:as 2*) (*5:*) q(11,3),q(2,1),q(5,2),q(6,4), (*6: as 2*) (*7:*) q(11,3),q(2,4),q(6,2),q(7,4), (*8:*) q(11,3),q(2,1),q(5,3), (*9:*) q(11,3),q(8,4), (*10,11: as 9*) (*12:*)q(11,3),q(8,2),q(9,4), (*13:*)q(11,3),q(9,2),q(10,4), (*14:*)q(11,5), (*15:*)q(11,2), (*16: as 2*)(*17,18: as 8*)(*19: as 7*) (*20,21: as 0*) (*22:*)q(11,3),q(2,1),q(5,3),q(6,4), (*23:*)q(11,3),q(6,4),q(11,6) (*24: as 12*) (*25: as 9*) ); sactte=sacttet(1,6,3***8,10,8,14,1,3***21,23,26,29,30,8,18,18,14,1,1,31,35,23,21); sstt=ssttt( (*0:*) r(11,1),r(3,3),r(4,2),r(7,9),r(8,10), (*1:*) r(11,10),r(2,2), (*2:*) r(11,1), (*3:*) r(11,1),r(2,3), (*4:*) r(11,1),r(2,5), (*5:*) r(11,1),r(3,3),r(4,2),r(5,17),r(6,7), (*6:*) r(11,1),r(2,9), (*7:*) r(11,1),r(2,12),r(6,18),r(7,12), (*8:*) r(11,1),r(3,3),r(4,2), (*9:*) r(11,3),r(8,13), (*10:*)r(11,3),r(8,14), (*11:*)r(11,3),r(8,16), (*12:*)r(11,0),r(8,20),r(9,18), (*13:*)r(11,0),r(9,21),r(10,19), (*14: as 2*) (*15:*)r(11,8),r(2,10), (*16:*)r(11,1),r(2,4), (*17,18: as 8*) (*19:*)r(11,1),r(2,11),r(6,18),r(7,11), (*20,21: as 0*) (*22:*)r(11,1),r(3,3),r(4,2),r(6,6), (*23:*)r(11,0),r(6,8), (*24:*)r(11,0),r(8,20),r(9,17), (*25:*)r(11,0),r(8,15),r(11,27)); sstte=ssttet(1,6,8,9,11,13,18,20,1,27,29,31,33,36,8,39,41,24,24,43,1,1,47,51,53,56); snstt=snsttt( (*0:*) s(20,4),s(4,5),s(6,6),s(8,7),s(10,15),s(11,11),s(13,7), (*0:*) s(15,12),s(17,13),s(19,14), (*1:*) s(20,27), (*2..4: as 1*) (*5:*) s(20,16),s(4,27), (*6,7: as 1*) (*8:*) s(20,4),s(4,5),s(6,6),s(8,19),s(10,27),s(13,19),s(15,27), (*9..16: as 1*) (*17:*)s(20,4),s(4,22),s(6,27), (*18:*)s(20,4),s(4,5),s(6,23),s(8,27), (*19: as 1*) (*20:*)s(20,4),s(4,5),s(6,6),s(8,7),s(10,15),s(11,25),s(13,7),s(15,27), (*21:*)s(20,4),s(4,5),s(6,6),s(8,7),s(10,15),s(11,11),s(13,7),s(15,24),s(17,27),s(20,27) (*22: as 5*)(*23..25: as 1*)); snstte=snsttet(1,4***11,12,11,11,14,8***11,21,24,11,28,36,12,3***11); redst=redstt(1,1,1,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,1,1); var ststack:array(1..9) of integer; atstack:array(0..8) of atst_t; top:integer:=0; state:integer; symb:integer:=11; nrbufp:integer:=1; sess_lev:integer:=1; procedure reset_syntan; begin symb:=11; end; function syntan:integer; const noatt=0; stack=1; skipstack=2; synt_error=3; reduce=4; accept=5; det_synt_err = 14; var entry:integer; rednr:integer; action:integer; syntsym:integer; begin syntsym:=0; while syntsym = 0 do case symb of 1..10: begin entry:=sactte(state); repeat entry:=succ(entry) until sactt(entry).symb>symb; action:=sactt(entry-1).nact; entry:=sstte(state); repeat entry:=succ(entry) until sstt(entry).symb>symb; state:=sstt(entry-1).nst; case action of noatt: begin top:=succ(top); ststack(top):=state; atstack(top):=atst_t(0,0,0,1); end; stack: begin top:=succ(top); ststack(top):=state; with atstack(top) do begin att1:=l_att1; att2:=l_att2; att3:=l_att3; att4:=1; end; symb:=ord(lexan); end; skipstack: begin ststack(top):=state; symb:=ord(lexan) end; synt_error: begin symb:=12; print(state+10); end; reduce: begin rednr:=state; top:=top-redst(rednr); if top=0 then state:=0 else state:=ststack(top); entry:=snstte(state); repeat entry:=succ(entry) until snstt(entry).rednr>rednr; state:=snstt(entry-1).nst; top:=top+1; ststack(top):=state; if state > 25 then begin print(det_synt_err); symb:=12; end else syntsym:=rednr; end; accept: symb:=11; otherwise begin print(17); symb:=11; syntsym:=21 end end; (*of action-case*) end; (*of characters 1..10*) 11: begin (* reset syntan *) reset_lexan; state:=0; top:=0; print(sess_lev+50); symb:=ord(lexan); end; 12: begin symb:=11; syntsym:=21; end; 13: (* escape character detected *) syntsym:=22 otherwise begin symb:=11; print(18); syntsym:=21; end end;(* of symb case and while_loop *) syntan:=syntsym; end; (* of syntan *) \f const m_nr_id=18; c_str_b_sz=100; int_functerror=50;; type types = (bytet,wrdt,symbn_t,txtt,cmdt); type_set = set of types; typearr=packed array(0..4) of types; (* internal identifier-representation may only contain small letters *) (* and ciffers *) id_desc_t=packed record id_ref, id_len, id_nr:byte end; id_desc_l_t=packed array(1..m_nr_id) of id_desc_t; p_desc_t=packed record p_lform:boolean; (* p_lform:=(cardinality of p_type_sp > 1) and (m_nr_arg >1) *) p_type_sp:type_set; p_nr_arg_sp:byte; p_nr_obj_sp:byte end; p_desc_l_t=packed array(1..m_nr_id) of p_desc_t; p_l_e_t=packed record p_type, p_ref, p_mult, p_cnt:integer end; parm_l_t=array(1..m_nr_id) of p_l_e_t; c_l_e_t=packed record c_type:types; c_ref, c_cnt:byte; end; const_l_t=packed array(1..m_nr_id) of c_l_e_t; semenv_t=record nr_parm,nr_const:byte; parm_desc:p_desc_l_t; p_name_l: id_desc_l_t; c_name_l: id_desc_l_t; const_l: const_l_t; c_str_b:array(1..c_str_b_sz) of char; end; const objtype=typearr(bytet,wrdt,symbn_t,txtt,cmdt); p_l_e_init = p_l_e_t(0,0,0,0); noop = 0; terminator = 1; error = 2; escape = 3; var ncp_mess_ref : reference; hook_ref : reference; function getbyte(adr:integer) : byte; forward; function getwrd(adr: integer) : integer; forward; procedure outmess(txt:txt_type; len,msgnr:byte); forward; procedure movebytes(parm:p_l_e_t; var buf:sp_data_type; var messbufp:integer); forward; procedure send_term_data(format,oper:byte); forward; procedure init_level; forward; procedure reset_level; forward; function seman( seman_env:semenv_t; var parm_l:parm_l_t) : byte; forward; \f type bytebt = array(1..numbuf_sz) of byte; wrdbt = array(0..numbuf_sz div 2 - 1 ) of integer; const term_mess_init=sp_head_type(?, <*rec_id not used by comint *> 0, <*sender-id do. *> ?, <*seq-no*> 0, <*sp_type*> 0, <*lcp_oper*> 0, <*status*> ?, <*time*> 0 <*bytecount*>); nr_term_mess_buf=2; var mask:mask_type:=def_opt_mask; help:reference; term_mess_ref:reference; term_mess_sem:semaphore; term_mess_h_pool:pool nr_term_mess_buf; term_mess_pool: pool nr_term_mess_buf of ts_data_type; term_messbufp:integer:=1; var nrbufpool:pool 1 of bytebt; nrbufr:reference; nrbufsem:semaphore; function getbyte(adr:integer):byte; begin if adr in (.1..nrbufp+1.) then lock nrbufr as nrbuf:bytebt do getbyte:=nrbuf(adr) else getbyte:=0; end; function getwrd(adr:integer):integer; begin if adr in (.1..nrbufp+1.) then if odd(adr) then lock nrbufr as nrbuf:wrdbt do getwrd:=nrbuf(adr div 2 ) else print(int_functerror) else getwrd:=0; end; function seman:byte; const int_semerror=20; byte_confl=1; intg_ill=2; numb_b_ofl=3; strt_ill=4; ch_b_ofl=-14; cmdt_ill=6; unk_id=7; too_many_obj=8; diff_obj_t_ill=9; ill_mult_v=10; ill_mult_arg=11; too_many_arg=12; unk_parm=13; too_many_parm=14; int_type_error=19; var curr_parm:integer:=1; endm:boolean:=false; i,j:integer; all_parm_spec:boolean:=false; procedure semerror(errnr:integer); begin print(errnr+20); reset_syntan; endm:=true; seman:=error; end; function savebyte(val:integer):integer; begin if nrbufp < numbuf_sz then lock nrbufr as nrbuf:bytebt do begin nrbuf(nrbufp):=val; savebyte:=nrbufp; nrbufp:=succ(nrbufp); end else semerror(numb_b_ofl); end; function savewrd(val:integer):integer; begin if nrbufp < numbuf_sz then lock nrbufr as nrbuf:wrdbt do begin if not odd(nrbufp) then nrbufp:=succ(nrbufp); nrbuf(nrbufp div 2 ) :=val; savewrd:=nrbufp; nrbufp:=nrbufp+2 end else semerror(numb_b_ofl); end; function lookup( ref,len: byte; id_l:id_desc_l_t; nr_id:byte):integer; var i,j:integer; ch,id_ch:char; label end_loop1,out; begin lookup:=0; with seman_env do for i:=1 to nr_id do with id_l(i) do if len = id_len then begin for j:=0 to len-1 do begin ch := idbuf((ref + j ) mod idbuf_sz); id_ch:=c_str_b(j+id_ref); if id_ch <> ch then if id_ch > ch then goto out else goto end_loop1; end; lookup:=id_nr; goto out; end_loop1: end; out: end; (* of lookup *) begin (***************** body of seman *******************) seman:=noop; with seman_env do while not endm do begin i:=syntan; if all_parm_spec and ( i in (. 0..9, 12..14 .) ) then semerror(too_many_parm) else with parm_desc(curr_parm),atstack(top) do case i of (*-------------------------------------*) (* obj ::= nr *) (*-------------------------------------*) 1: if ( att1 in (.0..255.) ) and ( bytet in p_type_sp ) then begin att2:=savebyte(att1); att1:= ord( bytet ); end else if wrdt in p_type_sp then begin att2:=savewrd(att1); att1:= ord(wrdt); end else semerror(byte_confl); (*-------------------------------------*) (* obj ::= id *) (*-------------------------------------*) 2: begin i:=lookup(att2,att3,c_name_l,nr_const); if i > 0 then with const_l(i) do case c_type of bytet: if bytet in p_type_sp then begin att2:=savebyte(c_ref); att1:=ord(bytet) end else if wrdt in p_type_sp then begin att2:=savewrd(c_ref); att1:=ord(wrdt) end else semerror(intg_ill); wrdt: if wrdt in p_type_sp then begin att2:=savewrd(c_ref); att1:=ord(wrdt); end else semerror(intg_ill); txtt,symbn_t: if c_type in p_type_sp then if chbufp+c_cnt<256 then begin att2:=chbufp; for j:=c_ref to c_cnt do begin chbuf(chbufp):=c_str_b(j); chbufp:=succ(chbufp); end; att1:=ord(c_type); att3:=0; att4:=c_cnt end else semerror(ch_b_ofl) else semerror(strt_ill); cmdt: if cmdt in p_type_sp then begin att1:=ord(cmdt); (* att2:=savebyte (c_ref); *) seman:=c_ref end else semerror(cmdt_ill) otherwise semerror(int_type_error); end (* of const case *) else semerror(unk_id) end; (*-------------------------------------*) (* obj ::= symb_n ! txt *) (*-------------------------------------*) 3: if objtype(att1) in p_type_sp then att4:=att3 else semerror(strt_ill); (*-------------------------------------*) (* arg ::= arg - obj *) (*-------------------------------------*) 4: if att1 = atstack(top+1).att1 then begin att4:=att4+atstack(top+1).att4; if (att4 > p_nr_obj_sp) and (p_nr_obj_sp > 0) then semerror(too_many_obj); end else semerror(diff_obj_t_ill); (*-------------------------------------*) (* arg ::= obj *) (*-------------------------------------*) 5: att3:=1; 6: (*-------------------------------------*) (* sub_val ::= arg && arg *) (*-------------------------------------*) with atstack(top+1) do if (att1 in (.ord(bytet)..ord(wrdt).)) and (att4=1) then begin j:=getbyte(att2); if j > 0 then if (atstack(top).att4 * j <= p_nr_obj_sp) or (p_nr_obj_sp = 0) then atstack(top).att3:=j else semerror(too_many_obj) else semerror(ill_mult_v) end else semerror(ill_mult_arg); (*-------------------------------------*) (* sub_val ::= arg *) (*-------------------------------------*) 7: (* no actions *); (*-------------------------------------*) (* val ::= val & subval *) (*-------------------------------------*) 8: if (att4 < p_nr_arg_sp) or (p_nr_arg_sp=0) then if p_lform then begin with atstack(top+1) do begin att1:=savebyte(att1); att2:=savebyte(att2); att3:=savebyte(att3); att4:=savebyte(att4); att3:=savebyte(0); end; lock nrbufr as nrbuf:bytebt do nrbuf(att3):=atstack(top+1).att1; att3:=atstack(top+1).att3; att4:=att4+1; end else att4:=att4+1 else semerror(too_many_arg); (*-------------------------------------*) (* val ::= subval *) (*-------------------------------------*) 9: if p_lform then begin att1:=savebyte(att1); att2:=savebyte(att2); att3:=savebyte(att3); att4:=savebyte(att4); att2:=att1; att1:=-1; att3:=savebyte(0); att4:=1; end; (*-------------------------------------*) (* parm_id ::= id *) (*-------------------------------------*) 10: begin j:=lookup(att2,att3,p_name_l,nr_parm); if j > 0 then begin curr_parm:=j; all_parm_spec:=false; end else semerror(unk_parm); end; (*-------------------------------------*) (* parm ::= parm_id = val *) (*-------------------------------------*) 11: with atstack(top+1),parm_l(curr_parm) do begin p_type:=att1; p_ref:=att2; p_mult:=att3; p_cnt:=att4; end; (*-------------------------------------*) (* parm ::= val *) (*-------------------------------------*) 12: if ( att2 > 0 ) then with parm_l(curr_parm) do begin p_type:=att1; p_ref:=att2; p_mult:=att3; p_cnt:=att4; end; (*-------------------------------------*) (* val ::= * *) (*-------------------------------------*) 13: begin if nil(term_mess_ref) then wait(term_mess_ref,term_mess_sem); lock term_mess_ref as term_mess:ts_data_type do movebytes(parm_l(curr_parm),term_mess.sp_data,term_messbufp); send_term_data(dataform,0); att2:=0; end; (*-------------------------------------*) (* val ::= empty *) (*-------------------------------------*) 14: (* no actions *); (*-------------------------------------*) (* block ::= block , parm *) (* block ::= parm *) (*-------------------------------------*) 15,16: begin curr_parm:=succ(curr_parm); if curr_parm > nr_parm then begin curr_parm:=nr_parm; all_parm_spec:=true; end; end; 17,18: (*-------------------------------------*) (* sub_com ::= subcom : block *) (* sub_com ::= block *) (*-------------------------------------*) endm:=true; (*-------------------------------------*) (* com ::= subcom ; *) (*-------------------------------------*) 19: begin endm:=true; seman:=terminator; (* a ';' detected in input *) end; 21: (* error *) begin endm:=true; seman:=error; end; 22: (* escape *) begin endm:=true; seman:=escape; end otherwise semerror(int_semerror); end; (* of semantic reductions *) end; (* of while loop *) end; (* of seman *) procedure reset_system; begin reset_syntan; nrbufp:=1; chbufp:=1; end; type err_mess_tab_type=array(0..24) of txt_type; const err_mess_tab=err_mess_tab_type( "internal error ", "missing separator ", "timeout ", "illegal digit ", "illegal character ", "number overflow ", "char-buffer overflow", "= only after parm-id", "missing object ", "missing param-sep ", "syntaxerror detected", "byte-word conflict ", "integer-type illegal", "number-buf overflow ", "string-type illegal ", "illegal base value ", "command_type illegal", "unknown constant ", "too many objects ", "diff obj-types illeg", "illegal subval_arg 2", "illegal subval_arg 1", "too many arguments ", "unknown parameter-id", "too many param-spec "); procedure outmess; var i:integer; begin if nil(term_mess_ref) then wait(term_mess_ref,term_mess_sem); term_mess_ref^.u1 := messform; lock term_mess_ref as term_mess:comint_mess_t do with term_mess,sp_head,comint_data do begin message:=txt; mess_l:=len; messnr := msgnr; lcp_oper :=0; c_mask := mask ; c_defbase := def_base; position :=0; bytecount := 0; end; signal(term_mess_ref,formatter_sem); end; (* of outtext*) procedure print(nr:integer); begin case nr of 0..6:outmess(err_mess_tab(nr),txt_len,nr); 11..14:outmess(err_mess_tab(nr-4),txt_len,nr); 21..34:outmess(err_mess_tab(nr-10),txt_len,nr); 51:outmess("< ",1,nr); 52:outmess("? ",1,nr) otherwise outmess(err_mess_tab(0),txt_len,nr); end; (*of mess_selection*) end; (*of print*) procedure movebytes( parm:p_l_e_t;var buf:sp_data_type;var messbufp:integer); var i,j, typ,ref,mult,count,link:integer; begin with parm do begin link:=p_ref; while link > 0 do begin if p_type < 0 then begin typ:=getbyte(link); ref:=getbyte(link+1); mult:=getbyte(link+2); count:=getbyte(link+3); link:=getbyte(link+4); end else begin typ:=p_type; ref:=p_ref; mult:=p_mult; count:=p_cnt; link:=0; end; for i:=0 to mult - 1 do for j:=0 to count - 1 do begin case objtype(typ) of bytet,cmdt:buf(messbufp):=getbyte(ref+j); wrdt: begin buf(messbufp):=getbyte(ref+j*2); messbufp:=messbufp+1; buf(messbufp):=getbyte(ref+j*2+1); end; symbn_t,txtt:buf(messbufp):=ord(chbuf(ref+j)) otherwise (* no actions yet *); end; if (typ<>1) and (messbufp<sp_data_sz) or (messbufp<sp_data_sz-1) then messbufp:=succ(messbufp); end; end; end; end; (* of movebytes *) procedure send_term_data(format,oper:byte); begin if nil(term_mess_ref) then wait(term_mess_ref,term_mess_sem); term_mess_ref^.u1:=format ; (* ordinary printoutformat *) if format = messform then lock term_mess_ref as term_mess:comint_mess_t do with term_mess,sp_head,comint_data do begin sp_type:=64; lcp_oper:=oper; messnr:=255; mess_l:=0; c_mask:=mask; c_defbase:=def_base; position:=inbufp-1; bytecount:=term_messbufp - 1; end else lock term_mess_ref as term_mess: ts_data_type do term_mess.sp_head.bytecount:=term_messbufp-1; signal(term_mess_ref,formatter_sem); term_messbufp:=1 end; (* of send_term_mess*) var sub_sess_nrbufp, sub_sess_chbufp:integer; procedure init_level; begin sub_sess_nrbufp:=nrbufp; sub_sess_chbufp:=chbufp; sess_lev:=sess_lev+1; end; (* of init_level*) procedure reset_level; begin nrbufp:=sub_sess_nrbufp; chbufp:=sub_sess_chbufp; sess_lev:=sess_lev-1; end; (* of reset_level*) \f procedure session; const sendm = 4; form = 5; rout = 6; lic = 7; startrep=32; stoprep =48; ncp = 8; dce = 9; sess_env=semenv_t( 10,8, p_desc_l_t( p_desc_t(false,(.cmdt.),1,1), <* oper *> 4***p_desc_t(false,(.wrdt.),3,1), 4***p_desc_t(true,(.bytet,wrdt,txtt,symbn_t.),0,0), p_desc_t(false,(.bytet.),1,1), <* defbase *> (m_nr_id-10)***p_desc_t(?,?,?,?)), <* unused *> id_desc_l_t( id_desc_t(13,2,6), <* d1 *> id_desc_t(15,2,7), <* d2 *> id_desc_t(17,2,8), <* d3 *> id_desc_t(19,2,9), <* d4 *> id_desc_t(21,7,10), <*defbase*> id_desc_t( 5,2,2), <* h1 *> id_desc_t( 7,2,3), <* h2 *> id_desc_t( 9,2,4), <* h3 *> id_desc_t(11,2,5), <* h4 *> id_desc_t( 1,4,1), <* oper *> (m_nr_id-10)***id_desc_t(?,?,?)), <* unused *> id_desc_l_t( id_desc_t(62,3,8), <* dce *> id_desc_t(33,4,2), <* form *> id_desc_t(41,3,4), <* lic *> id_desc_t(59,3,5), <* ncp *> id_desc_t(37,4,3), <* rout *> id_desc_t(28,5,1), <* sendm *> id_desc_t(44,8,6), <* startrep *> id_desc_t(52,7,7), <* stoprep *> (m_nr_id-8)***id_desc_t(?,?,?) <* unused *> ), const_l_t( c_l_e_t(cmdt,sendm,?), <* sendm *> c_l_e_t(cmdt,form,?), <* form *> c_l_e_t(cmdt,rout,?), <* rout *> c_l_e_t(cmdt,lic,?), <* lic *> c_l_e_t(cmdt,ncp,? ), <* ncp *> c_l_e_t(bytet,startrep,?), <* startrep *> c_l_e_t(bytet,stoprep,?), <* stoprep *> c_l_e_t(cmdt,dce,?), <* dce *> (m_nr_id-8)***c_l_e_t(?,?,?) <* unused *> ), "operh1h2h3h4d1d2d3d4defbasesendmformroutlicstartrepstoprepncpdce"); var sess_parm_l:parm_l_t; endm:boolean:=false; mess_seq_no:integer:=0; i,j:integer; \f procedure sendmess; const sendm_env=semenv_t( 6,2, p_desc_l_t( 2***p_desc_t(false,(.bytet.),1,1), p_desc_t(false,(.wrdt.),1,1), 2***p_desc_t(false,(.bytet.),1,1), <*sptype,lcpoper*> p_desc_t(true,(.bytet,wrdt,txtt,symbn_t.),0,0), <* chmess *> (m_nr_id-6)***p_desc_t(?,?,?,?) <* unused *> ), id_desc_l_t( id_desc_t(23,6,6), <* chdata *> id_desc_t(16,6,2), <* datano *> id_desc_t(37,6,1), <* headno *> id_desc_t( 8,7,5), <* lcpoper *> id_desc_t(30,6,3), <* reclcp *> id_desc_t( 1,6,4), <* sptype *> (m_nr_id-6)*** id_desc_t(?,?,?) <* unused *> ), id_desc_l_t( id_desc_t(44,8,1), <* startrep *> id_desc_t(53,7,2), <* stoprep *> (m_nr_id-2)*** id_desc_t(?,?,?) <* unused *> ), const_l_t( c_l_e_t(bytet,startrep,?), c_l_e_t(bytet,stoprep,?), (m_nr_id-2)***c_l_e_t (?,?,?) ), "sptype lcpoper datano chdata reclcp headno startrep stoprep "); <* end of sendm_env*> var sendm_parm_l:parm_l_t; endm:boolean:=false; i,j:integer; messbufp:integer; begin (* body of sendm *) init_level; for i:=1 to sendm_env.nr_parm do sendm_parm_l(i):=p_l_e_init; while not endm do case seman(sendm_env,sendm_parm_l) of noop: (* no actions *) ; terminator: begin sensesem(ncp_mess_ref,comint_sem); if not nil(ncp_mess_ref) then begin pop(hook_ref,ncp_mess_ref); lock ncp_mess_ref as ncp_mess:ts_data_type do with ncp_mess,sp_head do begin i:=getbyte(sendm_parm_l(1).p_ref); if not ( i in (.1..4.)) then i:=1; with sess_parm_l(i+1) do begin if p_cnt > 0 then receiver_id:=getwrd(p_ref) else receiver_id:=1; if p_cnt > 1 then j:=getwrd(p_ref+2) else j:=0; sp_type := j mod 256; if p_cnt > 2 then j:=getwrd(p_ref+4) else j:=0; lcp_oper := j mod 256; status:=0; seq_no:=mess_seq_no; mess_seq_no:=succ(mess_seq_no) mod 256; end; with sendm_parm_l(3) do if p_ref > 0 then receiver_id:=getwrd(p_ref); with sendm_parm_l(4) do if p_ref > 0 then sp_type := getbyte(p_ref) mod 256; with sendm_parm_l(5) do if p_ref > 0 then lcp_oper:=getbyte(p_ref); sender_id:=32766; messbufp:=1; i:=getbyte(sendm_parm_l(2).p_ref); if i in (. 1..4 .) then movebytes(sess_parm_l(i+5),sp_data,messbufp); movebytes(sendm_parm_l(6),sp_data,messbufp); bytecount:=messbufp-1; end; (* of mess construct *) push(hook_ref,ncp_mess_ref); ncp_mess_ref^.u2:=0; return(ncp_mess_ref); outmess("message submitted. ",18,61); end (* of if not nil--- *) else begin outmess("no ncp-buf available",txt_len,62); end; (* of else *) endm:=true; end (* of case terminator *) otherwise endm:=true; end; (* of cmd-case *) reset_level; end; (* of sendm *) \f procedure c_formatter; const replm = 4; c_sem_env = semenv_t( 6,1, (* nr_parm, nrconst *) p_desc_l_t( p_desc_t(false,(.cmdt.),1,1), 4***p_desc_t(false,(.bytet.),1,1), p_desc_t(false,(.bytet.),1,16), (m_nr_id - 6) *** p_desc_t(?,?,?,?)), id_desc_l_t( id_desc_t(27,6,5), (*keeplm *) id_desc_t(34,4,6), (*mask *) id_desc_t( 1,4,1), (*oper *) id_desc_t(13,6,3), (*prdata *) id_desc_t( 6,6,2), (*prhead *) id_desc_t(20,6,4), (*prvert *) (m_nr_id - 6)***id_desc_t(?,?,?)), id_desc_l_t( id_desc_t(39,5,1), (* replm *) (m_nr_id-1)***id_desc_t(?,?,?)), const_l_t( c_l_e_t(cmdt,replm,?), (m_nr_id-1)***c_l_e_t(?,?,?)), "oper prhead prdata prvert keeplm mask replm "); var c_parm_l:parm_l_t; i,j:integer; endm:boolean; begin (* Body of c_formatter *) init_level; for i:=1 to c_sem_env.nr_parm do c_parm_l(i):=p_l_e_init; while not endm do begin i:=seman(c_sem_env,c_parm_l); case i of noop,replm: begin for j:=2 to 5 do with c_parm_l(j) do if p_ref <> 0 then if getbyte(p_ref) = 0 then mask(j-2):=false else mask(j-2):=true; with c_parm_l(6) do if p_ref <> 0 then for j:=0 to 15 do if j < p_cnt * p_mult then mask(j):=getbyte(p_ref + j mod p_cnt) > 0; case i of 0: ; replm: begin outmess("message repeat: ",15,91); send_term_data(messform,repmess); end; otherwise ; end; end; (* of command-exec *) otherwise endm:=true end; (* of i - case *) end; (* of while loop *) reset_level; end; (* of c_formatter *) \f const end_op = 4; (*************************) (* router lcp functions *) (*************************) crecon = 20; (* 5*4+0 *) recon = 24; (* 6*4+0 *) stcon = 12; (* 3*4+0 *) stpcon = 16; (* 4*4+0 *) sett = 28; (* 7*4+0 *) setnwt = 8; (* 2*4+0 *) sencon = 5; (* 1*4+1 *) gett = 9; (* 2*4+1 *) groutt = 13; (* 3*4+1 *) ghlst = 6; (* 1*4+2 *) gexst = 14; (* 3*4+2 *) gdrvst = 10; (*************************) (* lic lcp functions *) (*************************) gevm = 5; (* 1*4+1 *) gsurv = 9; (* 2*4+1 *) gstat = 6; (* 1*4+2 *) sevm = 4; (* 1*4+0 *) remlic= 8; (* 2*4+0 *) reslic= 12; (* 3*4+0 *) srett = 16; (* 4*4+0 *) grett = 17; (* 4*4+1 *) (*************************) (* ncp lcp functions *) (*************************) stime = 61*4+0; sevadr = 62*4+0; sexadr = 63*4+0; gevadr = 62*4+1; gexadr = 63*4+1; glcp = 2*4+1; grepf = 5*4+1; (*****************************) (* dce lcp functions *) (*****************************) restart = 8; clvc = 12; reslc = 16; dce_sett= 20; sstcr = 24; crpvc = 28; rempvc = 32; ophlc = 36; clhlc = 40; dce_gsurv=6; glcd = 10; dce_ghlst=14; ghlls = 13; ghlrs = 17; cparm_desc=p_desc_l_t( p_desc_t(false,(.bytet,cmdt.),2,1), (* desc of lcpoper *) p_desc_t(false,(.bytet.),1,1), (* desc of incarnation *) p_desc_t(true,(.bytet,wrdt,txtt.),0,0), (* desc of datapart *) (m_nr_id-3)***p_desc_t(?,?,?,?)); (* unused *) cparm_id_desc=id_desc_l_t( id_desc_t(9,4,3), (* data *) id_desc_t(6,3,2), (* inc *) id_desc_t(1,5,1), (* lcpoper *) (m_nr_id-3)***id_desc_t(?,?,?)); (* unused *) crout_env = semenv_t( 3,13, (* no of parms,consts *) cparm_desc, cparm_id_desc, id_desc_l_t( id_desc_t(13,6,1), (* crecon *) id_desc_t(71,3,12), (* end *) id_desc_t(74,6,13), (* gdrvst *) id_desc_t(55,6,9), (* getroutt *) id_desc_t(51,4,8), (* gett *) id_desc_t(66,5,11), (* gexst *) id_desc_t(61,5,10), (* ghlconst *) id_desc_t(19,5,2), (* recon *) id_desc_t(45,6,7), (* sencon *) id_desc_t(39,6,6), (* setnwt *) id_desc_t(35,4,5), (* sett *) id_desc_t(24,5,3), (* stcon *) id_desc_t(29,6,4), (* stpcon *) (m_nr_id-13)***id_desc_t(?,?,?)), (* unused *) const_l_t( c_l_e_t(bytet,crecon,?), c_l_e_t(bytet,recon,?), c_l_e_t(bytet,stcon,?), c_l_e_t(bytet,stpcon,?), c_l_e_t(bytet,sett,?), c_l_e_t(bytet,setnwt,?), c_l_e_t(bytet,sencon,?), c_l_e_t(bytet,gett,?), c_l_e_t(bytet,groutt,?), c_l_e_t(bytet,ghlst,?), c_l_e_t(bytet,gexst,?), c_l_e_t(cmdt,end_op,?), c_l_e_t(bytet,gdrvst,?), (m_nr_id-13)***c_l_e_t(?,?,?)), "lcpopincdatacreconreconstconstpconsettsetnwtsencongettgrouttghlstgexstendgdrvst" ); \f clic_env = semenv_t (3, (* no of parameters *) 9, (* no of constants *) cparm_desc, cparm_id_desc, id_desc_l_t( id_desc_t(48,3,8), (* end *) id_desc_t(28,4,1), (* gevm *) id_desc_t(51,5,9), (* grett *) id_desc_t(18,5,3), (* gstat *) id_desc_t(13,5,2), (* gsurv *) id_desc_t(36,6,5), (* remlic*) id_desc_t(42,6,6), (*reslic*) id_desc_t(32,4,4), (*sevm *) id_desc_t(23,5,7), (* srett *) (m_nr_id-9)***id_desc_t(?,?,?)), (* unused *) const_l_t( c_l_e_t(bytet,gevm,?), c_l_e_t(bytet,gsurv,?), c_l_e_t(bytet,gstat,?), c_l_e_t(bytet,sevm,?), c_l_e_t(bytet,remlic,?), c_l_e_t(bytet,reslic,?), c_l_e_t(bytet,srett,?), c_l_e_t(cmdt,end_op,?), c_l_e_t(bytet,grett,?), (m_nr_id-9)***c_l_e_t(?,?,?)), "lcpopincdatagsurvgstatsrettgevmsevmremlicreslicendgrett" ); \f cncp_env = semenv_t( 3,11, (* no of parms and const *) cparm_desc, cparm_id_desc, id_desc_l_t( id_desc_t(64,3,11), (* end *) id_desc_t(38,6,6), (* gevadr *) id_desc_t(34,4,5), (* gevm *) id_desc_t(44,6,7), (* gexadr *) id_desc_t(50,4,8), (* glcp *) id_desc_t(54,5,9), (* grepf *) id_desc_t(59,5,10), (* gstat *) id_desc_t(22,6,3), (* sevadr *) id_desc_t(13,4,1 ), (* sevm *) id_desc_t(28,6,4), (* sexadr *) id_desc_t(17,5,2 ), (* stime *) (m_nr_id-11)***id_desc_t(?,?,?)), const_l_t( c_l_e_t(bytet,sevm,?), c_l_e_t(bytet,stime,?), c_l_e_t(bytet,sevadr,?), c_l_e_t(bytet,sexadr,?), c_l_e_t(bytet,gevm,?), c_l_e_t(bytet,gevadr,?), c_l_e_t(bytet,gexadr,?), c_l_e_t(bytet,glcp,?), c_l_e_t(bytet,grepf,?), c_l_e_t(bytet,gstat,?), c_l_e_t(cmdt,end_op,?), (m_nr_id-11)***c_l_e_t(?,?,?) ), "lcpopincdatasevmstimesevadrsexadrgevmgevadrgexadrglcpgrepfgstatend" ); \f cdce_env = semenv_t( 3,18, (* no of parms,consts *) cparm_desc, cparm_id_desc, id_desc_l_t( id_desc_t(31,5,10), (* clhlc *) id_desc_t(28,4,3), (* clvc *) id_desc_t(43,5,7), (* crpvc *) id_desc_t(76,3,15), (* end *) id_desc_t(63,4,12), (* gett *) id_desc_t(59,4,11), (* gevm *) id_desc_t(84,5,17), (* ghlls *) id_desc_t(89,5,18), (* ghlrs *) id_desc_t(79,5,16), (* ghlst *) id_desc_t(72,4,14), (* glcd *) id_desc_t(67,5,13), (* gsurv *) id_desc_t(54,5,9), (* ophlc *) id_desc_t(48,6,8), (* rempvc *) id_desc_t(24,5,4), (* reslc *) id_desc_t(17,7,2), (* restart*) id_desc_t(36,4,5), (* sett *) id_desc_t(13,4,1), (* sevm *) id_desc_t(40,5,6), (* sstcr *) (m_nr_id - 18)*** id_desc_t(?,?,?)), const_l_t( c_l_e_t(bytet,sevm,?), c_l_e_t(bytet,restart,?), c_l_e_t(bytet,clvc,?), c_l_e_t(bytet,reslc,?), c_l_e_t(bytet,dce_sett,?), c_l_e_t(bytet,sstcr,?), c_l_e_t(bytet,crpvc,?), c_l_e_t(bytet,rempvc,?), c_l_e_t(bytet,ophlc,?), c_l_e_t(bytet,clhlc,?), c_l_e_t(bytet,gevm,?), c_l_e_t(bytet,gett,?), c_l_e_t(bytet,dce_gsurv,?), c_l_e_t(bytet,glcd,?), c_l_e_t(cmdt,end_op,?), c_l_e_t(bytet,dce_ghlst,?), c_l_e_t(bytet,ghlls,?), c_l_e_t(bytet,ghlrs,?), (m_nr_id - 18)***c_l_e_t(?,?,?)), "lcpopincdatasevmrestartreslclvclhlcsettsstcrpvcrempvcophlcgevmgettgsurvglcdendghlstghllsghlrs"); \f procedure lcp_func( com_env : semenv_t; lcp_id: integer); var crout_parm_l : parm_l_t; endm,startses: boolean := false; i,j : integer; messbufp : integer; begin (* body of lcpfunc *) init_level; for i := 1 to com_env.nr_parm do crout_parm_l(i) := p_l_e_init; while not endm do case seman(com_env,crout_parm_l) of noop: begin sensesem(ncp_mess_ref,comint_sem); if ( crout_parm_l(1).p_ref>0 ) then if not nil(ncp_mess_ref) then begin pop(hook_ref,ncp_mess_ref); lock ncp_mess_ref as ncp_mess : ts_data_type do with ncp_mess,sp_head do begin receiver_id := (getbyte(crout_parm_l(2).p_ref))+lcp_id; sender_id := 32766; seq_no := mess_seq_no; mess_seq_no := (mess_seq_no+1) mod 256; sp_type := 0; lcp_oper := getbyte(crout_parm_l(1).p_ref); status := 0; messbufp := 1; movebytes(crout_parm_l(3),sp_data,messbufp); bytecount := messbufp-1; crout_parm_l(1).p_ref:=0; end; (* with *) push(hook_ref,ncp_mess_ref); ncp_mess_ref^.u2 := 0; return(ncp_mess_ref); outmess("message submitted ",18,61); end (* if not nil *) else begin outmess("no ncp-buf available",txt_len,62); end else startses:=true; endm:=not(startses); end; terminator: startses:=true; error: (* no operations at all *); otherwise endm:=true; end; (* case *) reset_level; end; (* end of lcpfunc *) \f begin (* body of session *) reset_system; for i:=1 to sess_env.nr_parm do sess_parm_l(i):=p_l_e_init; mask:=def_opt_mask; outmess("session initiated ",17,81); while not endm do begin i:=seman(sess_env,sess_parm_l); if sess_parm_l(10).p_ref > 0 then def_base:=getbyte(sess_parm_l(10).p_ref); if not (def_base in (.2,8,10,16.) ) then begin print(ill_base_val); def_base:=10 end; case i of noop: (* no actions *); sendm: sendmess; form: c_formatter; rout: lcp_func(crout_env,lid_router0); lic: lcp_func(clic_env,lid_lic0); ncp: lcp_func(cncp_env,lid_ncp); dce: lcp_func(cdce_env,lid_dce0); terminator,error: (* do nothing *); escape: endm:=true; end; (* of cmd-case *) end; (* of while *) end; (* of session *) \f var i:integer; begin (* body of comint *) alloc(inbuf_ref,inbuf_pool,inbuf_sem); inbuf_ref^.u1:=1; lock inbuf_ref as inbuf:operbuf_t do inbuf:=inbuf_init; for i :=1 to nr_term_mess_buf do begin alloc(term_mess_ref, term_mess_pool,term_mess_sem); alloc(help,term_mess_h_pool,term_mess_sem); push(help,term_mess_ref); lock term_mess_ref as term_mess:ts_data_type do term_mess.sp_head:=term_mess_init; return(term_mess_ref); end; alloc(nrbufr,nrbufpool,nrbufsem); outmess("vers. 81.06.05/0 ",19,80); while true do session; end. (* comint *) «eof»