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

⟦3db6ea06b⟧ TextFile

    Length: 50688 (0xc600)
    Types: TextFile
    Names: »kattekst«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦this⟧ »kattekst« 
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦this⟧ »kattekst« 

TextFile

begin <* program, niveau 1 *>
 integer lbrug_inf_kons; <* den samlet længde målt i ord *>
                         <* af de informationskonstanter *>
                         <* brugeren kan ændre           *>
 integer lbrug_kpost_felt;<* antal felt_typer, som brugeren *>
                          <* kan ændre i en katalogpost     *>
 integer anttilstande;    <* antal tilstande i aktions      *>
                          <*tabellen                        *>
 integer antinputordre;   <* antal inputordre i aktions     *>
                          <* tabellen                       *>

<* index til brug ved opslag, efter felter i kpfl arrayet   *>
integer type_index, titel_index, for_index, bib_index;
integer res_index, ankomst_index, journal_index, stikord_index;
integer beskriv_index, ord_index, søgemængde_index, mængdestr_index;



anttilstande:=17; antinputordre:=42;
lbrug_kpost_felt:=9;
lbrug_inf_kons:=12;

<*initialisering af index til opslag i kpfl_arrayet*>
bib_index:=i:=1;
res_index:=i:=i+1;
ankomst_index:=i+1;
type_index:=i:=i+1;
titel_index:=i:=i+1;
journal_index:=i:=i+1;
beskriv_index:=i:=i+1;
for_index:=i+1;
stikord_index:=i:=i+1;
ord_index:=i:=i+1;
søgemængder_index:=i:=i+1;
mængdestr_index:=i:=i+1;


begin     <*niveau2*>
zone znykatpost(128,1,stderror);
zone zkatpost(128,1,stderror);
zone zinvlist(128,1,stderror);
zone zværdiliste(128,1,stderror);
zone filinf(128,1,stderror);
zone værinf(128,1,stderror);
zone znykatpost(128,1,stderror);
zone znykatpost(128,1,stderror);
<*konstanter til opbevaring af indholdet af *>
<*værdiliste_filens informationsområde*>
integer vfværførst, <*nummeret på første segment der*>
                    <*indeholder en værdiliste_post*>
        vfværantal; <*antal poster i værdilisten*>
long array ordretabel(i:antinputordre);
integer array aktionstabel(0:(anttilstande-1),1:(antinputordre+1));

<*konstanter til predefinition af (f)elt_(l)ængder, i en*>
<*katalogpost*>
integer array k_p_fl(1:lbrug_inf_kons);

<*fil_informations konstanter svarende til brugerens gamle fil*>

  <*reference konstanter*>

integer gfkatstart, <*segmentnummeret på første katalogpost*>
        gfkatstr,   <*kaatalogets størelse i antal poster   *>
        gfinvstart; <*segmentnummeeret på første post i     *>
                    <*inverteret liste delen                *>

<*konstanter brugeren kan ændre*>
<*konstanter i (g)ammel (f)il (f)eltlængder*>
integer array k_gf_fl(1:lbrug_inf_kons);

<*filinformations konstanter svarende til brugerens*>
<*(n)ye (f)il, dvs, efter modyfy                    *>

<*referencer konstanter*>
integer nykatstart,nykatstr, nyinvstart;

<*konstanter brugeren kan ændre*>
<*konstanter (n)y (f)il (f)elt (l)ængder*>
integer array k_if_fl(1:lbrug_inf_kons);

<*(k)katalog (i)nformations_post*>
integer field
<*reference felter*>
      kikatstart,kikatstr,kiinvstart;
integer array field kiarraystart;<*starten på det array der indeholder*>
                                 <*resten af konstanterne              *>

<*katalog_posten*>
boolean field slettet,<*=true dersom posten er slettet ellers false*>
              udvidet,<*=true dersom posten er slettet ellers false*>
              mor;    <*=true dersom posten er en moder ellers false*>
integer field modadr, <*pegerpind til eventuel moder*>
              barnadr,<*pegepind til eventuel post_udvidelse*>
              forantal,<*antal forfattere i brug*>
          stiktegnantal;<*aktuelt antal tegn i stikords_streng*>
long array field kpostarraystart;<*starten på det array der    *>
                       <*indeholder det for brugere synlige del*>
                       <*af posten*>
integer array kpost(1:lbrug_kpost_felt)
  ;<*omdeholder start indexet for de forskellige felter i kpostarraystart*>

<*post i (v)ærdiliste (f)ilen*>
long array lield vford; <*tekst ordets start*>
integer field vfantal,<*antal af referencer i inverteretfilliste*>
              vfref;  <*nummeret på den første post i den inverte_*>
                      <*rede liste*>

<*post i værdi liste informationsdelen*>
integer field viførst, <*segmentnummeret på første post i værdi_listen*>
              viantal; <*antal poster i værdilisten*>

<*post i inverteret liste*>
integer field ilfeltkode,<*feltkode_delen*>
              ifkatref,  <*reference til katalogpost*>
              ilinvref;  <*reference til næste post i listen*>

<*post i nængde_index_array,dvs.indgang til en resultat_søgemængde*>
integer field
        søgførst, <*peger på første element i søgemængden*>
        søgsidst; <peger på sidste element i søgemængden*>


<*variabler til brug ved manipulation af poster, zone erklæringer og*>
<*arrayerklæringer*>

integer lfilinf, <*længden af katalog filinformationsområdet i *>
                 <*enheder i værdifilen*>
        lværinf; <*længden af informations området i værdifilen*>


<*vdr, katalogpost*>
boolean gf_ktp_seg;<*=true dersom en katalogpost i gammel brugerfil*>
                   <*kan være inden for (netop) eet segment*>
        gf_ktp_antal,<*vdr gammel brugerfil, antal katalogposter i*>
                     <*segment eller antal segmenter på katalogpost*>
        gf_ktp_længde;<*vdr gammel brugerfil, længde af en katalogpost*>
                      <*i antal dobbeltord*>
 <*vdr værdiliste_post*>

boolean vf_vær_seg;<*=true dersom en værdilistepost kan være indefor et*>
                   <*netop et segment*>
integer vf_vær_længde,<*vdr.værdiliste_fil, længde af en post i antal*>
                   <*dobbeltord*>
        vf_vær_antal; <*vdr værdilistefil,antal poster i et segment eller*>
                   <*antal segmenter pr. post*>


 <*vdr. inverteret liste*>
boolean gf_inv_seg; <*vdr gammel brugerfil*>
                    <*=true dersom en inverteret_liste post kan være indenfor*>
                    <*et segment*>
integer gf_inv_længde,<*vdr gammel brugerfil, størelse i antal dobbeltord*>
                     <*af en post i inverteret liste*>
        gf_inv_antal;<*vdr gammel brugerfil;antal inverteret_liste_poster*>
                     <*i et segment eller antal segmenter pr. post*>
<*andre variabler*>

integer aktion, <*resultatet ved opslag i aktionstabellen*>
       tilstand,<*første index ved opslag i aktions tabellen*>
    nordrekode, <*kode for nyordre*>
    gordrekode, <*kode for forrige ordre*>
          ful,  <*angiver om et array er fyldt op efter kald af*>
                <*readstring*>
            i,  <*tællervariabel*>
      katpostnr,<*nummeret på den katalogpost, der for øjeblikket er*>
                <*under ændring, skal bruges når en hovedordre skal*>
                <*afsluttes*>
   ledigkatpost,<*nummeret på næste ledige katalogpost i brugerfilen*>
    mængdenr,   <*nummeret på en søgeresultatmængde*>
   elementantal,<*antal af elementer i en resultatsøgemængde*>
