|
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: 30720 (0x7800) Types: TextFile Names: »stctxt «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦39138f30b⟧ └─⟦this⟧ »stctxt «
<********************************************************************> <* Utility SETTASCAT til indsættelse og opdatering af indgange *> <* *> <* Kald: settascat <in-spec.> *> <* *> <* <in-spec.> ::= current input or file *> <* *> <* Compiler call: settascat=algol stctxt connect.yes *> <* *> <********************************************************************> <**************************************************************> <* Revision history *> <* *> <* 86.12.01 settascat release 1.0 *> <* 88.01.07 MODE parameter added, screentype only 0 - 11 *> <* release 1.1 *> <* 89.02.21 NOLOGIN parameter added, release 1.2 *> <**************************************************************> begin <* Globale variable *> zone buf(128,1,std_error); <* Zone til message m.m. *> integer array user_id(1:4); <* Bruger id fra terminal *> long password; <* Password fra terminal *> integer array prog_name(1:4); <* Program navn *> integer array conv(0:255); <* Tegn konverterings tabel *> integer param; <* fp parameter tæller *> integer line_nr; <* Input linie nummer *> integer array mcl_bases(1:2); <* System mcl baser *> integer num_keys; <* Antal keywords *> long array keywords(0:60); <* Keywords array *> integer array field iaf; <* Work *> real array field raf; <* Work *> boolean array field baf; <* Work *> long array field laf; <* Work *> integer i; <* Work *> <* Procedure til afhjælpelse af fejl i externe procedure *> integer procedure put_ch(dest,pos,char,rep); long array dest; integer pos,char,rep; begin trap(local); put_ch:=putchar(dest,pos,char,rep); if false then local: put_ch:=-1; end; integer procedure put_txt(dest,pos,text,length); long array dest,text; integer pos,length; begin trap(local); put_txt:=puttext(dest,pos,text,length); if false then local: put_txt:=-1; end; <* Globale procedure *> procedure init_keywords; <*-------------------------------------------*> <* initialiser keywords *> <*-------------------------------------------*> begin integer i; num_keys:=51; for i:=1 step 1 until num_keys do begin keywords(i):=0; keywords(i):= long (case i of <* 1 *> (<:end:>,<:size:>,<:user:>,<:passw:>,<:cpass:>, <* 6 *> <:monda:>,<:tuesd:>,<:wedne:>,<:thurs:>,<:frida:>, <* 11 *> <:satur:>,<:sunda:>,<:block:>,<:sessi:>,<:privi:>, <* 16 *> <:mclna:>,<:base:>,<:group:>,<:mclte:>,<:freet:>, <* 21 *> <:termi:>,<:termt:>,<:termg:>,<:bypas:>,<:type:>, <* 26 *> <:scree:>,<:colum:>,<:lines:>,<:sbup:>,<:sbdow:>, <* 31 *> <:sblef:>,<:sbrig:>,<:sbhom:>,<:sbdel:>,<:ceod:>, <* 36 *> <:ceol:>,<:invon:>,<:invof:>,<:hlon:>,<:hloff:>, <* 41 *> <:delet:>,<:inser:>,<:curso:>,<:up:>,<:down:>, <* 46 *> <:left:>,<:right:>,<:home:>,<:mode:>,<:init:>, <* 51 *> <:nolog:>)); end; end; integer procedure find_keyword_value(keyword); <*----------------------------------------------------------------*> <* Find 'token' værdien for det angivne keyword *> <* *> <* keyword (call) : Long indeholdende op til 5 tegn af keyword *> <* Return : Værdien for det angivne keyword eller *> <* 0 hvis keyword er ukendt *> <*----------------------------------------------------------------*> long keyword; begin integer i; i:=num_keys+1; keyword:=(keyword shift (-8)) shift 8; for i:=i-1 while not (keyword=keywords(i)) and (i<>0) do; <* nothing *> find_keyword_value:=i; if i=0 and keyword<>0 then write_mess(8,false); end; procedure next_line; <*-------------------------------------------------------*> <* Læs til starten af næste linie i input *> <* Linier der starter med ; eller er blanke overspringes *> <* Linie tæller optælles med 1 for hver linie *> <* *> <*-------------------------------------------------------*> begin integer i; repeatchar(in); readchar(in,i); while (i<>'nl') and (i<>'em') do readchar(in,i); line_nr:=line_nr+1; readchar(in,i); if i<>'em' then begin while i=' ' do readchar(in,i); if i='nl' or i='em' or i=';' then begin next_line; readchar(in,i); end; end; repeatchar(in); end; integer procedure read_start_key; <*-------------------------------------------------------------------*> <* Find værdien af nøgleordet i starten af tekst linien i input *> <* *> <* Return : -1 = Sidste linie i fil er læst *> <* 0 = Nøgleord er ikke fundet *> <* >0 = Nøgleordets værdi *> <*-------------------------------------------------------------------*> begin long array key(1:5); integer i; readchar(in,i); if i<>'em' then begin while i=' ' do readchar(in,i); if i='nl' or i='em' or i=';' then begin next_line; readchar(in,i); end; end; repeatchar(in); read_start_key:=if readstring(in,key,1)>0 then find_keyword_value(key(1)) else -1; repeatchar(in); end; integer procedure read_text(text,max); <*---------------------------------------------------------------------*> <* Læs tekst fra input til text, til slutning af linie eller til *> <* maximalt antal tegn læst. Indledende blanktegn overspringes. *> <* *> <* text (ret) : Den læste tekst *> <* max (call) : Det maximale antal tegn der læses *> <* Return : Antal tegn læst til text *> <* *> <*---------------------------------------------------------------------*> integer max; long array text; begin integer ch,pos; boolean first; pos:=1; first:=true; text(1):=0; repeatchar(in); readchar(in,ch); if (ch<>'nl') and (ch<>'em') then begin readchar(in,ch); while ch<>'nl' and ch<>'em' and pos<=max do begin if first and (ch<>' ') then first:=false; if -,first then put_ch(text,pos,ch,1); readchar(in,ch); end; end; read_text:=pos-1; if pos<=max then put_ch(text,pos,0,1); repeatchar(in); end; boolean procedure read_nr(nr); <*-----------------------------------------------------------------*> <* Læs et heltal fra input. Er der ikke flere tal på linien *> <* returneres -1 ellers det læste tal. Er der angivet ulovligt *> <* tal (eller andet end tal) sættes read_nr til false *> <* *> <* nr (ret) : Læst tal eller -1 hvis ikke flere tal *> <* Return : True = ok False = illegalt tal *> <*-----------------------------------------------------------------*> integer nr; begin integer ch,class; read_nr:=true; repeat class:=readchar(in,ch); until class<>7 or ch=';' ; if ch=';' or class=8 then nr:=-1 else if class<2 or class>3 then begin nr:=-1; read_nr:=false; end else begin repeatchar(in); read(in,nr); end; repeatchar(in); end; boolean procedure read_name(name,ok); <*---------------------------------------------------------------------*> <* Læs et navn fra input til name. Resterende tegn nulstilles *> <* Indledende blanktegn overspringes. Der stoppes ved kommentar *> <* *> <* name (ret) : Det læste navn i integer array name(1:4) *> <* ok (ret) : True hvis navnet starter med bogstav *> <*---------------------------------------------------------------------*> integer array name; boolean ok; begin integer ch,pos; ok:=false; for pos:=1,2,3,4 do name(pos):=0; pos:=1; repeatchar(in); readchar(in,ch); while ch=' ' do readchar(in,ch); if ch>='a' and ch<='å' then ok:=true; while ((ch>='0'and ch<='9') or (ch>='a' and ch<='å')) and pos<=11 do begin put_ch(name.laf,pos,ch,1); readchar(in,ch); end; repeatchar(in); read_name:=not name(1)=0; end; procedure clear_high(i); <*---------------------------*> <* Nulstil 12 high bit i ord *> <*---------------------------*> integer i; begin i:=(i shift 12) shift (-12); end; procedure clear_low(i); <*---------------------------*> <* Nulstil 12 low bit i ord *> <*---------------------------*> integer i; begin i:=(i shift (-12)) shift 12; end; procedure set_entry; <*------------------------------------------------------*> <* Indsæt værdier læst fra input i indgange i kataloget *> <*------------------------------------------------------*> begin integer key,result,i,first,last,type; integer array id(1:4); integer array field entry; boolean exist,ok; long array password(1:8); line_nr:=1; key:=read_start_key; while key=0 or key=2 do begin if key=2 then begin write(out,<:Size field ignored<10>:>); setposition(out,0,0); end; next_line; key:=read_start_key; end; while (key<>1 <* end *>) and (key<>-1) do begin if key=3 then begin <* user entry *> if not read_name(id,ok) then write_mess(12,false); if not ok then write_mess(12,false); for i:=1,2,3,4 do buf.iaf(i+6):=id(i); send_modify_mess(132,1,0,result); if result=0 or result=2 then begin <* ok *> entry:=10; exist:=true; write(out,<:User :>,id.laf,<: :>); if result=2 then begin <* ny bruger *> <* init entry *> exist:=false; for i:=6 step 1 until 61 do buf.entry(i):=0; buf.entry(12):=1 shift 12; <* Max sessions *> buf.entry(23):=2 shift 12; <* mcl def. text empty *> buf.entry(19):=1 shift 23; <* term. group 0 *> end; next_line; key:=read_start_key; while (key>=4) and (key<=20) do begin <* indsæt i entry *> if (key>=6) and (key<=12) then begin <* læs first og last for login tid *> if not(read_nr(first) and read_nr(last)) then write_mess(11,false); if first<0 or first>24 or last<0 or last>24 then write_mess(11,false); type:=if first=0 and last=24 then 3 else if first=last then 0 else if first<last then 1 else 2; end; begin case key-3 of begin begin <* password *> for i:=1 step 1 until 8 do password(i):=0; buf.entry(6):=0; buf.entry(7):=0; if read_text(password,48)>0 then begin <* kod password *> for last:=1 step 1 until 31 do begin key:=password.baf(last) extract 12; for i:=last+1 step 1 until 32 do password.baf(i):=false add ((password.baf(i) extract 12) + key); end; for i:=1 step 1 until 16 do begin buf.entry(6):=buf.entry(6)+ password.iaf(i); buf.entry(7):=buf.entry(7)+ buf.entry(6); end; end; end; begin <* kodet password *> read(in,password(1)); buf.entry(6):=password(1) shift (-24); buf.entry(7):=password(1) extract 24; end; begin <* monday *> clear_high(buf.entry(8)); buf.entry(8):=buf.entry(8)+ ((first shift 7)+(last shift 2) + type) shift 12; end; begin <* tuesday *> clear_low(buf.entry(8)); buf.entry(8):=buf.entry(8)+ ((first shift 7)+(last shift 2) + type); end; begin <* wednesday *> clear_high(buf.entry(9)); buf.entry(9):=buf.entry(9)+ ((first shift 7)+(last shift 2) + type) shift 12; end; begin <* thursday *> clear_low(buf.entry(9)); buf.entry(9):=buf.entry(9)+ ((first shift 7)+(last shift 2) + type); end; begin <* friday *> clear_high(buf.entry(10)); buf.entry(10):=buf.entry(10)+ ((first shift 7)+(last shift 2) + type) shift 12; end; begin <* saturday *> clear_low(buf.entry(10)); buf.entry(10):=buf.entry(10)+ ((first shift 7)+(last shift 2) + type); end; begin <* sunday *> clear_high(buf.entry(11)); buf.entry(11):=buf.entry(11)+ ((first shift 7)+(last shift 2) + type) shift 12; end; begin <* block *> if not read_nr(i) or i<0 then write_mess(11,false); clear_low(buf.entry(11)); buf.entry(11):=buf.entry(11)+i; end; begin <* sessions *> clear_high(buf.entry(12)); if not read_nr(i) or i>9 or i<1 then write_mess(11,false); buf.entry(12):=buf.entry(12)+(i shift 12); end; begin <* privilegier *> type:=0; clear_low(buf.entry(12)); if not read_nr(i) then write_mess(11,false); while (i>=0) do begin if i>11 then write_mess(11,false); type:=type+(1 shift (11-i)); if not read_nr(i) then write_mess(11,false); end; buf.entry(12):=buf.entry(12)+type; end; begin <* mcl name *> if not read_name(id,ok) then write_mess(12,false); if not ok then write_mess(12,false); for i:=1,2,3,4 do buf.entry(i+12):=id(i); end; begin <* mcl bases *> if not(read_nr(first) and read_nr(last)) then write_mess(11,false); if first>last then write_mess(11,false); buf.entry(17):=first; buf.entry(18):=last; end; begin <* groups *> for i:=1 step 1 until 4 do id(i):=0; if not read_nr(i) then write_mess(11,false); while i>=0 do begin if i>95 then write_mess(11,false); first:=(i//24)+1; last:=23-(i mod 24); if -,(false add (id(first) shift (-last))) then id(first):=id(first)+(1 shift last); if not read_nr(i) then write_mess(11,false); end; for i:=1 step 1 until 4 do buf.entry(18+i):=id(i); end; begin <* mcl text *> laf:=46; i:=read_text(buf.entry.laf,80); buf.entry(23):= ((((i+2)//3*2)+2) shift 12) + i; laf:=0; end; begin <* free text *> laf:=100; read_text(buf.entry.laf,30); laf:=0; end; end; end; next_line; key:=read_start_key; end; if exist then send_modify_mess(132,1,1,result) else send_modify_mess(132,1,2,result); if result<>0 then begin if result=1 then write_mess(1,true) else write_mess(result,false); end else if exist then write_mess(3,true) else write_mess(2,true); end else write_mess(result,false); end else if key=21 then begin <* terminal entry *> if not read_name(id,ok) then write_mess(12,false); for i:=1,2,3,4 do buf.iaf(i+6):=id(i); send_modify_mess(46,2,0,result); if result=0 or result=2 then begin exist:=true; entry:=10; write(out,<:Terminal :>,id.laf,<: :>); if result=2 then begin <* init entry *> exist:=false; for i:=7 step 1 until 18 do buf.entry(i):=0; buf.entry(6):=1 shift 12; <* terminal type *> end; next_line; key:=read_start_key; while (key>=22 and key<=24) or key=51 or key=13 or key=20 do begin <* indsæt i entry *> if key=22 then begin <* Terminal type *> if not read_nr(i) or i<0 or i>2047 then write_mess(11,false); clear_high(buf.entry(6)); buf.entry(6):=buf.entry(6)+ i shift 12; end; if key=23 then begin <* terminal group *> if not read_nr(i) or i<0 or i>95 then write_mess(11,false); clear_low(buf.entry(7)); buf.entry(7):=buf.entry(7)+i; end; if key=20 then begin <* free text *> laf:=14; read_text(buf.entry.laf,30); laf:=0; end; if key=13 then begin <* block *> if not read_nr(i) or i<0 or i>4095 then write_mess(11,false); clear_low(buf.entry(6)); buf.entry(6):=buf.entry(6)+i; end; if key=24 then begin <* bypass *> buf.entry(7):=logand(buf.entry(7),(-4097)); if not read_nr(i) or i<>0 then buf.entry(7):=buf.entry(7)+(1 shift 12); end; if key=51 then begin <* nologin *> buf.entry(7):=logand(buf.entry(7),8191); if not read_nr(i) or i>99 or i<0 then write_mess(11,false); if i>0 then buf.entry(7):=buf.entry(7)+(i shift 13); end; next_line; key:=read_start_key; end; if exist then send_modify_mess(46,2,1,result) else send_modify_mess(46,2,2,result); if result<>0 then begin if result=1 then write_mess(1,true) else write_mess(result,false); end else if exist then write_mess(3,true) else write_mess(2,true); end else write_mess(result,false); end else if key=25 then begin <* type entry *> if not read_nr(type) or type<1 or key>2047 then write_mess(11,false); buf.iaf(7):=type; send_modify_mess(140,3,0,result); if result=0 or result=2 then begin exist:=true; entry:=12; write(out,<:Type :>,<<dd>,type,<: :>); if result=2 then begin <* init entry *> exist:=false; for i:=2 step 1 until 64 do buf.entry(i):=0; buf.entry(1):=type; <* terminal type *> buf.entry(3):=(80 shift 12)+24; end; next_line; key:=read_start_key; while ((key>=26) and (key<=50)) or (key=20) do begin <* indsæt i entry *> if key=26 then begin <* screen type *> type:=0; if not read_nr(i) then write_mess(11,false); while (i>=0) do begin if i>11 then write_mess(11,false); type:=type+(1 shift (11-i)); if not read_nr(i) then write_mess(11,false); end; buf.entry.baf(3):= false add (type extract 12); end; if key=49 then begin <* mode *> if not read_nr(i) then write_mess(11,false); if i<0 or i>9 then write_mess(11,false); buf.entry.baf(4):= false add (i extract 12); end; if (key>=27) and (key<=34) then begin <* 'send by' værdier *> boolean array field baf; baf:=0; if not read_nr(i) or i>255 or i<0 then write_mess(11,false); buf.entry.baf(key-22):=if i>0 then false add i else false; end; if (key>=44) and (key<=48) then begin <* et tegns værdier *> boolean array field baf; baf:=0; if not read_nr(i) or i>255 or i<0 then write_mess(11,false); buf.entry.baf(key+7):=if i>0 then false add i else false; end; if (key>=35) and (key<=42) then begin <* 6 tegns sekevnser *> if not read_nr(i) or i>255 or i<0 then write_mess(11,false); first:=1; laf:=case (key-34) of (12,16,20,24,28,32,36,40); buf.entry.laf(1):=0; while (i<>-1) and (first<=6) do begin put_ch(buf.entry.laf,first,i,1); if first<=6 then begin if not read_nr(i) or i>255 or i<-1 then write_mess(11,false); end; end; laf:=0; end; if key=43 then begin <* cursor sekvens *> if not read_nr(i) or i>255 or i<0 then write_mess(11,false); first:=1; laf:=44; buf.entry.laf(1):=0; while (i<>-1) and (first<=9) do begin put_ch(buf.entry.laf,first,i,1); if first<=9 then begin if not read_nr(i) or i>255 or i<-1 then write_mess(11,false); end; end; laf:=0; end; if key=50 then begin <* initialiserings sekvens *> laf:=56; put_ch(buf.entry.laf,1,0,75); if not read_nr(i) or i>255 or i<0 then write_mess(11,false); first:=1; while (i<>-1) and (first<=75) do begin put_ch(buf.entry.laf,first,i,1); if first<=75 then begin if not read_nr(i) or i>255 or i<-1 then write_mess(11,false); end; end; laf:=0; end; if key=20 then begin <* free text *> laf:=106; read_text(buf.entry.laf,30); laf:=0; end; next_line; key:=read_start_key; end; if exist then send_modify_mess(140,3,1,result) else send_modify_mess(140,3,2,result); if result<>0 then begin if result=1 then write_mess(1,true) else write_mess(result,false); end else if exist then write_mess(3,true) else write_mess(2,true); end else write_mess(result,false); end else write_mess(8,false); end; end; procedure get_userid; <*-------------------------------------------------------------------*> <* Set user id og password i de globale variable user_id og password *> <* Id og password hentes fra terminalen tilknyttet prim. output *> <*-------------------------------------------------------------------*> begin long array term_name(1:2); integer i; integer array ia(1:20); system(7,0,term_name); open(buf,0,term_name,0); close(buf,false); getzone6(buf,ia); i:=ia(19); getshare6(buf,ia,1); ia(4):=131 shift 12; ia(5):=i+1; ia(6):=i+11; ia(7):=0; setshare6(buf,ia,1); if monitor(16,buf,1,ia)=0 then write_mess(5,false); if monitor(18,buf,1,ia)<>1 then write_mess(10,false); if ia(1)<>0 then write_mess(10,false); for i:=1,2,3,4 do user_id(i):=buf.iaf(i); password:=buf.laf(3); end; procedure write_mess(nr,cont); <*-------------------------------------------*> <* Udskriv meddelelse på current output *> <*-------------------------------------------*> integer nr; boolean cont; begin if not cont then write(out,<: error<10>***:>,prog_name.laf,<: :>); if nr=13 then nr:=9; if nr>13 then write(out,<:internal :>,<<dd>,nr) else write(out,case nr of ( <:in use:>,<:inserted:>,<:updated:>,<:no privilege:>, <:claims:>,<:catalog full:>,<:update conflict:>, <:unknown field name:>,<:not allowed:>,<:no system:>, <:illegal number:>,<:illegal name:>)); if nr=11 or nr=12 or nr=8 or nr=1 or nr=6 or nr=7 then write(out,<: at line :>,<<dd>,line_nr); write(out,<:<10>:>); setposition(out,0,0); if (not cont) or nr>13 then goto stop; end; procedure set_buf_zone; <*-------------------------------------------*> <* Sæt zonen buf klar til message til tas *> <*-------------------------------------------*> begin open(buf,0,<:tas:>,0); close(buf,false); end; procedure send_modify_mess(size,mode,func,result); <*--------------------------------------------------------------*> <* Send modify message til tas. Repeter hvis process stoppes *> <* Message sendes via zonen buf *> <* *> <* size (call) : Antal hw der skal sendes/modtages i buf *> <* mode (call) : 1=user, 2=terminal, 3=type *> <* func (call) : 0=get, 1=modify, 2=set new, 3=delete *> <* result (ret) : Resultat fra message, 0=OK *> <*--------------------------------------------------------------*> integer size,mode,func,result; begin integer array share(1:12),zone_ia(1:20); boolean send; integer i; send:=false; while not send do begin getshare6(buf,share,1); getzone6(buf,zone_ia); share(1):=0; share(4):=(11 shift 12)+mode; share(5):=zone_ia(19)+1; share(6):=share(5)+size-2; share(7):=func; setshare6(buf,share,1); for i:=1 step 1 until 4 do buf.iaf(i):=user_id(i); buf.iaf(5):=password shift (-24); buf.iaf(6):=password extract 24; if monitor(16,buf,1,share)=0 then write_mess(5,false); if monitor(18,buf,1,share)<>1 then write_mess(10,false); result:=share(1); if result<>8 then send:=true; end; end; <* Hoved program *> trapmode:=1 shift 10; raf:=laf:=iaf:=baf:=0; line_nr:=0; mcl_bases(1):=mcl_bases(2):=0; for i:=0 step 1 until 255 do conv(i):=i; if system(4,1,prog_name.raf)<>(6 shift 12 + 10) then system(4,0,prog_name.raf); init_keywords; get_userid; set_buf_zone; set_entry; stop: end; ▶EOF◀