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