mængdeindexnæste,<*næste ledige index i mængdeindex arrayet*>
søgemængdenæste,<*næste ledige index i søgemængdearrayet*>
  fra, til,     <*hjælpevariable angiver index fra og til i*>
                <*søgemængder*>
lighedstegn,    <*delimitor, som bruges i underordre, er initielt *>
                <*ligtegnet '='*>
dollertegn;     <*reservationstegn, for tekststreng*>
real array brugerfil(1:5); <*navn på brugerfil*>
real array værdifil(1:5);<*navn på værdilistefil*>
long array ordretekst(1:1);<*indholder de første bogstaver af*>
                           <*en ordre*>

boolean
      initja, <*=true dersom init_proceduren skal kaldes ellers false*>
     aflutja, <*=false dersom der er opstået fejl i hovedordre       *>
              <*der bevirker at denne ikke kan afsluttes*>
     opdatja, <*false dersom der kun er foretaget søgning i kataloget*>
     fortsæt; <*=false bevirker at programmet starter*>


integer field shovord, <*angiver sidste hovedordre*>
              fhovord, <*angiver første hovedordre*>
           snfeltord,  <*sidste normale feltunderordre*>
            sfeltord,  <*sidste postfeltunderordre*>
            ffeltord,  <*første postfeltunderordre*>
            fsøgord,   <*første søgeunderkordre*>
            ssøgord,   <*sidste søge_underordre*>
            fkomord,   <*første kombineret søgeunderordre*>
            skomord,   <*sidste kombineret søgeunderordre*>
          fmodifyord,  <*førstemmodify underordre*>
          smodifyord,  <*sidste modify underordre*>
              forord,  <*koden på underordre outhor*>
            stikord,   <*koden på underordren keyword*>

<************************************************************>
<***         procedure dobbeltordlængde                   ***>
<*************************************************************>

procedure dobeltordlængde(resultat,i);
integer resultat,i;

<*resultat sættes lig i delt med 4 og derefter*>
<*hvor nødvendigt rundet op*>
begin
integer j; <*hjælpevariabel*>
j:=i;
j:=i//4
if i mod 4 >0 then
begin
  j:=j+1;
end;
resultat:=1;
end;

<************************************************************>
<***   procedure post_skriv_læs_konstanter                ***>
<************************************************************>
procedure post_skriv_læs_konstanter(længde,antal,iseg);

value længde;
integer længde, antal;
boolean iseg;

