################################################### # utility functions to support pidl # Copyright tridge@samba.org 2000 # released under the GNU GPL package util; use Data::Dumper; ##################################################################### # flatten an array of arrays into a single array sub FlattenArray($) { my $a = shift; my @b; for my $d (@{$a}) { for my $d1 (@{$d}) { push(@b, $d1); } } return \@b; } ##################################################################### # flatten an array of hashes into a single hash sub FlattenHash($) { my $a = shift; my %b; for my $d (@{$a}) { for my $k (keys %{$d}) { $b{$k} = $d->{$k}; } } return \%b; } ##################################################################### # traverse a perl data structure removing any empty arrays or # hashes and any hash elements that map to undef sub CleanData($) { sub CleanData($); my($v) = shift; if (ref($v) eq "ARRAY") { foreach my $i (0 .. $#{$v}) { CleanData($v->[$i]); if (ref($v->[$i]) eq "ARRAY" && $#{$v->[$i]}==-1) { delete($v->[$i]); next; } } # this removes any undefined elements from the array @{$v} = grep { defined $_ } @{$v}; } elsif (ref($v) eq "HASH") { foreach my $x (keys %{$v}) { CleanData($v->{$x}); if (!defined $v->{$x}) { delete($v->{$x}); next; } if (ref($v->{$x}) eq "ARRAY" && $#{$v->{$x}}==-1) { delete($v->{$x}); next; } } } } ##################################################################### # return the modification time of a file sub FileModtime($) { my($filename) = shift; return (stat($filename))[9]; } ##################################################################### # read a file into a string sub FileLoad($) { my($filename) = shift; local(*INPUTFILE); open(INPUTFILE, $filename) || die "can't open $filename"; my($saved_delim) = $/; undef $/; my($data) = ; close(INPUTFILE); $/ = $saved_delim; return $data; } ##################################################################### # write a string into a file sub FileSave($$) { my($filename) = shift; my($v) = shift; local(*FILE); open(FILE, ">$filename") || die "can't open $filename"; print FILE $v; close(FILE); } ##################################################################### # return a filename with a changed extension sub ChangeExtension($$) { my($fname) = shift; my($ext) = shift; if ($fname =~ /^(.*)\.(.*?)$/) { return "$1.$ext"; } return "$fname.$ext"; } ##################################################################### # save a data structure into a file sub SaveStructure($$) { my($filename) = shift; my($v) = shift; FileSave($filename, Dumper($v)); } ##################################################################### # load a data structure from a file (as saved with SaveStructure) sub LoadStructure($) { return eval FileLoad(shift); } 1;