next up previous contents
Next: Listings zum Subagenten Up: Listings zum Skript LinkTest Previous: Listing von LinkTest.FehlerList

Listing von LinkTest.BaumErstellen

#!/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";
                }
        }



Copyright Munich Network Management Team