<*sætter iseg lig true dersom længde > størrelse af et segment*>
<*ellers false*>
<*forseg=true:angiver antal hvor mange gange (helt antal)længde*>
<*går op i størelsenn af eet segment*>
<*forseg=false:angiveraantalhhvormmange((heltaantal)segmenter*>
<*der går på een længde. Længde er målt i antal dobbeltord*>

begin
if længde>= 128 then 
 begin
  iseg:=false;
antal:=længde//128;
if (længde mod 128) > 0 then
 begin
 antal:=antal+1;
 end;
end 
else
begin
  iseg:=true;
  antal:=128//længde
end;
end;

<***********************************************************>
<***           procedure pak                             ***>
<***********************************************************>

long procedure pak(val1,val2,val3,val4,val5,val6);
value val1,val2,val3,val4,val5,val6;
integer val1,val2,val3,val4,val5,val6;

<*pakker tegnene i de 6 parametre i et long*>
<*således at val1 ligger i de første 8 bit *>

begin
long dummy;
dummy:=0;
pak:=dummy shift 8 add val1 shift 8 add val2
     shift 8 add val3 shift 8 add val4 shift 8
     add val5 shift 8 add val6;
end;

<**************************************************************>
<***           procedure pakud                              ***>
<**************************************************************>

procedure pakud(fra,val1,val2,val3,val4,val5,val6);
value fra;
long fra;
integer val1,val2,val3,val4,val5,val6;
<*pakker tegn ud fra variabler fra, således val val1*>
<*indeholder tegnet i de første 8 bit val2 tegnet i de næste 8 bit*>

begin
val1:=fra shift(-40) extract 8;
val2:=fra shift(-32) extract 8;
val3:=fra shift(-24) extract 8;
val4:=fra shift(-16) extract 8;
val5:=fra shift(-8) extract 8;
val6:=fra shift 8;
end;

<*************************************************************>
<***            procedure skip_linie_rest                  ***>
<*************************************************************>
procedure skip_linie_rest;
<*skiper resten af en linie på in zonen*>
begin
integer ch;
read(in,ch);
while ch <> 'nl' do
  begin
  readchar(in,ch);
  end;
end;

<**************************************************************>
<***             procedure skipblanke                       ***>
<**************************************************************>

procedure skipblanke;
begin
integer ch;
readchar(in,ch);
while ch='sp' do
begin
  readchar(in,ch);
end;
repeatchar(in);
end;
<***************************************************************>
<***           procedure skipordrerest                        ***>
procedure skipordrerest;

<***************************************************************>
<***          procedure ordreidentifikation                  ***>
<***************************************************************>

integer procedure ordreidentifikation(ordretekst, antinputordre);
value ordretekst,antinputordre;
long array ordretekst;
begin
 integer nr,i;
 nr:=antinputordre+1;
 for i:=1 step 1 until antinputordre do
 begin
  if  ordretekst(1):=ordretabel(i) then nr:=i;
 end;
ordreidentifikation:=nr
end;

<****************************************************************>
<***             procedure indsæt_for                         ***>
<****************************************************************>

procedure indsæt_for(buffer, for, fnr);
value for, fnr;
long array buffer, for;
integer fnr;

<*indsætter forfatter værdien for som forfatter nr=fnr *>
<*i bufferen buffer, sætter forfatterantallet op med 1*>
begin
integer start, slut,i;
start:=kpost(for_index)+(fnr-1)*k_gf_fl(for_index);
slut:=start+k_gf_fl(for_index)-1;
buffer.forantal:=buffer.forantal+1;
for i:=start step 1 until slut do
 begin
 buffer.kpostarraystart(i):=for(i-start+1);
 end;
end;
<*************************************************************>
<***           procedure indsæt_stiktegn                   ***>
<*************************************************************>

procedure indsæt_stiktegn(post,nr,val1);
value nr,val;
long array post; <*post hvori et tegn i stikordsfeltet skal*>
                 <*indsættes*>
integer nr, <*nummeret på det tegn der skal indsættes*>
      val1; <*det tegn der skal indsættes*>

<*proceduren indsætter et tegn i stikordsfeltet for posten post.*>
<*Tegnene i feltet er nummereret fra 1 og opefter. Tegnet val,  *>
<*som skal indsættes, bliver indsat som tegn nummer llg nr. Post*>
<*feltet som angiver antallet af tegn i stikordsfeltet som er i *>
<*brug forbliver uforandret*>

begin
long højre, <*tegnene til højre for det teng der skal  indsættes i*>
            <*resten af longet er fuldt op med nuller 0*>
    venstre,<*tegnerne til venstre*>
      midt, <*tegnet der skal indsættes placeret i position nr.  *>
            <*ellers fyldt op med nuller*>
      val2; <*hjælpe buffer*>
integer felt_index, <*indexet for det array_element hvori tegnet  *>
                    <*skal indsættes*>
            relnr;  <*relativt tegn nummer i arraylement*>
felt_index:=kpost(stikord_index)+nr//6;
relnr:=nr mod 6 +1;
val2:=post.kpostarraystart(felt_index);
if relnr = 6 then
begin
  højre:=val2 shift 48;
end;
else
begin
  højre:=val2 shift (8*relnr) shift(-8*relnr);
end;
if relnr =1 then
begin
  venstre:=val2 shift 48;
end;
else
begin
  venstre:=val2 shift(-8*(7-relnr)) shift (8*(7-relnr));
end;
midt:=0;
midt:=midt shift 48 add val1 shift(6-relnr);
prsk.kpostarraystart(felt_index):=venstre+midt+højre;
end; <*indsæt_stiktegn*>


<*************************************************************>
<***       procedure indsæt_stikord                        ***>
<*************************************************************>

boolean procedure indsæt_stikord(post,itegnbuf,fra,til);
value itegnbuf;
long array post; <*indeholder katalogposter*>
integer array;<*indeholder det stikord der skal indsættes,*>
              <*arrayet går fra 1:længden af et ord. Hvert*>
              <*arrayelement indeholder et tegn af ordet  *>
integer fra,til,<*hvis der ikke er plads til stikordet, vil*>
               <*fra og til angive de inclusive grænser for*>
               <*den medtagne del af stikordet             *>

<*indsætter stikordet i tegnbuf i stikordsfeltet for poster POST*>
<*funktionsværdien er false dersom der ikke er plads til stikordet*>
<*fra og til angiver da hvilken del af ordet der er medtaget*>
boolean procedure indsæt_stikord(post,itegnbuf,fra,til);
begin <*indsæt_stikord*>
boolean fejl;
integer i,f,t,feltlængde,blank;
feltlængde:=k_gf_fl(ord_index)*6;

i:=1;
fejl:=false;
<*skip blanke*>
while itegnbuf(i)='sp' and i < feltlængde do
begin
 i:=i+1;
end;
f:=i;
if f:=feltlængde then begin fejl:=true end;
<*indsæt begyndelses blanktegn*>
if not fejl and post.stiktegnantal < 6*k_gf_fl(stikord_index) then
begin
blank:='sp';
post.stiktegnantal:=post.stiktegnantal+1;
indsæt_stiktegn(post,post.stiktegnantal,blank);
end;

<*indsæt tegn i post_feltet*>
while itegnbuf(i)<>'sp' and i<=feltlængde and not fejl do
 begin
  if post.stiktegnantal >=6*k_gf_fl(stikord_index)
  then begin
  fejl:=true end;
  else
  begin
  post.stiktegnantal:=post.stiktegnantal+1;
  indsæt_stiktegn(post,post.stiktegnantal,itegnbuf(i));
  end;
i:=i+1;
end; <*while*>
t:=i;
fra:=f;
til:=t;
indsæt_stikord:=not fejl;
end; <*indsæt_stikord*>


<**************************************************************>
<***            procedure læs_stiktegn                      ***>
<**************************************************************>


procedure læs_stiktegn(nr,val,post);
value nr;
integer val, <*retur_værdi,det indlæste tegn*>
         nr; <*nummeret på tegnet i følgen af stikord,*>
             <*tegnene tænkes nummereret fra 1 og op efter*>
long array post;<*posten kvorfra stikords_tegnet skal læses*>

<*indlæser et tegn fra stikordsfeltet i posten post*>
<*hvilket tegn i følgen der ønskes angives ved nummeret NR*>
<*Det er op til omgivelserne at kontrollere at feltgrænserne ikke*>
<*overskrides*>

begin
integer elementnr;   <*index nummeret på det array element i*>
                     <*posten som indeholder tegn nummer nr*>
long element; <*buffer variabel*>

elementnr:=kpost(stikord_index)+(nr-1)//6;
element:=post.kpostarraystart(elementnr);
val:=element shift(-1*(6-nr mod 6 + 1)) extract 8;
end; <*læs_stiktegn*>
<*************************************************************>
<***           procedure søg-stikord                       ***>
<*************************************************************>

boolean procedure søg_stikor(post,itegnbuf,fra,til);
value post,itegnbuf;
long array post; <*posten hvori stikordet itegnbuf eftersøges*>
integer array itegnbuf;<*det stikord der skal søges efter,   *>
                  <*hvert array_element indeholder et tegn   *>
integer fra,til;  <*angiver det fremfundne stikords position *>
                  <*i tegnnumre,indenfor stikordstegn_strengen*>

<*eftersøger stikordet itegnbuf i stikordsfeltet for posten post*>
<*Funktions værdien er lig true, dersom stikordet fremfindes i  *>
<*såfald vil til og fra angive ordets position i stikords_strengen*>

begin
integer sordstart, <*(start)indexet for (s)øge(ord)et i itegnbuf*>
        sord_slut, <:(slut)indexet for (s)øge(ord)et i itegnbuf *>
             tegn,
            j,k,i;

boolean fundet; <*angiver om ordet er fundet*>
integer array itegnbuf4(1:k_gf_fl(ord_index)*6);

<*find start kog slut indexet for ordet der skal søges efter*>
<*og som er i itegnbuf*>

<*skipblanke*>
i:=1;
while itegnbuf(i)='sp' do
begin
 i:=i+1;
end;
sord_start:=i-1;
while itegnbuf(i)<>'sp' and i < 6*k_gf_fl(ord_index) do
begin
 i:=i+1;
end;
if itegnbuf(i)='sp' then
 begin
  i:=i-1;
 end;
sord_slut:=i;
<*søg efter ordet*>
fundet:=false;
i:=1;
while i <= post.stiktegnantal and not fundet do
begin
læs_stiktegn(i,tegn,post);
if tegn='sp' then
 begin
  i:=i+1;
 end;
 else
 begin
<*indlæs det første stikord*>
k:=1;
fra:=i;
itegnbuf4(k):=tegn;
while tegn <>'sp' and i < post.stiktegnantal do
 begin
  i:=i+1;
  k:=k+1;
  læs_stiktegn(i,tegn,post);
  if tegn <>'sp' then
   begin
    itegnbuf4(k):=tegn
   end;
 end; <*while*>
 til:=i;
if tegn='sp' then
begin
 k:=k-1;
 til:=i-1
end;
<*er længderne ens*>
if k=(sord_slut-sord_start+ 1) then
begin
 <*er værdierne ens*>
 for j:=1 step 1 until k do
  begin
   if itegnbuf(j):=itegnbuf(sord_start)+j-1)
   then begin
   fundet:=true;
   end;
 end; <*for*>
end;<*if k*>
end; <*else tegn = 'sp'*>
end;<*while*>
søg_stikord:=fundet;
end; <*søg_stikord*>





<*************************************************************>
<***              procedure init                           ***>
<*************************************************************>

procedure init;
begin
 integer i,j,k,n;
 
 <*indlæs filinformationen*>

 open(filinf,4,brugerfil,0);
 setposition(filinf,0,0);
 inrec6(filinf,lfilinf*4);
 nykatstart:=gfkatstart:=filinf.kikatstart;
 nykatstr:=gfkatstr:=filinf.kikatstr;
 nyinvstart:=gfinvstart:=filinf.kiinvstart;

 for i:=1 step 1 until lbrug_inf_kons do
 begin
 k_ny_fl(i):=k_gf_fl(i):=filinf.kiarraystart(i);
 end;
 close(filinf,true);
 ledigkatpost:=gfkatstr + 1;

