first version
[samba.git] / source4 / build / pidl / util.pm
1 ###################################################
2 # utility functions to support pidl
3 # Copyright tridge@samba.org 2000
4 # released under the GNU GPL
5 package util;
6
7 use Data::Dumper;
8
9
10 #####################################################################
11 # flatten an array of arrays into a single array
12 sub FlattenArray($) 
13
14     my $a = shift;
15     my @b;
16     for my $d (@{$a}) {
17         for my $d1 (@{$d}) {
18             push(@b, $d1);
19         }
20     }
21     return \@b;
22 }
23
24 #####################################################################
25 # flatten an array of hashes into a single hash
26 sub FlattenHash($) 
27
28     my $a = shift;
29     my %b;
30     for my $d (@{$a}) {
31         for my $k (%{$d}) {
32             $b{$k} = $d->{$k};
33         }
34     }
35     return \%b;
36 }
37
38
39 #####################################################################
40 # traverse a perl data structure removing any empty arrays or
41 # hashes and any hash elements that map to undef
42 sub CleanData($)
43 {
44     sub CleanData($);
45     my($v) = shift;
46     if (ref($v) eq "ARRAY") {
47         foreach my $i (0 .. $#{$v}) {
48             CleanData($v->[$i]);
49             if (ref($v->[$i]) eq "ARRAY" && $#{$v->[$i]}==-1) { delete($v->[$i]); next; }
50         }
51         # this removes any undefined elements from the array
52         @{$v} = grep { defined $_ } @{$v};
53     } elsif (ref($v) eq "HASH") {
54         foreach my $x (keys %{$v}) {
55             CleanData($v->{$x});
56             if (!defined $v->{$x}) { delete($v->{$x}); next; }
57             if (ref($v->{$x}) eq "ARRAY" && $#{$v->{$x}}==-1) { delete($v->{$x}); next; }
58         }
59     }
60 }
61
62
63 #####################################################################
64 # return the modification time of a file
65 sub FileModtime($)
66 {
67     my($filename) = shift;
68     return (stat($filename))[9];
69 }
70
71
72 #####################################################################
73 # read a file into a string
74 sub FileLoad($)
75 {
76     my($filename) = shift;
77     local(*INPUTFILE);
78     open(INPUTFILE, $filename) || die "can't open $filename";    
79     my($saved_delim) = $/;
80     undef $/;
81     my($data) = <INPUTFILE>;
82     close(INPUTFILE);
83     $/ = $saved_delim;
84     return $data;
85 }
86
87 #####################################################################
88 # write a string into a file
89 sub FileSave($$)
90 {
91     my($filename) = shift;
92     my($v) = shift;
93     local(*FILE);
94     open(FILE, ">$filename") || die "can't open $filename";    
95     print FILE $v;
96     close(FILE);
97 }
98
99 #####################################################################
100 # return a filename with a changed extension
101 sub ChangeExtension($$)
102 {
103     my($fname) = shift;
104     my($ext) = shift;
105     if ($fname =~ /^(.*?)\.(.*?)$/) {
106         return "$1.$ext";
107     }
108     return "$fname.$ext";
109 }
110
111 #####################################################################
112 # save a data structure into a file
113 sub SaveStructure($$)
114 {
115     my($filename) = shift;
116     my($v) = shift;
117     FileSave($filename, Dumper($v));
118 }
119
120 #####################################################################
121 # load a data structure from a file (as saved with SaveStructure)
122 sub LoadStructure($)
123 {
124     return eval FileLoad(shift);
125 }
126
127
128 1;