#!/usr/local/dist/bin/perl
######################################################################
# Programm : LinkTest.BaumErstellen
# Parameter : Maximale Zeilenlaenge (Standard: 80 Zeichen)
# Gewuenschte Wurzel (Standard: Wurzel bei Aufruf von LinkTest)
# In diesem Fall muss Zeilenlaenge expl. angeg. werden
# Beschreibung : Erstellt aus den letzten erzeugten Log-Dateien von LinkTest
# einen Baum der Aufrufstruktur. Das Programm setzt in den
# Baum "-->", falls die max. Zeilenlaenge ueberschritten
# wuerde und "-s.o." falls ein Zweig in einen Zyklus
# fuehren wuerde
######################################################################
# Uebernahme der Parameter
if ($ARGV[0])
{
$MaxZeile = $ARGV[0] ;
}
else
{
$MaxZeile = 80;
}
if ($ARGV[1])
{
$Wurzel = $ARGV[1] ;
}
else
{
$Wurzel = undef;
}
# Lokale Groessen
local(%Baum);
# Initialisieren des Log-File-Arrays mit den Standardnamen
$LogDatei[0] = 'f.ERL.LOG';
$LogDatei[1] = 'f.NEU.LOG';
$LogDatei[2] = 'f.ERR.LOG';
####################################################################
# Die Log-Dateien oeffnen, die interne Darstellung herausziehen
# und damit die Variablen belegen
for ($i=0;$i<=2;$i++)
{
if(!open(LOG,$LogDatei[$i]))
{
die "\nKonnte Log-Datei $LogDatei nicht oeffnen!\n";
}
while (<LOG>)
{
if (/^Intern --:/)
{
$Beschreibung = substr($_,11);
($Link,$LinkMethode,$Vaeter) = split(";",$Beschreibung);
&InBaumAufnehmen($Link,$Vaeter);
}
else
{
next;
}
}
close (LOG);
}
$|=1; # Ohne zu puffern ausgeben
if (!$Wurzel) # evtl. mit Standardwert belegen
{
($Marke,$AnzahlSoehne,$Wurzel) = split(/;/,$Baum{"TOP"});
}
&SoehneAusgeben($Wurzel,0);
######################################################################
#
# Unterprogramm InBaumAufnehmen
#
######################################################################
sub InBaumAufnehmen
{
# Uebernahme der Parameter
local($Sohn,$Vaeter) = @_ ;
# Definition von lokalen Variablen
local($Soehne,@Soehne,$Vater,@Vaeter,$AnzahlSoehne,$Marke);
if ( !$Baum{$Sohn} ) # Falls Sohn noch nicht im Baum:
{ # Nimm ihn schon auf
$Baum{$Sohn} = "Frei;0;";# vorbelegt mit 0 Soehnen
}
@Vaeter = split(/\|/,$Vaeter); # Lege Vaeter in Array
foreach $Vater (@Vaeter) # Fuer jeden Vater:
{
$Vater = substr($Vater,0,rindex($Vater,":Z")); # Zeilenzahl entf.
if ( $Baum{$Vater} ) # Falls Vater schon vorhanden:
{ # Haenge neuen Sohn zusaetzlich hin
($Marke,$AnzahlSoehne,$Soehne) = split(/;/,$Baum{$Vater});
$AnzahlSoehne++;
if ($Soehne)
{
$Soehne = join("|",($Soehne,$Sohn));
}
else
{
$Soehne = $Sohn;
}
$Baum{$Vater} = join(";",($Marke,$AnzahlSoehne,$Soehne));
}
else # Erster Sohn zu diesem Vater
{
$Baum{$Vater} = "Frei;1;$Sohn"; # Eintragen:1 Sohn,Name
}
}
}
######################################################################
#
# Unterprogramm SoehneAusgeben
#
######################################################################
sub SoehneAusgeben
{
# Uebernahme der Parameter
local($Vater,$Stelle) = @_;
# Definition von lokalen Variablen
local($Sohn,$Soehne,@Soehne,$AnzahlSoehne,$Marke,$i);
for ($i=0;$i<$Stelle;$i++)
{
print '| ';
}
if (($Stelle*4+length($Vater)) < $MaxZeile)
{
print "$Vater";
$Stelle++;
}
else
{
print "-->\n";
return;
}
($Marke,$AnzahlSoehne,$Soehne) = split(/;/,$Baum{$Vater});
@Soehne = split(/\|/,$Soehne);
if ($Marke eq "Frei")
{
print "\n";
$Marke = "Belegt"; # Zyklus verhindern
$Baum{$Vater} = join(";",($Marke,$AnzahlSoehne,$Soehne));
foreach $Sohn (@Soehne)
{
&SoehneAusgeben($Sohn,$Stelle);
}
$Baum{$Vater} = join(";",($Marke,$AnzahlSoehne,$Soehne));
}
else
{
print "-s.o.\n";
}
}