DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦9687ea439⟧ TextFile

    Length: 16896 (0x4200)
    Types: TextFile
    Names: »scatop3tx   «

Derivation

└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
    └─⟦75ff9bef3⟧ 
        └─⟦this⟧ »scatop3tx   « 

TextFile

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◀