<*initialisering af katalogpost*>
 slettet:=i:=1;
 udvidet:=i:=i+1;
 mor:=i:=i+1;
      i:=i+1; <*ubrugt*>
moradr:=i:=i+2;
barnadr:=i:=i+2;
forantal:=i:=i+2;
stiktegnantal:=i:=i+2;

k:=kpostarraystart:=i;
j:=1;
 for i:=1 step 1 until lbrug_kpost_felt do
 begin
 n:=1;
if i:=for_index then begin n:=3; end;
j:=j+n*k_gf_fl(i);
k:=k+n*k_gf_fl(i);
kpost(i):=j_n*k_gf_fil(i);
end;
dobbeltordlængde(gf_ktp_længde,k);

<*udregning af konstanter til brug ved læsning og skrivning*>
<*katalogposter*>

post_skriv_læs_konstanter(gf_ktp_længde,gf_ktp_antal,gfktp_seg);

<*initialiserer værdilisten*>
open(værinf,4,værdifil,0);
setpostition(værinf,0,0);
inrec6(værinf.lværinf*4);
vfværførst:=værinf.viførst;
vfværantal:=værinf.viantal;
close(værinf,true);

<*initialisering af poster i værdifilen*>
vford:=i:=0;
       i:=i+4*gford;
vfantal:=i:=i+2;
vref:=i:=i+2;
dobbeltordlængde(vf_vær_længde,i);
post_skriv_læs_konstanter(vf_vær_længde,vf_vær_antal,vf_vær_seg);
end;

<*************************************************************>
<***     procedure skriv_ny_ga_katpost                     ***>
<*************************************************************>

procedure skriv_ny_ka_katpost(nr,buffer);
integer nr;

long array buffer;
<*skriver en katalog_post på brugerfilen eller den*>
<*temporere nye brugerfil*>
<*proceduren bruges ved udskrivning af ny moderposter*>
<*og postudvidelser*>

begin
if nr < gfkatstr then
 begin
<*posten skal lægges i brugerfilen*>
skriv_katalogpost(nr,gfkatstart,buffer);
 end 
 else
 begin
<*posten ligger i ny brugerfil*>
skriv_nykatalogpost(nr_gfkatstr,0,buffer);
end;
end;
 
<************************************************************>
<***     procedure læs_ny_ga_katpost                      ***>
<************************************************************>

integer nr;
long array buffer;

<*indlæser en katalogpost enten fra brugerfilen eller*>
<*fra den temporerer nye brugerfil. Proceduren bruges ved*>
<*indlæsning af ny indsatte poster samt postudvidelse*>

begin
if nr<gfkatstr then
begin
<*posten ligger i brugerfilen*>

  indlæs_katalogpost(nr,gfkatstart,buffer);
end 
else
begin
<*posten ligger i nybrugerfil*>
  indlæs_nykatalogpost(nr,gfkatstr,0,buffer);
end;
end;

<**************************************************************>
<***       procedure indsæt_i_array                         ***>
<**************************************************************>

value reslængde, værdiarray,værlængde;
long array resultat;<*længde=værdilængde/6*>
integer array værdiarray;
integer værlængde;

