|
|
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: 16896 (0x4200)
Types: TextFile
Names: »scatop3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »scatop3tx «
begin <* program scatop. author: jens arnspang, copenhagen rc, may 78 *>
<**************************************************************************
* the program is intended for use on operators level for s-user-catalog *
* managing purposes, i.e. cataloginitialization, inserting/changing/ *
* deleting entries, printing out contents of single entries or all *
* usernames. *
* for further details see appendix to the s-manual. *
* *
* if the program sourcetext is called scatoptxt the program should be *
* translated by: *
* scatop = algol scatoptxt connect.no spill.no *
*************************************************************************>
<*erklaeringer*>
integer catsize, <*antal segmenter i kataloget*>
antindprseg, <*antal entryes pr segment i kataloget*>
entrylgd, <*angiver laengden af en indgang i antal halvord*>
aktion, <*angiver det oenskede underprogram/aktion*>
katres, <*angiver resultat ved katalogopslag*>
i,j,k,p,pp,ind,int,sep,lgd,tal; <*hjalepevariable*>
boolean endlist, <*anvendes under scanningen af parameterliste til scatop*>
entry0; <*sand hvis aktionen angaar entry0, ellers false*>
integer field ifl;
real field nm1,nm2;
integer array field iaf;
real array field raf;
integer array entryarray(0:255), <*indeholder scatopparametre, dvs den nye entry*>
paramtype(0:255), <*angiver typen af param no.p, idet
0:tom, 1:<integer>, 2:<integer>.<integer>, 3:<name> *>
tail,scratch(1:10); <*anvendes ved opslag i hovedkatalog*>
real array createnewcat, createentry, deleteentry, changeentry, printentry, printcat,
procesnavn, arr, navn(1:3); <*diverse hjalepearrays til navne*>
zone entryzone(512,2,stderror);
procedure fejl(s); string s;
begin write(out,s); goto slut end;
procedure paramalarm(p,s);
value p; integer p; string s;
begin write(out,<:<10>***scatop: param no:>,<<dd>,p,<:: :>,s);
goto slut;
end;
procedure kopier(z,a,lgd);
value lgd; zone z; integer array a; integer lgd;
begin <*kopier ord 0...ord(lgd-1) i array a til ord 1...ord lgd i zone z*>
integer i; integer array field iaf;
iaf:=0;
for i:= 1 step 1 until lgd do
z.iaf(i):=a(i-1);
end;
boolean procedure temp(index);
value index; integer index;
<*proceduren er sand, hvis index peger paa en <temp>-resource*>
begin integer h;
h:=entrylgd//2; temp:=(-,entry0) and (index>=22) and
((index-22) mod 4 < 2) and (index < h-((h-22) mod 4));
end <*temp*>;
integer procedure soegnavn(navn,hashvalue);
real array navn; integer hashvalue;
begin <* navn hashes ind og soeges lineaert i susercat.
ved retur ligger den relevante indgang i entryzone.
ved retur angiver vaerdien af soegnavn:
1: kataloget fyldt, navnet fandtes ikke.
2: slettet indgang fundet, navnet fandtes ikke,
den foerste slettede indgang ligger i entryzone.
3: tom indgang fundet, navnet fandtes ikke,
der fandtes ingen slettede indgange,
den foerste tomme indgang ligger i entryzone.
4: navnet fandtes i kataloget, indgangen ligger i entryzone *>
boolean gennemkat, navnfund, tomfund, slettetfund;
integer startseg,<*indhashningssegment, 0..catsize-1 *>
segno, <*0...catsize-1*>
indgno, <*0...antindprseg-1*>
sletseg, sletind, <*angiver foerste evt. slettede indgang*>
i, int, hashvaerdi; <*hjaelpevar*>
long sum;
integer field intf;
gennemkat:=navnfund:=tomfund:=slettetfund:=false;
<*hash ind, hent gaettede entry til entryzone*>
sum:=(long navn(1))+(long navn(2));
int:=(sum extract 24)+((sum shift (-24)) extract 24);
startseg:=segno:=hashvalue:=abs((abs int) mod catsize);
<*soeg cyklisk, lineaert gennem kataloget*>
setposition(entryzone,0,startseg);
if startseg=0
then begin <*skip entry0*>
swoprec6(entryzone, entrylgd);
indgno:=0;
end
else indgno:=-1;
for indgno:=indgno+1
while (-,gennemkat) and (-,navnfund) and (-,tomfund) do
begin if indgno = antindprseg then
begin <*skift segment cyklisk*>
segno:=segno+1; indgno:=0;
if segno = catsize then segno:=0;
setposition(entryzone,0,segno);
if segno=0 then <*skip entry0*>
begin swoprec6(entryzone,entrylgd); indgno:=1 end;
end;
swoprec6(entryzone,entrylgd);
iaf:=2; hashvaerdi:=entryzone.iaf(0);
if hashvaerdi>0 then hashvaerdi:=0;
if (hashvaerdi<-2) or (hashvaerdi>0) then
fejl(<:<10>***scatop: catalogerror, hashvalue<10>:>);
case hashvaerdi+3 of
begin <*-2: slettet*> if -,slettetfund then
begin slettetfund:=true; soegnavn:=2;
sletseg:=segno; sletind:=indgno;
end;
<*-1: tom *>
begin tomfund:=true;
if -,slettetfund then soegnavn:=3;
end;
<* 0: fyldt *>
begin raf:=4;
if (entryzone.raf(1)=navn(1)) and
(entryzone.raf(2)=navn(2)) then
begin navnfund:=true; slettetfund:=false;
soegnavn:=4;
end;
end;
end <*case hashvaerdi*>;
if ((segno+1) mod catsize = startseg) and (indgno+1 = antindprseg)
then gennemkat:=true;
end <*soegning, whileloekke*>;
if gennemkat and (-,navnfund) and (-,tomfund) and (-,slettetfund)
then soegnavn:=1;
if slettetfund then
begin <*positioner til den slettede indgang*>
setposition(entryzone,0,sletseg);
for i:= 0 step 1 until sletind
do swoprec6(entryzone,entrylgd);
end;
end <*procedure soegnavn*>;
<*hovedprogramstart, initialiser*>
open(entryzone,4,<:susercat:>,0);
for i:=1,2 do createnewcat(i):=createentry(i):=deleteentry(i):=
changeentry(i):=printentry(i):=printcat(i):=real extend 0;
<*bestem aktionen/underprogrammet*>
movestring(createnewcat,1,<:newcat:>);
movestring(createentry ,1,<:insert:>);
movestring(deleteentry ,1,<:delete:>);
movestring(changeentry ,1,<:change:>);
movestring(printentry ,1,<:print:>);
movestring(printcat ,1,<:printcat:>);
if system(4,1,arr)<>4 shift 12 + 10
then paramalarm(1,<:action missing:>)
else if (arr(1)=createnewcat(1)) and (arr(2)=createnewcat(2)) then aktion:=1
else if (arr(1)=createentry(1)) and (arr(2)=createentry(2)) then aktion:=2
else if (arr(1)=deleteentry(1)) and (arr(2)=deleteentry(2)) then aktion:=3
else if (arr(1)=changeentry(1)) and (arr(2)=changeentry(2)) then aktion:=4
else if (arr(1)=printentry(1)) and (arr(2)=printentry(2)) then aktion:=5
else if (arr(1)=printcat(1)) and (arr(2)=printcat(2)) then aktion:=6
else paramalarm(1,<:action unknown<10>:>);
<*laes resten af parametre, saet entryarrayet op*>
for i:= 0 step 1 until 255 do entryarray(i):=paramtype(i):=0;
i:=1; iaf:=0; ifl:=2; nm1:=4; nm2:=8; endlist:=false;
for p:=2,p+1 while -,endlist do
begin <*accepter <integer> el <integer>.<integer> el <navn> *>
if iaf>=500 then paramalarm(p,<:too many parameters<10>:>);
k:=system(4,p,arr); sep:=k shift (-12); lgd:=k extract 12;
if (sep<>2 and sep<>4) or (lgd<>4 and lgd<>10)
then begin if (sep<2048) and (k<>0) <*positiv*> then paramalarm(p,<:unknown delimiter<10>:>);
endlist:=true;
end
else begin i:=i+1;
if lgd = 10
then begin <*navn foelger*>
entryarray.iaf.nm1:=arr(1);
entryarray.iaf.nm2:=arr(2);
iaf:=iaf+8; paramtype(i):=3;
end
else begin <*<integer> el <integer>.<integer> foelger*>
int:=arr(1); paramtype(i):=1;
if system(4,p+1,arr)=8 shift 12 + 4 then
begin p:=p+1; paramtype(i):=2;
int:=(int shift 12) + arr(1);
end;
entryarray.iaf.ifl:=int; iaf:=iaf+2;
end;
end;
end;
<*saet konstanter, soeg entry, hent den til lager*>
entry0:= system(4,2,procesnavn) <> 4 shift 12 + 10;
if aktion = 1
then begin <*tag konstanter fra parametre til scatop *>
entrylgd:=entryarray(1);
catsize:=entryarray(3);
end
else begin <*tag konstanter fra entry0*>
setposition(entryzone,0,0); swoprec6(entryzone,512);
ifl:=4; entrylgd:=entryzone.ifl;
ifl:=8; catsize:=entryzone.ifl;
antindprseg:=512//entrylgd;
<*soeg/hent entry*>
<*hvis navn angivet som foerste param, da tag det, ellers entry0*>
if -, entry0
then begin <*soeg den navngivne entry*>
katres:=soegnavn(procesnavn,entryarray(0));
if katres = 1 then
fejl(<:<10>***scatop: catalog full, name not found<10>:>);
end
else katres:=4; <*entry0 'fundet'*>
end;
<*udfoer aktionen*>
case aktion of
begin begin <* 1:newcat*>
integer lastused, devino, nameadr, firstdrumchain, topchaintable, lgdchaintable;
boolean devifundet;
long field sliceref, slicelength;
long array field devname, docname;
integer array ia(1:1), chaintablehead(-18:0);
<*beregn <slice-length> og <reference> - felter*>
lastused:=entryarray(2); devname:=-6; docname:=-20;
sliceref:=12; slicelength:=-8;
system(5,92,ia); firstdrumchain:=ia(1);
system(5,96,ia); topchaintable:=ia(1);
lgdchaintable:=(topchaintable-firstdrumchain)//2;
begin integer array nametable(0:abs(lgdchaintable-1));
system(5,firstdrumchain,nametable);
<*beregn <slicelength> og <reference> for hver device i entry0*>
for devname:=devname+12 while (devname<lastused) and (devname<entrylgd-12) do
begin <*soeg deviname i nametable-chaintableheads*>
devino:=-1; devifundet:=false;
for devino:=devino+1 while (devino<lgdchaintable) and (-, devifundet) do
begin <*sammenlign deviname fra entry0 og docname i chaintablehead*>
system(5,nametable(devino)-36,chaintablehead);
if (entryarray.devname(1)=chaintablehead.docname(1))
and (entryarray.devname(2)=chaintablehead.docname(2))
then devifundet:=true;
end;
if devifundet
then entryarray.devname.sliceref:=(chaintablehead.slicelength shift 24)+8*(devino-1)+44
else begin write(out,<:<10>***scatop: devi:>,<<dd>,(devname-6)//12,<: not found in nametable<10>:>);
goto slut;
end;
end;
end;
monitor(42)lookup_entry:(entryzone,0,tail);
tail(1):=catsize;
monitor(44)change_entry:(entryzone,0,tail);
setposition(entryzone,0,0);
for i:= 1 step 1 until catsize do
begin swoprec6(entryzone,512); iaf:=0;
for j:= 1 step 1 until 256 do entryzone.iaf(j):=0;
for j:= 1 step entrylgd//2 until 256 do entryzone.iaf(j):=-1;
end;
close(entryzone,false); open(entryzone,4,<:susercat:>,0);
setposition(entryzone,0,0);
swoprec6(entryzone,entrylgd);
kopier(entryzone,entryarray,entrylgd//2);
end;
begin <* 2:insert*>
if katres<>4 <*navn fandtes ikke i kataloget*>
then begin tal:=entryarray(5);
for i:=5,4,3,2 do entryarray(i):=entryarray(i-1);
entryarray(1):=tal;
<*adder perm resourcer til temp resourcer
for i:= 22 step 1 until entrylgd//2 -1 do
if temp(i) then
entryarray(i):= entryarray(i) + entryarray(i+2);*>
kopier(entryzone,entryarray,entrylgd//2);
end
else fejl(<:<10>***scatop: entry exists already<10>:>);
end;
begin <* 3:delete*>
if katres = 4 <*navn fandtes i kataloget*>
then begin ifl:=2; entryzone.ifl:=-2 end
else fejl(<:<10>***scatop: entry does not exist<10>:>);
end;
begin <* 4:change*>
if katres = 4 <*navn fandtes i kataloget*>
then begin iaf:=2;;
if system(4,2,arr) = 4 shift 12 + 10
then begin i:=5; p:=3 end else begin i:=1; p:=2 end;
for pp:= paramtype(p) while pp<>0 do
begin if pp<>1 then
paramalarm(p,<:<integer> index expected<10>:>);
ind:=entryarray(i);
if (ind<0) or (ind>=entrylgd//2) then
paramalarm(p,<:index ouside entrybounds<10>:>);
if (entry0 and (ind<=3)) or ((-,entry0) and (ind<=5) and (ind<>1)) then
paramalarm(p,<:forbidden field, must not be changed<10>:>);
pp:=paramtype(p+1);
if (pp<1) or (pp>3) then
paramalarm(p+1,<:one more parameter expected<10>:>);
if pp=3
then begin <*indsaet navn fra naeste param i 4 ord*>
entryzone.iaf(ind+0):=entryarray(i+1);
entryzone.iaf(ind+1):=entryarray(i+2);
entryzone.iaf(ind+2):=entryarray(i+3);
entryzone.iaf(ind+3):=entryarray(i+4);
i:=i+5; p:=p+2;
end
else begin <*indsaet heltal fra naeste param i 1 ord*>
entryzone.iaf(ind):=entryarray(i+1);
<*adder perm resourcer til temp resourcer
if temp(ind) then
entryzone.iaf(ind):= entryzone.iaf(ind) + entryzone.iaf(ind+2);*>
i:=i+2; p:=p+2;
end;
end;
end
else fejl(<:<10>***scatop: entry does not exist<10>:>);
end;
begin <* 5:print*>
procedure outch(t);
value t; integer t;
begin if (t<32) or (t=95) or (t>126)
then outchar(out,42)
else outchar(out,t);
end <*outch*>;
if katres = 4 <*navn fandtes i kataloget*>
then begin iaf:=2;
write(out,<:<10><10>entry contents:<10><10>:>);
for i:= 0 step 1 until entrylgd//2-1 do
begin <* if temp(i)
then tal:= entryzone.iaf(i) - entryzone.iaf(i+2)
else *> tal:= entryzone.iaf(i);
write(out,
<<+ddd>,2*i,
<:: wd::>,<<zdddddd>,tal,
<:: hwd::>,<<zddd>,tal shift (-12),<:.:>,tal extract 12,
<:: ch::>);
outch(tal shift (-16));
outch((tal shift (-8)) extract 8);
outch(tal extract 8);
write(out,<::<10>:>);
end;
write(out,<:<10>:>);
end
else fejl(<:<10>***scatop: entry does not exist<10>:>);
end;
begin <* 6:printcat*>
long array field laf; long array navn(1:3);
laf:=4; p:=entrylgd;
close(entryzone,false); open(entryzone,4,<:susercat:>,0);
write(out,<:<10>susercat contains:>);
for k:= 1 step 1 until catsize do
begin inrec6(entryzone,512);
for iaf:= (if k=1 then p else 0) step p until (antindprseg-1)*p do
if entryzone.iaf(1)>=0 then
begin <*entry fuld, skriv procesnavn ud*>
navn(1):=entryzone.iaf.laf(1);
navn(2):=entryzone.iaf.laf(2);
navn(3):=0; i:=1;
write(out,<:<10> :>, string navn(increase(i)));
end;
end;
write(out,<:<10>end list<10>:>);
end;
end <*case aktion*>;
slut: close(entryzone,true);
end
▶EOF◀