";
}
sub createFile {
- my $configFileName = $_[0];
+ my $configFileName = $_[0];
- my $specFileName = $_[1]; #config file is based on this specification!
- my $configFile = $confDir . "/" . $configFileName;
- my $specFile = $specDir . "/" . $specFileName;
+ my $specFileName = $_[1]; #config file is based on this specification!
+ my $configFile = $confDir . "/" . $configFileName;
+ my $specFile = $specDir . "/" . $specFileName;
- my $configTree = XML::LibXML->createDocument;
- my $specTree = $parser->parse_file($specFile);
+ my $configTree = XML::LibXML->createDocument;
+ my $specTree = $parser->parse_file($specFile);
- my $configMaps = $configTree->createElementNS( "", "MAPS" );
- $configTree->setDocumentElement($configMaps);
+ my $configMaps = $configTree->createElementNS( "", "MAPS" );
+ $configTree->setDocumentElement($configMaps);
- my $specMaps = $specTree->findnodes("/MAPS")->shift();
+ my $specMaps = $specTree->findnodes("/MAPS")->shift();
- my $mapsType = $specMaps->findvalue("./\@type");
+ my $mapsType = $specMaps->findvalue("./\@type");
- $configMaps->setAttribute( "type", $mapsType );
- $configMaps->setAttribute( "specDbFile", $specFileName );
-
- open( SCHREIBEN, "> $configFile" )
- or print "could not open file $configFile for writing: $!\n";
-
- print SCHREIBEN $configTree->toString();
- close SCHREIBEN;
-
-}
-
-sub print_ancestorInfo {
- print "
";
-
- #print "my ancestry: ";
- print "
";
-
- #print "
";
- if (@ancestryList)
- { # if ancestry is not empty, print current ancestry as a nested table
- # and also a button that can unlink the heritage
-
- my $tableNestingDepth = @ancestryList;
- for my $ancestor ( reverse(@ancestryList) ) {
- print "
";
- print "
";
- }
- for my $ancestor (@ancestryList) {
-
- print "
specification file \"$specFileName\" could not be found in the specification directory \"$specDir\"
";
- exit;
- }
- $specTree = $parser->parse_file($specFile);
+ exit;
+ }
+ $specTree = $parser->parse_file($specFile);
}
sub parseConfig {
- $configFileName = $_[0];
- $configFile = $confDir . "/" . $_[0];
- $configTree = $parser->parse_file($configFile);
- $configMapsType = $configTree->findvalue("/MAPS/\@type");
+ $configFileName = $_[0];
+ $configFile = $confDir . "/" . $_[0];
+ $configTree = $parser->parse_file($configFile);
+ $configMapsType = $configTree->findvalue("/MAPS/\@type");
}
sub buildAncestry { # recursive
- my $xmlfileName = $_[0];
- my $parentXmlFileName = $_[1];
- if ( $xmlfileName eq "" ) {
- return;
- }
+ my $xmlfileName = $_[0];
+ my $parentXmlFileName = $_[1];
+ if ( $xmlfileName eq "" ) {
+ return;
+ }
- # check if you are not including yourself
- if ( $parentXmlFileName eq $xmlfileName ) {
- print "
It's a bad idea to try to include yourself!
";
- print "
The faulty include directive was removed.
";
- print "";
- changeAncestor(""); # break the evil circle where it was closed!
- exit;
- }
+ # check if you are not including yourself
+ if ( $parentXmlFileName eq $xmlfileName ) {
+ print "
It's a bad idea to try to include yourself!
";
+ print "
The faulty include directive was removed.
";
+ print "";
+ changeAncestor(""); # break the evil circle where it was closed!
+ exit;
+ }
- # check against circular dependencies
- for (@ancestryList) { # suppres circular dependencies!
- if ( $xmlfileName eq $_ ) {
-
- print "
";
+}
+
+sub print_registers {
+ my $xmlfile = $_[0];
+ my $xmltree;
+ if ( $xmlfile eq $configFile ) {
+ $xmltree = $configTree;
+ }
+ elsif ( $xmlfile eq $specFile ) {
+ $xmltree = $specTree;
+ }
+ else {
+ die "xmlfile given to sub print_registers is unknown";
+ }
+ my @registers = sort by_name $xmltree->findnodes("/MAPS/register");
+ print "
";
+ for my $register (@registers) {
+
+ my $registerName = $register->findvalue("./\@name");
+ my $registerId = $register->findvalue("./\@id");
+ my $registerSize = $register->findvalue("./\@size");
+ my $registerDescr = prepare_text(
+ $specTree->findvalue(
+ "/MAPS/register[\@name='" . $registerName . "']/description"
+ )
+ || "n/a"
+ );
+
+ my $flistid = $xmlfile . "//" . $registerName;
+
+ print "
";
+
+ print < +
+EOF
+ print "
$registerName
";
+
+ #print "
$registerId
";
+
+ if ( $xmlfile eq $configFile ) { # we are printing the Specifications Tree
+ print < X
+EOF
+ }
+ if ( $xmlfile eq $specFile ) { # we are printing the Settings Tree
+
+ print < →
+EOF
+ }
+
+ print "
";
+ if (@ancestryList)
+ { # if ancestry is not empty, print current ancestry as a nested table
+ # and also a button that can unlink the heritage
+
+ my $tableNestingDepth = @ancestryList;
+ for my $ancestor ( reverse(@ancestryList) ) {
+ print "
";
+ print "
";
+ }
+ for my $ancestor (@ancestryList) {
+
+ print "
$ancestor
";
+ print "";
+ print
+"
";
+ if ( $fileLevelHash{$ancestor} eq "1" ) {
+ print < X
+EOF
+
+ }
+ print "
";
+}
+
+
+
+###############################
+## general xml tools
+###############################
+
+
+sub mergeTrees
+{ # give me two trees, tree1 overwrites everything in tree0 and will consequently be integrated in tree0
+ my $tree0 = $_[0];
+ my $tree1 = $_[1];
+
+ my $maps0 = $tree0->findnodes("/MAPS")->shift();
+ my $maps1 = $tree1->findnodes("/MAPS")->shift();
+
+ my @registers0 = $tree0->findnodes("/MAPS/register");
+ my @registers1 = $tree1->findnodes("/MAPS/register");
+
+ for my $register1 (@registers1) {
+ my $registerName = $register1->findvalue("./\@name");
+ if ( $registerName eq "" ) {
+ die "registerName in tree1 undefined!";
+ }
+
+ # if current register does not exist in tree0, create it
+ my $register0 =
+ $maps0->findnodes( "./register[\@name='" . $registerName . "']" )
+ ->shift();
+ if ( $register0 eq "" ) {
+ $register0 = $maps0->addNewChild( "", "register" );
+ $register0->setAttribute( "name", $registerName );
+ }
+
+ my @fields1 = $register1->findnodes("./field");
+ for my $field1 (@fields1) {
+ my $fieldName = $field1->findvalue("./\@name");
+
+ # if field with same name exists in tree0/register0 delete it!
+ my $field0 =
+ $register0->findnodes( "./field[\@name='" . $fieldName . "']" )
+ ->shift();
+ unless ( $field0 eq "" ) {
+ $register0->removeChild($field0);
+ }
+
+ # copy current field from tree1/register1 to tree0/register0
+
+ $register0->addChild($field1);
+ }
+
+ }
+}
+
+
sub changeAncestor {
- my $ancestorFileName = $_[0];
- my $xmltree = $configTree;
- my $xmlfile = $configFile;
- my $maps = $xmltree->findnodes("/MAPS")->shift();
+ my $ancestorFileName = $_[0];
+ my $xmltree = $configTree;
+ my $xmlfile = $configFile;
+ my $maps = $xmltree->findnodes("/MAPS")->shift();
- $maps->setAttribute( "inheritSettingsFrom", $ancestorFileName );
+ $maps->setAttribute( "inheritSettingsFrom", $ancestorFileName );
- open( SCHREIBEN, "> $xmlfile" )
- or print "could not open file $xmlfile for writing: $!\n";
+ open( SCHREIBEN, "> $xmlfile" )
+ or print "could not open file $xmlfile for writing: $!\n";
- print SCHREIBEN $xmltree->toString();
- close SCHREIBEN;
+ print SCHREIBEN $xmltree->toString();
+ close SCHREIBEN;
}
sub getAncestor {
- my $xmltree = $configTree;
- return ( $xmltree->findvalue("/MAPS/\@inheritSettingsFrom") || "" );
+ my $xmltree = $configTree;
+ return ( $xmltree->findvalue("/MAPS/\@inheritSettingsFrom") || "" );
}
+
+
+###############################
+## misc utilities
+###############################
+
+
+sub prepare_text {
+ my $t = $_[0];
+ chomp $t;
+ $t = encode_entities($t);
+ $t =~ s/^\s//;
+ $t =~ s/^\n//;
+ $t =~ s/\t//;
+ return $t;
+}
+
+
+
sub save {
my $registerName = $_[0];
@@ -746,170 +942,6 @@ sub printHash {
-sub print_registers {
- my $xmlfile = $_[0];
- my $xmltree;
- if ( $xmlfile eq $configFile ) {
- $xmltree = $configTree;
- }
- elsif ( $xmlfile eq $specFile ) {
- $xmltree = $specTree;
- }
- else {
- die "xmlfile given to sub print_registers is unknown";
- }
- my @registers = sort by_name $xmltree->findnodes("/MAPS/register");
- print "
";
- for my $register (@registers) {
-
- my $registerName = $register->findvalue("./\@name");
- my $registerId = $register->findvalue("./\@id");
- my $registerSize = $register->findvalue("./\@size");
- my $registerDescr = prepare_text(
- $specTree->findvalue(
- "/MAPS/register[\@name='" . $registerName . "']/description"
- )
- || "n/a"
- );
-
- my $flistid = $xmlfile . "//" . $registerName;
-
- print "
";
-
- print < +
-EOF
- print "
$registerName
";
-
- #print "
$registerId
";
-
- if ( $xmlfile eq $configFile ) { # we are printing the Specifications Tree
- print < X
-EOF
- }
- if ( $xmlfile eq $specFile ) { # we are printing the Settings Tree
-
- print < →
-EOF
- }
-
- print "