iterative fibonacci
[libfirm] / ir / be / test / diffreports.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use XML::Simple;
5 use Data::Dumper;
6
7 my $old_file  = $ARGV[0];
8 my $new_file  = $ARGV[1];
9 my $diff_file = "results_diff.xml";
10
11 $| = 1; # perform flush after each write to STDOUT
12
13 print "reading $old_file ... ";
14 my $start = time;
15 my $res_old = XMLin("$old_file", forcearray => 1);
16 print "done (", time - $start," s)\n";
17
18 print "reading $new_file ... ";
19 $start = time;
20 my $res_new = XMLin("$new_file", forcearray => 1);
21 print "done (", time - $start," s)\n";
22
23 open(DIFF, ">$diff_file") or die "Could not open $diff_file, reason:$!\n";
24
25 print DIFF "<?xml version=\"1.0\"?>\n";
26 print DIFF "<results>\n";
27 print DIFF "    <files>\n";
28 print DIFF "        <OLD>$old_file</OLD>\n";
29 print DIFF "        <NEW>$new_file</NEW>\n";
30 print DIFF "    </files>\n";
31
32 if (! exists($res_old->{"environment"})) {
33         print "environment missing in $old_file!\n";
34 }
35 elsif (! exists($res_new->{"environment"})) {
36         print "environment missing in $new_file!\n";
37 }
38 else {
39         print DIFF "    <environment>\n";
40         print DIFF "        <OLD>\n";
41
42         my %env = %{ @{ $res_old->{"environment"} }[0] };
43
44         foreach (keys(%env)) {
45                 print DIFF "            <$_>", @{ $env{"$_"} }[0], "</$_>\n";
46         }
47         print DIFF "        </OLD>\n";
48         print DIFF "        <NEW>\n";
49
50         %env = %{ @{ $res_new->{"environment"} }[0] };
51
52         foreach (keys(%env)) {
53                 print DIFF "            <$_>", @{ $env{"$_"} }[0], "</$_>\n";
54         }
55         print DIFF "        </NEW>\n";
56         print DIFF "    </environment>\n";
57 }
58
59 my $section_old = $res_old->{"section"};
60 my $section_new = $res_new->{"section"};
61
62 foreach (keys(%{ $section_old })) {
63         if (! exists($section_new->{"$_"})) {
64                 print "Section $_ missing in $new_file!\n";
65                 next;
66         }
67
68         print DIFF "    <section name=\"$_\">\n";
69
70         my $old = $section_old->{"$_"}{"result"};
71         my $new = $section_new->{"$_"}{"result"};
72
73         foreach my $test (keys(%{ $old })) {
74                 my $entry_old = $old->{"$test"};
75                 my $entry_new = $new->{"$test"};
76                 my $has_diff = 0;
77
78                 if (! exists($new->{"$test"})) {
79                         foreach my $k1 (keys(%{ $entry_old })) {
80                                 $entry_new->{"$k1"} = [ 'missing' ];
81                                 $has_diff           = 1;
82                         }
83                 }
84                 else {
85                         foreach my $k (keys(%{ $entry_old })) {
86                                 if (! exists($entry_new->{"$k"})) {
87                                     $entry_new->{"$k"} = [ 'missing' ];
88                                         $has_diff = 1;
89                                 }
90                                 else {
91                                         my @val_old = @{ $entry_old->{"$k"} };
92                                         my @val_new = @{ $entry_new->{"$k"} };
93                                         if ($val_old[0] ne $val_new[0]) {
94                                                 $has_diff = 1;
95                                         }
96                                 }
97                         }
98                 }
99
100                 if ($has_diff == 1) {
101                         print DIFF "        <result name=\"$test\">\n";
102                         print DIFF "            <OLD>\n";
103                         emit_entry($entry_old);
104                         print DIFF "            </OLD>\n";
105                         print DIFF "            <NEW>\n";
106                         emit_entry($entry_new);
107                         print DIFF "            </NEW>\n";
108                         print DIFF "        </result>\n";
109                 }
110         }
111
112         print DIFF "    </section>\n";
113 }
114
115 print DIFF "</results>\n";
116
117 close(DIFF);
118
119 sub emit_entry {
120         my $href = shift;
121
122         foreach (keys(%{ $href })) {
123                 my @val = @{ $href->{"$_"} };
124                 print DIFF "                <$_>", $val[0], "</$_>\n";
125         }
126 }