You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by do...@apache.org on 2001/06/28 19:31:53 UTC
cvs commit: modperl-2.0/lib/Apache ParseSource.pm
dougm 01/06/28 10:31:53
Modified: lib/Apache ParseSource.pm
Log:
sort data structures (patch from stas, slightly modified)
Revision Changes Path
1.18 +46 -2 modperl-2.0/lib/Apache/ParseSource.pm
Index: ParseSource.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/Apache/ParseSource.pm,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- ParseSource.pm 2001/05/03 22:23:53 1.17
+++ ParseSource.pm 2001/06/28 17:31:47 1.18
@@ -2,6 +2,7 @@
use strict;
use Apache::Build ();
+use Tie::IxHash ();
use Config ();
our $VERSION = '0.02';
@@ -313,7 +314,9 @@
push @functions, $func;
}
- $self->{$key} = \@functions;
+ # sort the functions by the 'name' attribute to ensure a
+ # consistent output on different systems.
+ $self->{$key} = [sort { $a->{name} cmp $b->{name} } @functions];
}
sub get_structs {
@@ -356,7 +359,9 @@
push @structures, $struct;
}
- $self->{$key} = \@structures;
+ # sort the structs by the 'type' attribute to ensure a consistent
+ # output on different systems.
+ $self->{$key} = [sort { $a->{type} cmp $b->{type} } @structures];
}
sub write_functions_pm {
@@ -398,6 +403,9 @@
open my $pm, '>', $file or die "open $file: $!";
+ # sort the hashes (including nested ones) for a consistent dump
+ canonsort(\$data);
+
my $dump = Data::Dumper->new([$data],
[$name])->Dump;
@@ -419,6 +427,42 @@
1;
EOF
close $pm;
+}
+
+# canonsort(\$data);
+# sort nested hashes in the data structure.
+# the data structure itself gets modified
+
+sub canonsort {
+ my $ref = shift;
+ my $type = ref $$ref;
+
+ return unless $type;
+
+ my $data = $$ref;
+
+ if ($type eq 'ARRAY') {
+ for (@$data) {
+ canonsort(\$_);
+ }
+ }
+ elsif ($type eq 'HASH') {
+ for (keys %$data) {
+ canonsort(\$data->{$_});
+ }
+
+ tie my %ixhash, 'Tie::IxHash';
+
+ # reverse sort so we get the order of:
+ # return_type, name, args { type, name } for functions
+ # type, elts { type, name } for structures
+
+ for (sort { $b cmp $a } keys %$data) {
+ $ixhash{$_} = $data->{$_};
+ }
+
+ $$ref = \%ixhash;
+ }
}
1;