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

⟦5f0e5d30e⟧ TextFile

    Length: 23040 (0x5a00)
    Types: TextFile
    Names: »exttxtkom«

Derivation

└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system
    └─⟦72244f0ef⟧ 
        └─⟦this⟧ »exttxtkom« 

TextFile

;   <*-------------------------komlib--------------------------
;   
;     modulnavn (algol7 text) : exttxtkom
;   _           (object code) : komlib
;   kørt første gang d.       : 24.08.78
;   formål                    : externe procedurer til kommune-gruppen
;   projekt                   : system
;   _
;   programmør                : jkp + hjep + olej + niels jacobsen
;   _
;   sidste rettelsesdag       : 14/5-79
;   udført af                 : Ole Jacobsen
;   _
;   dokumentation             : *
;   _
;   moduler der benyttes      : ingen
;   _
;   bemærkninger              : ingen
;*>
;<*-------------------------hjælp-----------------------------*>
indlæstal = algol
external

long procedure indlæstal(udtext);
string udtext;
begin
   long indtal;
   write(out,<:<10>:>,udtext,<: ?= :>);
   setposition(out,0,0);
   read(in,indtal);
   indlæstal := indtal;
end indlæstal;
end;

ask = algol
external

boolean procedure ask(asktext);
string asktext;
begin
  own boolean erkaldt, skinput;
   integer ch,dum;

    if -, erkaldt then
    begin
      integer array beskrivelse(1:20);
      erkaldt := true;
      getzone(in, beskrivelse);
      skinput := beskrivelse(1) = 8;
    end;
 
   write(out,<:<10>:>,asktext,<: ? :>);
   setposition(out,0,0);
   for dum := readchar(in,ch) while ch<> 106 and ch <> 110 do
   if ch<> 10 and ch <> 32 then
   begin
      write(out,<:svar j'a' eller n'ej':>);
      write(out,<:<10>:>,asktext, <: ? :>);
      if -, skinput then
        system(9, 0, <:fejl i svar:>);
      setposition(out,0,0);
      for dum := readchar(in, ch) while ch <> 10 do;
   end for;
   ask := ch = 106;
   if skinput then
   begin
      for dum := readchar(in, ch) while ch <> 10 do;
   end;
end ask;
end;

checkddmmåå = algol
external