<*tegnet i hvert enkelt værdiarray_element pakkes*>
<*og gemmes i resultat(arrayet*>

begin
integer i,j;
j:=1;
j:=1;
while i < værlængde do 
 begin
resultat(j):=pak(værdiarray(i),
                 værdiarray(i+1),
                 værdiarray(i+2),
                 værdiarray(i+3),
                 værdiarray(i+4),
                 værdiarray(i+5));
j:=j+1;
i:=i+6;
end;<*while*>
end;

<************************************************************>
<***             procedure læsheltal                      ***>
<************************************************************>

boolean procedure læsheltal(val);
integer val;
begin
skipblanke;
if readchar(in,val) < 0 then
 begin
læsheltal:=false;
 end;
 else
 begin
 læsheltal:=true;
 end;
end;

<*************************************************************>
<***        procedure udvid_katpost                        ***>
<*************************************************************>
procedure udvid_katpost(madres,for,postnr);
value postnr,for,madres;
long array for;
integer madres,postnr;
<*initialiserer en udvidet barnepost.Indsætter værdier*>
<*for som første forfatter.Postens nummer er angivet i postnr*>

begin
long array katpost(1:gf_ktp_længde);
integeri;
<*nulstil posten*>
for i:=1 step 1 until gf_ktp_længde do
begin
 katpost(i):=long<:    :> add 'sp';
end;
 katpost.udvidet:=false;
 katpost.mor:=false;
katpost.moradr:=madres;
katpost.forantal:=0;
 indsæt_for(katpost,for,1);
 skriv_ny_ga_katpost(postnr,katpost);
end;

<**************************************************************>
<***            procedure søg_for                           ***>
<**************************************************************>

boolean procedure søg_for(mpost,fpost,for,pnr,fnr,morja);
value mpost,for;
boolean morja;<*=true dersom posten med forfatter for er en mor*>
long array mpost,<*moderposten*>
           fpost,<*den post der indeholder forfatteren*>
             for;<*den forfatter der søges efter*>
integer pnr,<*nummeret på den post der indeholder forfatteren for*>
        fnr;<*nummeret på forfatteren idenfor den pågældende post*>

<*funktionen er falsk når forfatteren ikke kan findes*>

begin
boolean fundet, <*=true, dersom forfatteren er fundet*>
integer fonr,   <*svarer til fnr*>
        ponr;   <*svarer til pnr*>

boolean procedure søg_for_i_post(post,for,fnr);
long array post,<*posten hvori søgningen foregår*>
           for, <*angiver den forfatter der søges efter*>
integer fne;<*nummeret på forfatteren i den pågældende post*>

<*funktionen=false dersom forfatteren for ikke findes*>

begin
boolean fundet; <*=true dersom forfatteren for findes i den angivne*>
                <*post, ellers = false*>
integer jaantal,<*angiver hvor mange af arrayelementerne i et*>
                <*forfatterfelt der stemmer overens*>
          start,<*angiver start indexet for et af de tre forfatter_felter*>
           slut,<*angiver slut indexet for en af de tre forfatter*>
           j,k; <*lykke tællere*>

fundet:=false;
i:=0;
while not fundet and i < post.forantal do
begin
 i:=i+1;
 start:=kpost(for_index)+(i_1)*k-gf_fl(for_index);
 slut:=start+k_gf_fl(for_index)-1;
 jaantal:=0;
 for k:=start step 1 until slut do
 begin
  if for(k_start+1)=post.kpostarraystart(k) then
    begin
    jaantal:=jaantal+1;
    end;
 end;
 if jaantal=k-gf_fl(for_index) then
 begin
  fundet:=true;
 end;
end;<*while*>
fnr:=i;
søg_for_i_post:=fundet;
end; <*søg_for_i_post*>
morja:=false;
fundet:=false;
<*er forfatteren i mpost*>
if søg_for_i_post(mpost, for, fonr) then
begin
 fundet:=true;
 morja:=false;
 fnr:=fonr;
end;
else
begin
if not mpost.udvidet then
begin
  fundet:=false;
end 
else
begin
ponr:=mpost.barnadr
repeat
 læs_ny_ga_kpost(ponr,fpost);
 if søg_for_i_post(fpost,for,fonr) then
 begin
 fundet:=true;
 morja:=false;
 fnr:=fonr;
 end;
 ponr:=fpost.barnadr;
until fundet or not fpost.udvidet;
end;
end;<*else søg_for_i_post*>
søg_for:=fundet;
end; <*søg_for*>
 
<**************************************************************>
<***          procedure indsæt_for_i_katpost                ***>
<**************************************************************>
procedure indsæt_for_i_katpost(morpost,madresse,for);  
value for madresse;
long array morpost,
               for;<*den forfatter der skal indsættes*>
integer madresse;<*postnummeret på moderen*>

begin
long array makatpost(1:gf_ktp_længde);
<*bruges til opbevaring af eventuelle postudvidelser*>
integer katalogpostnr;

if morpost.udvidet then
begin
<*fremfind det sidste ikke udvidet barn*>
katalogpostnr:=morpost.barnadr;
læs_ny_ga_katpost(morpost.barnadr,makatpost);
while makatpost.udvidet do
begin
  katalogpostnr:=makatpost.barnadr;
  læs_ny_ga_katpost(katalogpostnr,makatpost);
end;<*while*>

if makatpost.forantal>=3 then
begin
<*sidste barn opdaterer*>
makatpost.mor:=false;
makatpost.udvidet:=true;
makatpost.barnadr:=ledigkatpost;
<*udskriv sidste barn*>

skriv_ny_ga_katpost(katalogpostnr,makatpost);

<*opret en udvidet post og indskriv forfatteren som den*>
<*første forfatter*>

udvid_katpost(katalogpostnr,for,ledigkatpost);
ledigkatpost:=ledigkatpost+1;
end; <*if*>
else
begin
  indsæt_for(makatpost,for,(makatpost.forantal+1));
  skriv_ny_ga_katpost(katalogpostnr,makatpost);

end; <*else*>
end <*if*>
else
begin
  if mopost.forantal >=3 then
   begin
   <*opdaterer moderen*>
   morpost.udvidet:=true;
   morpost.barnadr:=ledigkatpost;

<*opret postudvidelse og indsæt forfatter*>
udvid_katpost(madresse,for,ledigkatpost);  
ledigkatpost:=ledigkatpost+1;
end 
else
  begin
   indsæt_for(morpost,for,(morpost.forantal+1));
  end; <*else*>
end; <*else*>
end;<*indsæt_for_i_katpost*>
<***********************************************************>
<***        procedure ud_sidste_for                      ***>
<***********************************************************>

procedure ud_sidste_for(badresse,for,fnr,mor_ej_udvidet);
value badresse;
boolean mor_ej_udvidet;<*=true dersom moderen ikke længere*>
                       <*har nogle børn,dvs. post udvidelser*>
long array for;
integer fnr, <*nummeret på forfattere indenfor en post*>
     badresse;<*starten på koden af post udvidelser*>
<*proceduren fjerner den sidste forfatter i kæden af udvidet*>
<*poster og gemmer forfatteren i for. Listen af post udvidelser*>
<*opdateres, er der ikke længere nogle postudvidelser sætter*>
<*mor_udvidet = true*>

begin
integer mnr,nr,gnr,start,slut,i;
 long array makatpost(1:gf_ktp_længde);
mor_ej_udvidet:=false;
nr:=badresse;
repeat
  gnr:=nr;
  læs_ny_ga_katpost(nr,makatpost);
  nr:=makatpost.barnadr;
until not makatpost.udvidet;
start:=kpost(for_index)+(makatpost.forantal-1)* k_gf_fl(for_index);
slut:=start+k_gf_fl(for_index)-1;

<*overfør sidste forfatter*>
for i:=start step 1 until slut do
begin
 for(i_start+1):=makatpost.kpostarraystart(i);
end;
fnr:=makatpost.forantal;                 
makatpost.forantal:=makatpost.forantal-1;

<*var den overførte forfatter den sidste i posten*>
if makatpost.forantal  <=0 then
begin
  makatpost.slettet:=true;
  mnr:=makatpost.moradr;
skriv_ny_ga_katpost(gnr,makatpost);
læs_ny_ga_katpost(mnr,makatpost);
if makatpost.mor then
begin
  mor_ej_udvidet:=true;
end 
else
begin
makatpost.udvidet:=false;
end;        
end; <*if*>
end;<ud_sidste_for*>

<**************************************************************>
<***         procedure for_iorden                           ***>
<**************************************************************>
procedure for_iorden(post,ledig);
value ledig;
long array post;<*katalog post hvor forfatterne skal*>
                <*sættes i orden*>
integer ledig;  <*nummeret,indenfor posten. på den forfatter*>
                <*hvis felt er ledigt*>

<*Ordner følger af forfattere indenfor en post, således at der *>
<*ikke er en ledig plads mellem to forfattere, forfattere i brug*>
<*kommer lige efter hinanden, samt sætter antallet af forfatter*>
<*med 1*>

begin
 integer rykantal, <*antal forfattere der skal rykkes frem*>
             i,j;  <*lykke tæller*>

if ledig < post.forantal then 
  begin
   <*saml de forfattere der er i brug*>
    rykantal:=post.forantal-ledig;
    for i:=1 step 1 until rykantal do
    begin
      <*ryk forfattere i brug over i det ledig felt*>
      start:=kpostL(for_index)+(ledig-1)*k_gf_fl(for_index);
      slut:=start+k_gf_fl(for_index)-1;
      for j:=start step 1 until slut do
        begin
         post.kpostarraystart(j):=post.kpostarraystart(j+k_gf_fl(for_index));
        end;
      ledig:=ledig+1;
    end;<*for*>
  end; <*if*>
  <*nedtæl forfatter tæller*>
  post.forantal:=post.forantal-1;
end; <*for_iorden*>


<**************************************************************>
<***          procedure skriv_post_attribut                 ***>
<**************************************************************>

procedure skriv_post_attribut;
<*udskriver tegn forkortelsen,samt dertil hørende forklaring *>
<*for samtlige synlige for brugeren felter i en katalogpost. *>

begin
write(out,
     <:<10>:>,<:librar  (reservation place):>,
     <:<10>:>,<:reserv  (reservation date):>,
     <:<10>:>,<:arriva  (arrival date):>,
     <:<10>:>,<:type (journal type;njournal or something else:>,
     <:<10>:>,<:title (joournals title):>,
     <:<10>:>,<:author (first author):>,
     <:<10>:>,<:author (second author):>,
     <:<10>:>,<:author <third author):>,
     <:<10>:>,<:journa (journal:name,publications year,sidenr, bindingsnr:>,
     <:<10>:>,<:keywor (keywords field):>,
     <:<10>:>,<:descri (descriptor field):>);
     outendcur(10);
end;<*skriv_post_attribut*>


<*************************************************************>
<***          procedure skriv_kat_inf                      ***>
<*************************************************************>

<*udskriver katalog_informationskonstanter*>

begin
write(out,
     <:<10>:>,<:ltype(the max.length of the typefield) = :>,
              k_p_fl(type_index),
     <:<10>:>,<:ltitle(the max.length of the titlefield) = :>,
              k_p_fl(title_index),
      <:<10>:>,<:lauthor(the max. length of the authorfield) = :>,
              k_p_fl(for_index),
      <:<10>:>,<:llibrary(the max.length of the librarryfield = :>,
              k_p_fl(bib_index),
      <:<10>:>,<:lreservation(the max.length og the field for 
              reservation date = :>, k_p_fl(res_index),
      <:<10>:>,<:larrival(the max.length og the journal field = :>,
              k_p_fl(ankomst_index),
      <:<10>:>,<:ljournal(the max.length og the journal field = :>,
              k_pp_fl(journal_index),
      <:<10>:>,<:lkeyword(the max.length of the keywordd field = :>,
              k_p_fl(stikord_index),
      <:<10>:>,<:ldescription(the max.length of the description field = :>,
              k_p_fl(beskriv_index));
      outendcur(10);
end;<*skriv_kat_inf*>


<***************************************************************>
<***               procedure skrivfejl                       ***>
<***************************************************************>

procedure skrivfejl(nr);
integer nr;
case nr of
begin
  begin
  write(out,<:<10>:>,<:error:newca-order can only appear as first 
        order after entering the program:>);
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:warning: a main korder must be terminated
        with "return":>;
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:error: wrong set number, containing searchresult:>;
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:error: you can only change once at the time in
       the katalog_post. Main order .change not accepted.:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:error error in the parameters of the main 
        order.Main order not accepted.:>);
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,warning: the specific area doas not exist:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:type_error; catalog constant ekspected.
       The line is ignored.:>);
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:type error; positive integers ekspected.
       Sub_order ignored:>);
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:equality sign ekspected:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:error: length of the field is expected.
       Sub_order ignored:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:error:sub_order not aloud.
       Sub_order ignored:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:equality sign is missing after sub_order:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:length og the field is expected;
       maybe there are to many spases.:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:equality sign must not be used as value:>);
  outendcur(10);
  end;
  begin
write(out,<:<10>:>,<:main order is expected.The reason for this
     is the arised error:>);
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:error:you can only start with the main order:>);
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:error: file parameters to the program is missing.
       The program is terminated:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:error:file parameters are writed in the wrong
       order.The program is terminated.:>);
  outendcur(10);
  end;
  begin
  write(out,<:<10>:>,<:error:post doas not exist; write new main order:>);
  outendcur(10)
  end;
  begin
  write(out,<:<10>:>,<:error:error in the value;The value is ignored:>);
  outendcur(10)
  end;
end;
              

<*initialisering af feltlængder for en katalogpost*>

k_p_fl(bib_index):=4;
k_p_fl(res_index):=2;
k_p_fl(ankomst_index):=2;
k_p_fl(type_index):=3;
k_p_fl(titel_index):=11;
k_p_fl(journal_index):=7;
k_p_fl(beskriv_index):=33;
k_p_fl(for_index):=4;
k_p_fl(stikord_index):=18;
k_p_fl(ord_index):=3;
k_p_fl(søgemængder_index):=30;
k_p_fl(mængdestr_index):=300;

<*initialisering af kataloginformations_post*>

kikatstart:=i:=2;
kikatstr:=i:=i+2;
kiinvstart:=i:=i+2;
kiarraystart:=i;   
              i:=i+2*lbrug_ing_kons;
dobbeltordlængde(lfilinf,i);
         
<*initialisering af værdi_listeinformations post*>
viførst:=i:=2;
viantal:=i:=i+2;
dobbeltordlængde(lværing,i);

<*initialisering af inverteret_liste_post*>
ilfeltkode:=i:=2;
ilkatref:=i:=i+2;
ilinvref:=i:=i+2;
dobbeltordlængde(gf-inv-længde,i);

<*initialisering af post i mængde_index_array*>
søgførst:=i:=2;
søgsidst:=i:=i+2;

<*initialisering af delimitorer*>
lighedstegn:='=';
dollertegn:='?';

<*opdelings konstanter for aktions tabellen*>
fhovord:=1;
shovord:=16;
forord:=24;
stikord:=25;
ffeltord:=17;
snfeltord:=23;
sfeltord:=25;
fsøgord:=20;
ssøgord:=26;
fkomord:=28;
skomord:=30;
fmodifykord:=31;
smodifyord:=42;

<*initialisering af kordretabel*>
<*initialisering af aktionstabel*>
<*tildeling af værdier til variable der kan risikere at blive*>
<*brugt uden forinden at have tildelt værdier værdiernes     *>
<*størelse er ligegyldig*>

gf_ktp_længde:=128;
k_gf_fl(søgemængder_index):=k_p_fl(søgemængder_index);
k_gf_fl(mængdestr_index):=k_p_fl(mængdestr_index);



<*nulstil(nul) brugerfil- og værdifilarrays*>

for i:=1 step 1 until 5 do begin
  brugerfil(i):=0;
  værdifil(i):=0;
end;

<*initialisering af filparametre*>
if not(readinfp(brugerfil,1) and readinfp(værdifil,2)) then
begin
 fortsæt:=false;
 skrivfejl(17);
end;

<*initialisering*>
tilstand:=0;
søgemængdenæste:=1;
mængdeindex:=1;
afslutja:=true;
fortsæt:=true;
opdatja:=false;
gordrekode:=0; <*der findes ingen ordre der har koden nul*>
initja:=true;

while fortsæt do
begin
skipblanke;
ful:=readstring(in,ordretekst,1);
 if ful >= 0 then
 begin
   repeatshar(in)
 end;
nordrekode:=ordreidentifikation(ordretekst,antinputkode);
if fhovord <= nordrekode <=shovord then
 begin
 if afslutja and nordrekode <> gordrekode then
 begin
 afslut(gordrekode)
 end;
 gordrekode:=nordrekode;
 afslutja:=true;
end<*if*>
if fhovord < nordrekode <=shovord and initja then
 begin
 init;
 initja:=false
 end;
aktion:=aktionstabel(tilstand, nordrekode);
begin <*niveau 4*>
long array mængdeindex(1:k_gf_fl(søgemængder_index);
long array akatpost(1:gf_ktp_længde);
long array ainvlist(1:gf_inv_længde);
integer array søgmængde(1:k_gf_fl(søgemængder_index)*
                       k_gf_fl(mængdestr_index));
fejlfri:=true;
case aktion of
begin
<* 1 *>
begin
 tilstand:=1;
 if not tom_param then
 begin
  skrivfejl(2)
 end;
<*initialiserer brugerfilen katalog informationsområde*>
open(filinf,4,brugerfil,0);
filinf.kikatstart:=1;
filinf.kikatstr:=0;
filinf.kiinvstart:=1;
for i:=1 step 1 until lbrug_inf_kons do
 begin
  filinf.kiarraystart(i):=k_p_fl(i)
 end;
setpostion(filinf,0,0);
outrec6(filinf,lfilinf*4);
setposition(filinf,0,0);
close(filinf,true);

<*opret tom værdiliste*>
open(værinf,4,værdifil,0);
værinf.viførst:=1;
værinf.viantal:=0;
setposition(værinf,0,0);
outrec6(værinf,lværinf*4);
setposition(værinf,0,0);
close(værinf,true);
init;
skriv_kat_inf;
end;<*case 1 *>


<* 2 *>
begin
 tilstand:=2;
 if not tom_param then
 begin
  skrivfejl(2);
 end;
end; <* case 2 *>


<* 3 *>
begin
tilstand:=16;
afslutja:=false;
if not tom_param then
 begin
   skrivfejl(2)
 end;
end; <* case 3 *>


<* 4 *>
begin
tilstand:=3;
if not tom_param then
 begin
  skrivfejl(2)
 end;
<*opfyld arbejdsvariablen akatpost med blanke*>
for i:=1 step 1 until gf_ktp_længde do
begin
akatpost(i):=long<:     :> add 'sp'
end;
<*initialiserer katalogpostens hoved*>
akatpost.slettet:=false;
akatpost.udvidet:=false;
akatpost.mor:=true;
akatpost.forantal:=0;
akatpost.stiktegnantal:=0;
katpostnr:=ledigkatpost;
ledigkatpost:=ledigkatpost+1;
end;<* case 4 *>


<* case 5 *>


begin
 tilstand:=4;
 if not mængde_param(mængdenr,elementantal) then
 begin
  skrivfejl(3);
  afslutja:=false;
  tilstand:=16;
 end;
 else begin
 if elementantal <> 1 then
 begin
  skrivfejl(4);
  afslutja:=false;
  tilstand:=16;
 end;
else
begin
 katpostnr:=søgmængde(mængdeindex(mængdenr).søgførst);
if not indlæs_katalogpost(katpostnr,gfkatstart,akatpost) then
begin
 skrivfejl(19);
 tilstand:=false;
 afslutja:=false;
end;
end <*else*>
end<*else*>
end <*casse 5*>


<* 6 *>
begin
 tilstand:=5;
 if not mængde.param(mængdenr,elementantal) then
 begin
  skrivfejl(3);
  afslutja:=false;
  tilstand:=16;
 end;
else
 begin
 fori:=mængdeindex(mængdenr).søgførst step 1 
 until mængdeindex(mængdenr).søgsidst do
 begin
  akatpost.slettet:=true;
  skriv_katalogpost(i,gfkatstart,akatpost);
 end; <*for*>
opdatja:=true;
end;<*else*>
end;<*case*>


<* 7 *>
begin
 tilstand:=6;
 if not tom_param then
 begin
 skrivfejl(2)
 end;
end; <*case 7*>


<* 8 *>
begin
 tilstand:=7;
 if not tom_param then
 begin
 skrivfejl(2);
 end;
end; <*case 9*>

<* 9 *>
begin
 tilstand:=8;
 if not tom_param then
 begin
  skrivfejl(2);
 end;
mængdeindexnæste:=1;
søgemængdenæste:=1;
end; <*case 9*>


<* 10 *>
begin
 tilstand:=9;
 if not tom_param then
 begin
  skrivfejl(2);
 end;
skriv_post_attribut;
end; <*case 10*>


<* 11 *>
begin
 tilstand:=10;
 if not tom_param then
 begin
  skrivfejl(2);
 end;
skriv_kar_inf;
end;<*case 11*>


<* 12 *>
begin
 tilstand:=11;
 if not listd_param(mængdenr,fra,til) then
 begin
 skrivfejl(5);
 tilstand:=error;
 end;<*case 12*>


<* 13 *>
begin
boolean alt;
integer mfra,mtil;
tilstand:=12;
if not listk-param(mfra,mtil,alt) then
begin
  skrivfejl(5);
  afslutja:=false;
  tilstand:=16;
end; <* if *>
else
begin
if not skriv_nøgleord(mfra,mtil,alt)
then
begin
 skrivfejl(6);
end;
end; <*else*>
end; <*case 13 *>


<* 14 *>
begin
if not tom_param then
begin
 skrivfejl(2);
end;
if opdatja then
begin
 nypost;
 opdatsøgestruktur;
end;
goto slut;
end <*case 14 *>


<* 15 *>
begin
 tilstand:=13;
 if not tom_param then
 begin
  skrivfejl(2);
 end;
nypost;
ajourkat;
end; <*case 15*>


<* 16 *>
begin
integer val;
tilstand:=14;
if læstegn(val) then
begin
 lighedstegn:=val;
end;
write(out,<:<10>:>,<:lighedstegn = :>);
outchar(out,lighedstegn);
outendcur(10)
end; <* case 16 *>


<* 17 *>
begin
integer val;
tilstand:=15;
if læstegn(val) then
begin
 dollertegn:=val;
end;
write(out,<:<10>:>,<:dollertegn= :>);
outchar(out,dollertegn);
outendcur(10);
end; <*case 17*>


<* 17 *>
begin
skip_linie_rest;
skrivfejl(7);
end; <*case 17*>


<* 19 *>
begin
integer val;
if findlighed then
begin
if læsheltal(val) then
begin
  k_nf_fl(nordrekode-fmodifyord+1):=val;
end;
else
begin
 skrivfejl(8);
end;
end;<*if*>
else
begin
  skrivfejl(9);
end; <*else*>
skip_linie_linie_rest;
end; <*case 19*>


<* 20 *>
begin 
integer feltlængde,l,dummy,stoptegn,fra,til;
i:=nordrekode-ffeltord+1;
if i=stikord then
begin
  feltlængde:=k_gf_fl(ord_index);
end;
else
begin
  feltlængde:=k_gf_fl(i)
end;
stoptegn:=74; <*blot for at have værdi <> 'nl'*>
   if findlighed then
begin
long array ltegnbuf(1:feltlængde);
integer array itegnbuf(1:6*feltlængde);
<*nulstil tegnbuf*>
for i:=1 step 1 until 6*feltlængde do
begin
  itegnbuf(i):='sp';
end; <*for*>
if not læsværdistreng(dummy,stoptegn,itegnbuf,6*feltlængde) then
begin
  skrivfejl(10);
end <*if*>
else
begin
if stoptegn<>'nl' then
  begin
   skrivfejl(10);
  end
  else
  begin
   indsæt_i_array(ltegnbuf,itegnbuf,6*feltlængde);
    if ffeltord <=nordrekode <=snfeltord then
     begin
     for i:=kpost(nordrekode-ffeltord+1) step 1 until
     (kpost(nordrekode-ffeltord*2)-1) do
     begin
      akatpost.kpostarraystart(i):=ltegnbuf(i)
     end;
<*indsættelse f een forfatter*>
     if nordrekode=forord then
     begin
     indsæt_for_i_katpost(morpost,katpost,ltegnbuf);
     end;
<*indsættelse af et stikord*>
     if nordrekode=stikord then
     begin
     if not indsæt_stikord(akatpost,itegbuf,fra,til) then
     begin
     skrivfejl(13);
     write(out,<:part og keyword included = :>);
     for i:= fra step 1 until til do
     begin
        outchar(out,itegnbuf(i);
     end;
     outendcur(10);
    end;<*if*>
   end;<*stikord*>
  end;<*else nl*>            
end;<*else læsværdistreng*>
<*læs linierest*>
if stoptegn <> 'nl' then
 begin
  skip_linie_rest;
 end;
end;<*if findlighed*>
else
begin
skrivfejl(11);
skip_linie_rest;
end;<*else*>
end;<*case  20*>


<* 21 *>
begin
  skip_linie_rest;
  skrivfejl(11);
end; <*case 21*>


<* 22 *>
begin
 integer feltlængde,i,råtegn,stoptegn1,foraktion;
 integer råtegn2,stoptegn2,postnr1,fornr1,fornr2;
 integer forn3,stikaktion,sfra,stil,tegn;
long array indkatpost(1:gf_ktp_længde);
long array frakatpost(1:gf_ktp_længde);
boolean morja,mor_ej_udvidet;
i:=nordrekode-ffeltord+1;
stoptegn1:=stoptegn2:=74; <*blot for at have værdi<>'nl'*>
if i=stikord then
begin
 feltlængde:=k_gf_fl(ord_index);
end
else
begin
 feltlængde:=k_gf_fl(i)
end;
if findlighed then
begin
  integer array itegnbuf1(1:6*feltlængde);
  integer array itegnbuf2(1:6*feltlængde);
  long array ltegnbuf1(1:feltlængde);
  long array ltegnbuf2(1:feltlængde);
  long array ltegnbuf3(1:feltlængde);


for i:=1 step 1 until feltlængde do
begin
 ltegnbuf1(i):=long<:     :> add 'sp';
 ltegnbuf2(i):=long<:     :> add 'sp';
 ltegnbuf3(i):=long<:     :> add 'sp';
end;

<*nulstil tegn buffer*>
for i:=1 step 1 until 6*feltlængde do
begin
 itegnbuf1(i):='sp';
 itegnbuf2(i):='sp';
end;
if not læsværdistreng(råtegn1,stoptegn1nitegnbuf1,6*feltlængde) then
begin
  skrivfejl(10)
end;
else
begin
 indsæt_i_array(ltegnbuf1,itegnbuf1,6*læltlængde);
<*indsæt felter*>
if ffeltord <=nordrekode<=snfeltord then
begin
 if stoptegn=lighedstegn then
 begin
  skrivfejl(10);
 end;
 else
 begin
 for i:=kpost(nordrekode-ffeltord+1)step 1
 until (kpost(nordrekode-ffeltord+2)-1) do
 begin
  akatpost.kpostarraystart(i):=ltegnbuf(i);
 end;
end;
end;<*indsæt felter*>

<*forfatter*>
<*fejl*>
if nordrekode:=forord then begin
foraktion:=4;

if stoptegn1=lighedstegn and råtegn=0 then
begin
  foraktion:=1;
end;
<*ændre*>
if stoptegn1=lighedstegn and råtegn1<>0 then
begin
  foraktion:=2;
end;
<*indsæt*>
if stoptegn1='nl' and råtegn<>0 then
begin
  foraktion:=3;
end;

case foraktion of
begin
 <*slet*>
begin
if not læsværdistreng(råtegn2,stoptegn2,itegnbuf2,6*feltlængde) then
begin
  if stoptegn <> 'nl' then skip_linie_rest;
  skrivfejl(10);
end
else
begin
indsæt_i_array(ltegnbuf2,itegnbuf2,6*feltlængde);
if søg-for(akatpost,indkatpost,ltegnvuf2,postnr1,fornr1,morja) then
begin
     <*søg_for*>
if morja then
begin
 if akatpost.udvidet then
 begin
  ud_sidste_for(akatpost.barnadr,ltegnbuf3,fornr2,mor_ej_udvidet);
  indsæt_for(akatpost,ltegnbuf3,fornr1);
  if mor_ej_udvidet then
  begin
   akatpost.udvidet:=false;
  end;
 end;<*if akatpost.udvidet*>
 else
 begin
<*sæt forfatterne i orden*>
 for_iorden(akatpost,fornr1);
 end;<*else akatpost.udvidet*>
end  <*morja*>
else
begin
if indkatpost.udvidet then
 begin
ud_sidste_for(indkatpost.barnadr,ltegnbuf3,fornr2,mor_ej_udvidet);
indsæt_for(indkatpost,tegnbuf3,fornr1);
if mor_ej_udvidet then
begin
  indkatpost.udvidet:=false;
end;
end
else
 begin
  for_iorden(indkatpost,fornr1);
 end;<*else akatpost.udvidet*>
 skriv_ny_ga_katpost(postnr1,indkatpost);
end; <*else norja*>
end;<*søg_for*>
end;<*else læsværdistreng*>
end; <*slet*>

<*ændre*>
begin
if not læsværdistreng(råtegn2,stoptegn2,itegnbuf2,6*feltlængde) then
begin
 if stoptegn2 <>'nl' then skip_linie_rest;
 skrivfejl(10)
end;
else
begin
indsæt_i_array(ltegnbuf2,itegnbuf2,6*feltlængde);
if søg-for(akatpost,indkatpost,ltegnvuf2,postnr1,fornr1,morja) then
begin
if morja then
 begin
   akatpost.forantal:=akatpost.forantal-1;
   indsæt_for(akatpost,ltegnbuf1,fornr1);
 end;
 else
 begin
 indkatpost.forantal:=indkatpost.forantal-1;
 indsæt_for(indkatpost,ltegnbuf1,fornr1);
 skriv_ny_ga_katpost(postnr1,indkatpost);
 end; <*else morja*>
end
else
begin
 skrivfejl(20);
end;<*søg_for*>
end;<*læsværdistreng*>
end;<*ændre*>

<*indsæt*>
begin
indsæt_for_i_katpost(katpost,katpostnr,ltegnbuf1);
ennd;<*indsæt*>

<*fejl*>
begin
 skrivfejl(20);
end;<*fejl*>
end;<*case*>
end;<*forfatter*>

<*stikord*>
if nordrekode = stikord then
<*dan tilfælde_kode til case_sætning*>
<*fejl*>
stikaktion:=4;
<*slet*>
if stoptegn1=lighedstegn and råtegn1=0 then
begin
 stikaktion:=1;
end;

<*ændre*>
if stoptegn1=lighedstegn and råtegn1<>0 then
 begin
   stikaktion:=2;
 end;

<*indsæt*>
if stoptegn1='nl' and råtegn1 <>0 then
 begin
   stikaktion:=3;
 end;

case stikaktion of
begin
<*slet*>
 begin
  if not læsværdistreng(råtegn2,stoptegn2,itegnbuf2,6*feltlængde)
  then begin
  skrivfejl(20);
  end
  else
  begin
  if søg_stikord(akatpost,itegnbuf2,sfra,stil) then
   begin
   tegn:='sp';
   for i:=sfra step 1 until stil do
   begin
   <*indsæt blanke*>
   indsæt_stiktegn(akatpost,i,tegn);
   end;
  end;<*if søg_stikkord*>
 end;<*else læsværdistreng*>
end;<*slet*>

<*ændre*>
 begin
  if not læsværdistreng(råtegn2,stoptegn2,itegnbuf2,6*feltlængde) 
  then begin
  skrivfejl(20);
  end;
  else
  begin
  if not søg_stikord(akatpost,itegnbuf2,sfra,stil) then
    begin
      skrivfejl(21);
    end;
    else
    tegn:='sp';
<*blank til den gamle værdi*>
 for i:=sfra step 1 until stil do
   begin
    indsæt_stiktegn(akatpost,i,tegn);
   end;
<*indsæt det nye ord tilsidst*>
if not indsæt_stikord(akatpost,itegnbuf1,sfra,stil) then
begin
skrivfejl(13);
write(out,<:post og keyword included = :>);
for i:=sfra step 1 until stil do
begin
  outchar(out,itegnbuf1);
end;
  outendcur(10);
end;<*if not indsæt*>
end;<*else søg_stikord*>

end;<*else læsværdistreng*>
end;<*ændre*>

<*indsæt*>
begin
 if not indsæt_stikord(akatpost,itegnbuf1,sfra,stil) then
 begin
  skrivfejl(13);
  write(out,<:part of keyword included = :>);
  for i:=sfra step 1 until stil do
  begin
   outchar(out,itegnvuf1);
  end;
 outendcur(10);
 end;<*if not indsæt*>
end;<*indsæt*>

<*fejl*>
begin
 skrivfejl(20);
end; <*fejl*>
end;<*case*>
end;<*stikord*>
end+<*else læsværdistreng*>
if stopteng1 <> 'nl' and stoptegn2 <> 'nl' then
 begin
  skip_linie_rest
 end;
end <*if findlighedstegn*>
else
 begin
skrivfejl(11);
skip_linie_rest;
end; <*else*>
end;<*case 22*>
▶EOF◀