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

⟦b88e72fac⟧ TextFile

    Length: 9984 (0x2700)
    Types: TextFile
    Names: »crossref4tx «

Derivation

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

TextFile

crossref = algol index.no
begin
  <* 77 05 13
         crossreference for fortran programs which have
         been preprocessed by xfortran
  *>

  integer variablelength, bintreelimit1, bintreelimit2, noofappear, rightptr,
          leftptr, wordvarlength ;

  variablelength :=12;    <* max length of items  must be multiplum of 3 *>
  bintreelimit2 := 150;  <* max no of items *>
  noofappear := 40;      <* max number of appearances for an item *>
  bintreelimit1 := variablelength/3+4; <* explanation see below *>
  wordvarlength := variablelength/3;   <* variablelength in words *>
  leftptr := wordvarlength+1;          <* ptr to left subtree *>
  rightptr := wordvarlength+2;         <* ptr to right subtree *>

  begin
    integer i,j,k,l, itemlength, treeindex, linecount, line, page;
    integer array item(1:variablelength+1), 
                  bintree(1:bintreelimit1,1:bintreelimit2),
                  name(1:wordvarlength+1),
                  routine(1:variablelength),
                  tail(1:10),
                  lineno(1:bintreelimit2,1:noofappear);
    boolean nl, sp, em;
    zone outfile(128,1,stderror);


    <*  variable explanation :
        
        item(.) - contains the next item on input.
        itemlength - index to item().
        bintree(.,.) - binary tree which contains the read information.
           bintree(1-variablelength,.)  - name in chars
              -   (leftptr,.)           - ptr to left subtree
              -   (rightptr,.)          - ptr to right subtree
              -   (       +1,.)         - ptr to appearance array
              -   (       +2,.)         - index to appearance array
        treeindex - ptr to last used item in bintree.
        lineno(.,.) - contains the linenumbers in which the read items exist.
        line - the current line.
        nl - newline.
        sp - space.
        page - number of page (used in writeinf).
        linecount - used to make appropiate pages in writeinf
    *>

    procedure error(no);
    value no; integer no;
    begin
      write(out,nl,2,sp,2,<:***:>);
      case no of
      begin
        write(out,<: identifier appears too many times :>);
        write(out,<: binary tree too small :>);
      end;
      write(out,nl,1);
    end proc error;
 
    procedure sort;
    begin
      integer array buf1(1:variablelength),buf2(1:variablelength);
      integer i,line1,line2,l1,l2;
 
      procedure write1;
      begin write(outfile,nl,1,line1,l1,<: :>);
        for i:=1 step 1 until l1 do outchar(outfile,buf1(i));
      end proc write1;
 
      procedure write2;
      begin write(outfile,nl,1,line2,l2,<: :>);
        for i:=1 step 1 until l2 do outchar(outfile,buf2(i));
      end proc write2;
 
      for i:=i while i=i do
      begin read(in,line1,l1);
        if line1=0 then
        begin write(outfile,nl,1,line1,l1,nl,1); goto endsort;
        end;
        for i:=1 step 1 until l1 do readchar(in,buf1(i));
        read(in,line2,l2);
        if line2=0 then
        begin write1;
          write(outfile,nl,1,line2,l2,nl,1); goto endsort;
        end;
        for i:=1 step 1 until l2 do readchar(in,buf2(i));
        if line2=-1 then 
        begin <* exchange *> write2; write1;
        end
       else
        begin write1; write2;
        end;
      end;
    endsort:
      setposition(outfile,0,0);
    end proc sort;
     
    procedure newpage;
    begin  
      page:=page+1;
      write(out, false add 12,1, sp,2,<:<10>crossreference:>,sp,5);
      for i:=1 step 1 until variablelength do outchar(out,routine(i));
      write(out,sp,50-variablelength,<:page:>,<<ddd>,page,nl,2);
    end proc newpage;


    procedure readitem;
    begin
      <* the next name  is read from input (only
         letters and digits and  are accepted *>

      read(outfile,line,itemlength);
      if line=-1 then goto exit1 else
      if line=0 then
      begin em:=true; goto exit1;
      end;
      for i:=1 step 1 until itemlength do readchar(outfile,item(i));
      if itemlength<variablelength then
      for i:= itemlength+1 step 1 until variablelength do item(i):=32;
      exit1:
<*
write(out,nl,1,<: line,length,name : :>,line,itemlength);
for i:=1 step 1 until itemlength do outchar(out,item(i));
write(out,nl,1);
*>
    end proc readitem;

    procedure insertname(ptr);
    value ptr; integer ptr;
    begin
      packname;
      for i:=1 step 1 until wordvarlength do bintree(i,ptr):=name(i);
    end proc insertname;
 

    procedure packname;
    begin j:=1;
      for j:=j while j<= variablelength do
      begin
        k:=0;
        for i:=2 step -1 until 0 do
        k:=k add (item(j+2-i) shift (i*8));
        name(j/3+1):=k;
        j:=j+3;
      end;
    end proc packname;


    procedure insert(ptr);
    value ptr; integer ptr;
    begin

      integer procedure compare(ptr);
      value ptr; integer ptr;
      <* comparison of the names in bintree and name.
         the result is :
           0 if the names are the same.
           1 if the name to insert is lexicographical before.
           2  else.
      *>

      begin i:=1;
        for i:=i while ((i<=wordvarlength) and (name(i)=bintree(i,ptr))) do i:=i+1; 
        if i> wordvarlength then compare:=0
       else
        if name(i)>bintree(i,ptr) then compare:=1
       else compare :=2;
      end proc compare;


      procedure insertnode(ptr,pos);
      value ptr,pos ; integer ptr,pos;
      begin
        if pos = 0 then <* the name has appeared before *>
        begin <* the linenumber has to be remembered *>
          i:=bintree(bintreelimit1,ptr)+1;
          if i>noofappear then error(1);
          lineno(bintree(bintreelimit1-1,ptr),i):=line;
          bintree(bintreelimit1,ptr):=i;
        end
       else
        begin <* new name *>
          treeindex := treeindex+1;
          if treeindex>bintreelimit2 then error(2);
          <* leftptr and rightptr are init 0 *>
          bintree(wordvarlength+3,treeindex):= treeindex;
          bintree(wordvarlength+4,treeindex):=1;
          lineno(treeindex,1):= line;
          if pos=1 then bintree(leftptr,ptr):= treeindex
                   else bintree(rightptr,ptr):= treeindex;
          <* insertion of the name *>
          insertname(treeindex);
        end new name;
      end proc insertnode;


      <* body of insert *>
      packname;  i:= compare(ptr) ;
      if i=0 then insertnode(ptr,0)
             else
      if i=1 then
      begin <* the name to insert is less than *>
        if bintree(leftptr,ptr)=0 then insertnode(ptr,1)
                                  else insert(bintree(leftptr,ptr))
      end
       else
      begin
        if bintree(rightptr,ptr)=0 then insertnode(ptr,2)
                                   else insert(bintree(rightptr,ptr))
      end
    end proc insert;


    procedure inorder(ptr);
    value ptr; integer ptr;
    begin <* the binary tree is crossed in inorder *>
      if ptr<>0 then
      begin
        inorder(bintree(rightptr,ptr));
        writeinf(ptr);
        inorder(bintree(leftptr,ptr));
      end;
    end proc inorder;
 
    procedure unpack(ptr);
    value ptr; integer ptr;
    begin
      for l:=1 step 1 until wordvarlength do
      for j:=2 step -1 until 0 do
      outchar(out,(bintree(l,ptr) shift (-8*j)) extract 8 );
    end proc unpack;
 
<*
 
    procedure dump;
    begin write(out,nl,1,<: bintree :>,nl,2);
      for i:=1 step 1 until treeindex do
      begin
        unpack(i); write(out,nl,1);
        for j:=4 step 1 until bintreelimit1 do
        write(out,<<ddddddd>,bintree(j,i),nl,1);
        write(out,nl,1);
      end;
    end proc dump;
  
*>

    procedure writeinf(ptr);
    value ptr; integer ptr;
    begin
      if linecount>= 40 then
      begin newpage; linecount:=1;
      end else linecount:=linecount+1;
      write(out,nl,1,sp,2);
      unpack(ptr);
      write(out,sp,15-wordvarlength*3);
      i:=bintree(wordvarlength+3,ptr);
      j:=bintree(wordvarlength+4,ptr);
      for k:=1 step 1 until j do
      begin
        write(out,<<dddddd>,lineno(i,k));
        if k mod 11 = 0 then
        begin
          if linecount >= 40 then
          begin newpage; linecount:=1
          end
         else
          begin linecount := linecount+1;
            write(out,nl,1,sp,17);
          end;
        end;
      end
    end proc writeinf;


  <*  main  program  *>
  tail(1):=42; tail(2):=1;
  for i:=3 step 1 until 10 do tail(i):=0;
  open(outfile,4,<::>,0);
  monitor(40) create entry :(outfile,0,tail);
  nl := false add 10;
  sp := false add 32;
  em := false ;
  sort;
  readitem;
  for i:=1 step 1 until itemlength do readchar(outfile,routine(i));
  if itemlength<variablelength then
  for i:=itemlength+1 step 1 until variablelength do routine(i):=32;
  for i:=i while -, em do
  begin
    treeindex := page := 0;
    linecount := 1;
    for i := 1 step 1 until bintreelimit2 do
    for j := 1 step 1 until bintreelimit1  do
      bintree(j,i):= 0;

    <* insert name in root *>
    readitem;
    if line=0 then goto outp;
    treeindex:=treeindex+1;
    bintree(wordvarlength+3,treeindex):=treeindex;
    bintree(wordvarlength+4,treeindex):=1;
    lineno(treeindex,1):=line;
    insertname(1);

    for i:= i while  i=i do
    begin
      readitem;
      if (line=0) or line=-1 then goto outp;
      insert(1);
    end;
    <* now a routine of the input file has been read,
       the output has to be produced
    *>
  outp :
    newpage;
    inorder(1);
    if line<>0 then
    begin
      for i:=1 step 1 until itemlength do readchar(outfile,routine(i));
      if itemlength<variablelength then
      for i:=itemlength+1 step 1 until variablelength do routine(i):=32;
    end;
  end;
  exit :
monitor(48) remove entry:(outfile, 0, item);
monitor(48) remove entry:(in, 0, item);
end 
end

▶EOF◀