|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 9984 (0x2700)
Types: TextFile
Names: »crossref4tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »crossref4tx «
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◀