boolean procedure checkddmmåå(dato);
value dato;
integer dato;
checkddmmåå := (dato // 10000 < 32) and (dato //100 mod 100 < 13);
end;

checkmod11 = algol
external

boolean procedure checkmod11(tal);
value tal;
long tal;
begin
   long tal1;
   integer sum, vægt;
   sum := 0;
   tal1 := tal;
   for vægt := 1, (case vægt of (2, 3, 4, 5, 6, 7, 2)) while tal1 > 0 do
   begin
      sum := sum + (tal1 mod 10) * vægt;
      tal1 := tal1 // 10;
   end;
   checkmod11 := sum mod 11 = 0;
end checkmod11;
end;

lavcheckcif = algol
external

long procedure lavcheckcif(tal);
value tal;
long tal;
begin
   long tal1;
   integer sum, vægt;
   tal1 := tal;
   sum := 0;
   for vægt := 3, (case vægt of (2, 3, 4, 5, 6, 7, 2)) while tal1 > 0 do
   begin
      sum := sum + (tal1 mod 10) * vægt;
      tal1 := tal1 // 10;
   end;
   sum := (22 - sum mod 11) mod 11;
   if sum = 10 then sum := 50;
   lavcheckcif := tal * 100 + sum;
end lavcheckcif;
end;

tiexp = algol
external

long procedure tiexp(eksponent);
value eksponent;
integer eksponent;
begin
   tiexp := case eksponent + 1 of (
   1,10,100,1000,10000,100000,1000000,10000000,100000000,
   1000000000,10000000000,100000000000,1000000000000,10000000000000,
   100000000000000);
end tiexp;
end;

getdeltal = algol
external

integer procedure get_del_tal(tal,pos1,pos2);
<* proceduren henter tallet i positionerne pos1 til pos2
i tal fra højre mod venstre *>
value tal,pos1,pos2;
integer pos1,pos2;
long tal;
begin
   get_del_tal := tal//tiexp(pos1 -1) mod tiexp(pos2 - pos1 +1);
end get_del_tal;
end;
lavkortstr = algol
external

long procedure lav_kort_streng(tal,antalpos);
value tal, antalpos;
integer tal,antalpos;
<* resultatet er en long med tal pakket med iso værdier for cifrene
i antalpos positioner fra venstre *>
begin
   long fak , str;
   integer j;
   fak := tiexp(antalpos-1);
   str := 0;
   for j := 1 step 1 until antalpos do
   begin
      str := str shift 8 + (tal//fak) + 48;
      tal := tal mod fak;
      fak := fak // 10;
   end for;
   lav_kort_streng := str shift((6 - antalpos) * 8);
end lav_kort_streng;
end;

nulstil = algol
external

procedure nulstil(rec,længde);
<* længde er angivet i bytes*>
value længde;
integer længde;
real array rec;
begin
   real array field raf;
   raf := 4;
   rec(1) := real <::>;
   tofrom(rec.raf,rec,længde-4);
end nulstil;
end;

initrek = algol 
external

procedure initrek(rek,længdefelt,længde);
value længde;
integer længde;
integer field længdefelt;
array rek;
begin
   nulstil(rek,længde);
   rek.længdefelt := længde;
end initrek;
end;

skrivdagsda = algol
external


procedure skrivdagsdato(z);
zone z;
begin
   own integer dag, måned, år;
   
   if dag = 0 then
  begin
    integer dagsdato;
   real kl,kl1;
      systime(1,0,kl);
      dagsdato := entier(systime(2,kl,kl1));
      dag := dagsdato // 10000;
      måned := dagsdato // 100 mod 100;
      if måned > 12 then måned := 0;
      år := dagsdato mod 100 + 1900;
   end;
   write(z,<<dd>, dag,<:. :>);
   write(z, case måned + 1 of
   (
   <:fejl     :>,
   <:januar   :>,
   <:februar  :>,
   <:marts    :>,
   <:april    :>,
   <:maj      :>,
   <:juni     :>,
   <:juli     :>,
   <:august   :>,
   <:september:>,
   <:oktober  :>,
   <:november :>,
   <:december :>));
   write(z,<< dddd>,år);
end skrivdagsdato;
end;
 

skrivdato = algol
external


procedure skrivdato(z,dato);
<* proceduren udskriver datoen på formen:
   dd. <måned> åååå
   det fylder 18 tegn.
*>
zone z;
integer dato;
begin
   integer dag, måned, år;
   integer pos;
   
   dag := dato // 10000;
   måned := dato // 100 mod 100;
   if måned > 12 or måned < 0 then måned := 0;
   år := dato mod 100 + 1900;
   pos := write(z,<<dd>, dag,<:. :>);
   pos := pos + write(z, case måned + 1 of
   (
   <:fejl:>,
   <:januar:>,
   <:februar:>,
   <:marts:>,
   <:april:>,
   <:maj:>,
   <:juni:>,
   <:juli:>,
   <:august:>,
   <:september:>,
   <:oktober:>,
   <:november:>,
   <:december:>));
   pos := pos + write(z,<< dddd>,år);
   write(z, false add 32, 18 - pos);
end skrivdato;
end;

skrivugedag = algol
external
\f



procedure skrivugedag(z,dato);
<* skriver <ugedag> den <dato> *> <* fylder 30 tegn *>
value dato;
integer dato;
zone z;
begin
   integer dag, måned, år, n, u;
   dag := dato//10000;
   måned := dato//100 mod 100;
   år := 1900 + dato mod 100;
   if måned<3 then
   begin
      måned := måned + 12;
      år := år - 1;
   end;
   n := 13*(måned+1)//5 + 5*år//4 - år//100 + år//400 + dag - 1;
   u := n mod 7;
   write (z,case u+1 of(<:søndag :>,<:mandag :>,<:tirsdag:>,<:onsdag :>,<:torsdag:>,<:fredag :>,<:lørdag :>));
   write (z,<: den :>);
   skrivdato (z,dato);
end skrivugedag;
end;

initalfabet = algol
external

procedure init_alfabet(alfabet);
<* proceduren initialiserer parameteren, alfabet, med et standard-alfabet*>
integer array alfabet;
begin
   integer j;
   for j := 0 step 1 until 127 do
   alfabet(j) := (case j + 1 of (
   0, 7, 7, 7, 7, 7, 7, 7,
   7, 7, 8, 7, 8, 0, 7, 7, 
   7, 7, 7, 7, 7, 7, 7, 7, 
   7, 8, 7, 7, 7, 7, 7, 7,
   7, 7, 7, 7, 7, 7, 7, 5,
   7, 7, 7, 3, 7, 3, 4, 7,
   2, 2, 2, 2, 2, 2, 2, 2,
   2, 2, 7, 7, 7, 7, 7, 7,
   7, 6, 6, 6, 6, 6, 6, 6,
   6, 6, 6, 6, 6, 6, 6, 6,
   6, 6, 6, 6, 6, 6, 6, 6,
   6, 6, 6, 6, 6, 6, 7, 7,
   7, 6, 6, 6, 6, 6, 6, 6, 
   6, 6, 6, 6, 6, 6, 6, 6,
   6, 6, 6, 6, 6, 6, 6, 6,
   6, 6, 6, 6, 6, 6, 7, 0)) shift 12 + j;
end initalfabet;
end;


skrivvt = algol 
external
\f


 
procedure skriv_vt(z, antal, spec_styrestrimmel);
value antal, spec_styrestrimmel;
zone z;
integer antal;
boolean spec_styrestrimmel;
begin
  if spec_styrestrimmel then
    write(z, false add 11, 1)
  else
    write(z, false add 10, antal);
end skriv_vt;
end;

plus1dato = algol
external
 
 
integer procedure plus1dato(dato);
value dato;
integer dato;
<* procedure giver datoen for dagen efter den opgivne dato *>
begin
  integer d, m, å;
 
  d := dato // 10000 + 1;
  m := dato // 100 mod 100;
  å := dato mod 100;
  if m < 0 or 12 < m then  m := 0;
  if d > (case m+1 of (99, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)) then
  begin
    d := 1;
    m := m + 1;
    if m = 13 then
    begin
      m := 1;
      å := å + 1;
    end;
  end;
  plus1dato := d*10000 + m*100 + å;
end plus1dato;
end;

skrivtidsfo = algol
external


procedure skrivtidsfo(z,txt);
<* procedure til udskrift af tidsforbrug med henblik på effektivitetsanalyse.
formatet er:
klokken  tt mm ss    txt ( som er parameter )
siden sidst i sek.          siden start i tt mm ss
cputid    realtid           cputid         realtid
*>
zone z;
string txt;
begin
own boolean erkaldt,sp;
own real cputid,realtid,starttid;
real cpuforb, realtidnu,klokke,cpuklok,realklok;

if -, erkaldt then
begin
integer dagsdato;
real kl;
erkaldt := true;
cputid := systime(1,0,starttid);
realtid := starttid;
write(z,<:<10>:>,<: første tidsstatistik udskrift  :>);
dagsdato := entier(systime(2,starttid,kl));
sp := false add 32;
skrivugedag(z,dagsdato);
write(z,<:<10>:>);
end;
cpuforb := systime(1,0,realtidnu);
systime(2,realtidnu,klokke);
systime(2,cpuforb,cpuklok);
systime(2,realtidnu - starttid,realklok);
write(z,<:<10>:>,<:klokken :>,<<dd dd dd>,klokke,sp,5,txt,<:<10>:>,
<: siden sidst i sek.                siden start  tt mm ss:>,<:<10>:>,
<: cpu : :>,<<dddd.dd>,cpuforb - cputid,
<: real : :>,realtidnu - realtid,sp,5,
<: cpu : :>,<<dd dd dd>,cpuklok,
<: real : :>,realklok,<:<10>:>);
realtid := realtidnu;
cputid := cpuforb;
end skrivtidsfo;
end;
;<* -------------------------filehjælp-----------------------------*>
connectdoc = algol
external
\f


integer procedure connect_doc(z,name,segm);
<*****************************************>
value                               segm;
integer                             segm;
string                         name;
zone                         z;

begin
   comment proceduren åbner 'z' til 'name'.
   hvis katalogindgangen ikke findes og segm > 0, erklæres der et bs-areal
   med navnet 'name' og en størrelse på 'segm' segmenter.
   hvis segm < 0 sættes check_wanted bit'en i zonens free parameter.
   procedurens returværdi angiver dokumentets 'kind';

   integer modekind,i,k;
   integer array tail(1:10),descr(1:20);
   real array field raf;
   real array doc(1:2);

   close(z,true);
   movestring(doc,1,name);
   k:=1;
   open(z,0,string doc(increase(k)),0);

   i:=monitor(42)lookup_entry:(z,0,tail);

   if i <> 0 then
   begin


      <* indgangen findes ikke *>
      if segm <= 0 then
      begin
         k:=1;
         write(out,<:<10>:>,<:bs-area :>,string doc(increase(k)),<:findes ikke:>);
         system(9,i,<:<10>*connect:>);
      end
      else
      begin
         comment der laves et bas-area;
         close(z,true);
         k:=1;
         open(z,4,string doc(increase(k)),0);
         for i:=1 step 1 until 10 do tail(i):=0;
         tail(1):=segm;
         tail(6) := systime(7, 0, 0.0);
         i:=monitor(40)create_entry:(z,0,tail);
         if i <> 0 then
         begin
            k:=1;
            write(out,<:<10>:>,<:bs-area :>,string doc(increase(k)),<: kan ikke oprettes:>);
            system(9,i,<:<10>*connect:>);
         end;
      end;
   end
   else
   if tail(1) > 0 then
   begin
      close(z,true);
      k:=1;
      open(z,4,string doc(increase(k)),0);
      connect_doc:=4;
   end
   else
   if tail(1) <= 0 then
   begin
      <* indgangen <> bs-area *>
      modekind:=tail(1) extract 23;
      close(z,true);
      k:=1;
      raf:=2;
      open(z,modekind,string tail.raf(increase(k)),0);
      if modekind extract 12 = 18 then setposition(z,tail(7),tail(8));
      connect_doc:=modekind extract 12;
   end;

   if segm < 0 then
   begin
      comment der ønskes kontrol af checksum;
      getzone6(z,descr);
      descr(11):= 1 shift 23;
      setzone6(z,descr);
   end;
end procedure connect_doc;
end;

fpfejl= algol
external
integer procedure fpfejl(type);
<*****************************>
value                    type;
integer                  type;

begin
   write(out,<:<10>:>,<:fejl i fil-parametre:>,<:<10>:>,case type of (
   <:parameterfejl:>,
   <:ukendt parameter:>,
   <:parameter læst tidligere:>,
   <:parameter ikke efterfulgt af punktum:>,
   <:ukendt testudskrift:>,
   <:ukendt skærmmode   :>), <:<10>:>);
  system(9,type,<:<10>fp_kald:>);
end procedure fpfejl;
end;

generatenam = algol
external
\f



procedure generate_nam(name);
<****************************>
array                   name;

comment proceduren generer et
bs_area navn;

begin
   zone
   _ z(128,1,stderror);

   integer array
   _ ia(1:20);

   integer array field
   _ iaf;

   integer
   _ i;

   iaf:=0;
   i:=monitor(68)generate_name:(z,0,ia);
   if i <> 0 then system(9,i,<:<10>*genname:>);

   getzone6(z,ia);
   for i:=2 step 1 until 5 do name.iaf(i-1):=ia(i);


end procedure generate nam;
end;


removeentry = algol
external
\f

procedure remove_entry(name);
<***************************>
array                  name;

comment proceduren fjerner 
området <name>;

begin
   zone
   _ z(128,1,stderror);

   integer array
   _ ia(1:20);

   integer
   _ i;

   i:=1;
   connect_doc(z,string name(increase(i)),21);

   i:=monitor(48)remove_entry:(z,0,ia);
   close(z,true);

end procedure remove_entry;
end;

getexactpos = algol
external
\f

procedure getexactpos(z,block,rel,pwfree);
<*********************************************>

zone                       z;
integer                      block,rel,pwfree;

begin
   comment proceduren finder den nøjagtige position
   på dokumentet tilknyttet z;

   integer array
   _ zdescr(1:20);

   getzone6(z,zdescr);
   block:=zdescr(9);
   rel:=zdescr(14)+zdescr(16)-zdescr(19)-4*zdescr(20)//zdescr(18)*(zdescr(17)-1);
   pwfree:=if zdescr(13) = 6 then zdescr(11) else zdescr(12);


end procedure getexactpos;
end;
setexactpos = algol
external

procedure setexactpos(z,block,rel,pwfree);
<*********************************************>
zone                       z;
integer                      block,rel,pwfree;

begin
   integer array
   _ zdescr(1:20);

   integer
   _ actblock,
   _ zstate;

   getzone6(z,zdescr);
   actblock:=zdescr(9);
   zstate:=zdescr(13);
   if actblock = block and zstate <> 0 then
   zdescr(14):=rel+zdescr(19)+4*zdescr(20)//zdescr(18)*(zdescr(17)-1)
   else
   begin
      setposition(z,0,block);
      inrec6(z,0);
      zdescr(9):=block;
      zdescr(13):=zstate;
      zdescr(14):=rel+zdescr(19);
      zdescr(15):=zdescr(19)+4*zdescr(20)//zdescr(18);
      zdescr(17):=1;
   end;
   zdescr(11):=zdescr(12):=pwfree;
   zdescr(16):=0;
   setzone6(z,zdescr);

end procedure setexactpos;
end;

getstdfp = algol
external
\f

boolean procedure get_std_fp(outfiletxt,infiletxt,fejllistetxt,test);
<*proceduren læser følgende standard-parametre:
<outfiletxt> = programkald in.<infiletxt> fejl.<fejllistetxt> test.<et eller flere tal>
det forudsættest, at test er erklæret som (1:20), og for alle tal, der forekommer
med . imellem efter test vil test(tallet) blive sat til true
*>
array outfiletxt,infiletxt,fejllistetxt;
boolean array test;
begin
   real array ra(1:2);
   boolean array læst(1:4);
   integer j,p,cas;
   integer testnedre, testøvre;
 
  testnedre := system(3, testøvre, test);
   for j := testnedre step 1 until testøvre do test(j) := false;
   for j := 1 step 1 until 4 do læst(j) := false;
   p := 1;
   if system(4,1,ra) shift (-12) = 6 then
   begin
      <* outfile forekommer *>
      if system(4,0,ra) extract 12 <> 10 then fpfejl(1);
      tofrom(outfiletxt,ra,8);
      p:= 2;
   end;
   for j := system(4,p,ra) while j <> 0 do
   if j<> 4 shift 12 + 10 then fpfejl(1)
   else
   begin
      cas := if ra(1) = real<:in:> then 1 else
      if ra(1) = real <:fejl:> then 2 else
      if ra(1) = real <:test:> then 3 else 4;
      if cas = 4 then
      begin
        get_std_fp := false;
        goto exit;
      end;
      if læst(cas) then fpfejl(3) else læst(cas) := true;
      j := system(4,p+1,ra);
      if j shift (-12) <> 8 then fpfejl(4);
      case cas of
      begin
         tofrom(infiletxt,ra,8);
         tofrom(fejllistetxt,ra,8);
         for p:= p+1 while system(4,p,ra) = 8 shift 12 + 4 do
         if ra(1)  >= testnedre and ra(1) <= testøvre then
             test(ra(1)) := true else fpfejl(5);
      end case;
      if cas <> 3 then p := p+ 2;
   end for;
   get_std_fp := true;
exit:;
end get_std_fp;
end;

læsfptal = algol
external
\f


long procedure læsfptal(text);
  <* proceduren læser et tal i fp-kaldet. det skal stå på formen <text>.<tal> *>
string text;
begin
  real array ra, textra (1:2);
  integer j, fpnr, lg;
 
  lg := movestring(textra, 1, text);
  fpnr := 1;
  læsfptal := 0;
  for j := system(4, fpnr, ra) while j <> 0 do
  begin
    if j = 4 shift 12 add 10 <* det er et navn med space foran *>
       and ra(1) = textra(1)
       and (if lg = 2 then ra(2) = textra(2) else true) then
    begin
      fpnr := fpnr + 1;
      if system(4, fpnr, ra) = 8 shift 12 + 4 <* punktum med et tal efter *> then
        læsfptal := ra(1)
      else
        fpfejl(4);
    end
    else
      fpnr := fpnr + 1;
  end;
end læsfptal;
end;

læsfpboo = algol
external
\f


boolean procedure læsfpboo(text,boo);
  <* proceduren læser en boolean i fp-kaldet. det skal stå på formen <text>.<svar> 
og resultatet leveres i boo , som true hvis <svar> er 'yes' eller 'ja'
og false hvis <svar> er 'no' eller 'nej'. 
findes <text> ikke i fpkaldet, er boo uændret *>
string text;
boolean boo;
begin
  real array ra, textra (1:2);
  integer j, fpnr, lg;
  læsfpboo := false;
 
  lg := movestring(textra, 1, text);
  fpnr := 1;
  for j := system(4, fpnr, ra) while j <> 0 do
  begin
    if j = 4 shift 12 add 10 <* det er et navn med space foran *>
       and ra(1) = textra(1)
       and (if lg = 2 then ra(2) = textra(2) else true) then
    begin
      fpnr := fpnr + 1;
      if system(4, fpnr, ra) = 8 shift 12 + 10 <* punktum med en tekst efter *> then
      begin
        if ra(1) = real <:yes:> or ra(1) = real <:ja:> then
          boo := true
        else
        if ra(1) = real <:no:> or ra(1) = real <:nej:> then
          boo := false
        else 
          fpfejl(1);
        læsfpboo := true;
      end
      else
        fpfejl(4);
    end
    else
      fpnr := fpnr + 1;
  end;
end læsfpboo;
end;

læsfpelsk = algol
external
\f


long procedure læs_fp_el_sk(fptxt,skærmtxt);
string fptxt,skærmtxt;
begin
  long tal;
  tal:=læsfptal(fptxt);
  if tal=0 then
  begin
    tal:=indlæstal(skærmtxt);
  end;
  læs_fp_el_sk:=tal;
end;
end;

læsfptalføl = algol
external
 
boolean procedure læs_fp_talfølge(text,tab);
string text;
integer array tab <*(1:max)*>;
begin
  real array ra, textra(1:2);
  integer i,j,fpnr,lg;
  boolean fundet;

  fundet := false;
  lg := movestring(textra,1,text);
  fpnr := 1;
  læs_fp_talfølge := false;
  for j:=system(4,fpnr,ra) while j<>0 and -, fundet do
  begin
    if j = 4 shift 12 add 10 and
       ra(1) = textra(1) and
       (if lg = 2 then ra(2) = textra(2) else true) 
    then
      begin
        i:=1;
        læs_fp_talfølge := true;
        for fpnr := fpnr + 1 while system(4,fpnr,ra) =
                                   8 shift 12 + 4
        do tab(increase(i)) := ra(1);
        fundet := true;
      end
    else
      fpnr := fpnr + 1;
  end;
end;
end;

læsfptext = algol
external
\f


boolean procedure læs_fp_text(text,navn);
string text;
array navn <*(1:2)*>;
begin
  real array ra, textra(1:2);
  integer j, fpnr, lg;
  boolean fundet;
 
  fundet := false;
  lg := movestring(textra,1,text);
  fpnr := 1;
  læs_fp_text := false;
  for j:= system(4,fpnr,ra) while j<>0 and -, fundet do
  begin
    if j = 4 shift 12 add 10 and
       ra(1) = textra(1) and
       (if lg = 2 then ra(2) = textra(2) else true ) 
    then
      begin
        fpnr := fpnr + 1;
        if system(4,fpnr,ra) = 8 shift 12 + 10 then
          tofrom(navn,ra,8)
        else
          fpfejl(1);
        læs_fp_text := true;
        fundet := true;
      end
    else
      fpnr := fpnr + 1;
  end;
end;
end;

renameentry = algol
external
boolean procedure rename_entry(oldname,newname);
real array                     oldname,newname;
begin
  <* proceduren omdøber (renamer) disc-filen 'oldname' til 'newname' *>
  <* hvis 'oldname' ikke findes i forvejen oprettes en ny fil med navnet *>
  <* 'newname' . resultatet af proceduren er true hvis det er gået godt  *>
  <* ellers false *>
  
  integer array ia(1:4);
  zone z(128,1,stderror);
  integer i,j;
  
  ia(1) :=newname(1) shift(-24) extract(24);
  ia(2) :=newname(1) extract(24);
  ia(3) :=newname(2) shift(-24) extract(24);
  ia(4) :=newname(2) extract(24);
  i:=0;j:=1;
  connectdoc(z,string oldname(increase(j)),21);
  j := monitor(46)rename_entry:(z,i,ia);
  close(z,true);
  rename_entry := j=0;
end rename_entry;
end;

getexactpos = algol
external
\f

procedure getexactposition(z,block,rel,pwfree);
<*********************************************>

zone                       z;
integer                      block,rel,pwfree;

begin
   comment proceduren finder den nøjagtige position
   på dokumentet tilknyttet z;

   integer array
   _ zdescr(1:20);

   getzone6(z,zdescr);
   block:=zdescr(9);
   rel:=zdescr(14)+zdescr(16)-zdescr(19)-4*zdescr(20)//zdescr(18)*(zdescr(17)-1);
   pwfree:=if zdescr(13) = 6 then zdescr(11) else zdescr(12);


end procedure getexactposition;
end;
setexactpos = algol
external

procedure setexactposition(z,block,rel,pwfree);
<*********************************************>
zone                       z;
integer                      block,rel,pwfree;

begin
   integer array
   _ zdescr(1:20);

   integer
   _ actblock,
   _ zstate;
  boolean input;

   getzone6(z,zdescr);
   actblock:=zdescr(9);
   zstate:=zdescr(13);
   input := zstate = 1 or zstate = 5;
   if actblock = block and zstate <> 0 then
   zdescr(14):=rel+zdescr(19)+4*zdescr(20)//zdescr(18)*(zdescr(17)-1)
   else
   begin
      setposition(z,0,block - (if input then 1 else 0));
      inrec6(z,0);
      zdescr(9):=block;
      zdescr(13):=zstate;
      zdescr(14):=rel+zdescr(19);
      zdescr(15):=zdescr(19)+4*zdescr(20)//zdescr(18);
      zdescr(17):=1;
   end;
   zdescr(11):=zdescr(12):=pwfree;
   zdescr(16):=0;
   setzone6(z,zdescr);

end procedure setexactposition;
end;
copyproc = algol list.yes
external
 
integer procedure copyproc(zud, indnavn, slet_ind);
value slet_ind;
zone zud;
real array indnavn;
boolean slet_ind;
begin
  long array buf(1:129);
  integer array kind(1:128), alfabet(0:127);
  integer j, segmnr;
  zone zind(2*128, 2, stderror);
 
  for j := 1 step 1 until 126 do
    alfabet(j) := 6 shift 12 add j;
  for j := 0, 127 do
    alfabet(j) := 0 shift 12 add j;
  alfabet(25) := 8 shift 12 add 25;
 
  intable(alfabet);
  j := 1;
  connect_doc(zind, string indnavn(increase(j)), 0);
  segmnr := 0;
  buf(129) := extend 0;
 
  for j := readall(zind, buf, kind, 1) while j <= 0 do
  begin
    repeatchar(zind);
    write(zud, buf);
    segmnr := segmnr + 1;
  end;
  copyproc := segmnr * 768 + write(zud, buf);
  close(zind, true);
 
  if slet_ind then
    remove_entry(indnavn);
end;
end
▶EOF◀