|
|
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◀