r7424: add --uint-enums option to pidl to generate
[Samba/aatanasov.git] / source / build / pidl / util.pm
blob26c940c02ada8422db9e5014be5a1e6d5e98028b
1 ###################################################
2 # utility functions to support pidl
3 # Copyright tridge@samba.org 2000
4 # released under the GNU GPL
5 package util;
7 #####################################################################
8 # load a data structure from a file (as saved with SaveStructure)
9 sub LoadStructure($)
11 my $f = shift;
12 my $contents = FileLoad($f);
13 defined $contents || return undef;
14 return eval "$contents";
17 use strict;
19 #####################################################################
20 # flatten an array of arrays into a single array
21 sub FlattenArray2($)
23 my $a = shift;
24 my @b;
25 for my $d (@{$a}) {
26 for my $d1 (@{$d}) {
27 push(@b, $d1);
30 return \@b;
33 #####################################################################
34 # flatten an array of arrays into a single array
35 sub FlattenArray($)
37 my $a = shift;
38 my @b;
39 for my $d (@{$a}) {
40 for my $d1 (@{$d}) {
41 push(@b, $d1);
44 return \@b;
47 #####################################################################
48 # flatten an array of hashes into a single hash
49 sub FlattenHash($)
51 my $a = shift;
52 my %b;
53 for my $d (@{$a}) {
54 for my $k (keys %{$d}) {
55 $b{$k} = $d->{$k};
58 return \%b;
61 #####################################################################
62 # traverse a perl data structure removing any empty arrays or
63 # hashes and any hash elements that map to undef
64 sub CleanData($)
66 sub CleanData($);
67 my($v) = shift;
68 if (ref($v) eq "ARRAY") {
69 foreach my $i (0 .. $#{$v}) {
70 CleanData($v->[$i]);
71 if (ref($v->[$i]) eq "ARRAY" && $#{$v->[$i]}==-1) {
72 $v->[$i] = undef;
73 next;
76 # this removes any undefined elements from the array
77 @{$v} = grep { defined $_ } @{$v};
78 } elsif (ref($v) eq "HASH") {
79 foreach my $x (keys %{$v}) {
80 CleanData($v->{$x});
81 if (!defined $v->{$x}) { delete($v->{$x}); next; }
82 if (ref($v->{$x}) eq "ARRAY" && $#{$v->{$x}}==-1) { delete($v->{$x}); next; }
85 return $v;
88 #####################################################################
89 # return the modification time of a file
90 sub FileModtime($)
92 my($filename) = shift;
93 return (stat($filename))[9];
96 #####################################################################
97 # read a file into a string
98 sub FileLoad($)
100 my($filename) = shift;
101 local(*INPUTFILE);
102 open(INPUTFILE, $filename) || return undef;
103 my($saved_delim) = $/;
104 undef $/;
105 my($data) = <INPUTFILE>;
106 close(INPUTFILE);
107 $/ = $saved_delim;
108 return $data;
111 #####################################################################
112 # write a string into a file
113 sub FileSave($$)
115 my($filename) = shift;
116 my($v) = shift;
117 local(*FILE);
118 open(FILE, ">$filename") || die "can't open $filename";
119 print FILE $v;
120 close(FILE);
123 #####################################################################
124 # return a filename with a changed extension
125 sub ChangeExtension($$)
127 my($fname) = shift;
128 my($ext) = shift;
129 if ($fname =~ /^(.*)\.(.*?)$/) {
130 return "$1$ext";
132 return "$fname$ext";
135 #####################################################################
136 # a dumper wrapper to prevent dependence on the Data::Dumper module
137 # unless we actually need it
138 sub MyDumper($)
140 require Data::Dumper;
141 my $s = shift;
142 return Data::Dumper::Dumper($s);
145 #####################################################################
146 # save a data structure into a file
147 sub SaveStructure($$)
149 my($filename) = shift;
150 my($v) = shift;
151 FileSave($filename, MyDumper($v));
154 #####################################################################
155 # see if a pidl property list contains a given property
156 sub has_property($$)
158 my($e) = shift;
159 my($p) = shift;
161 if (!defined $e->{PROPERTIES}) {
162 return undef;
165 return $e->{PROPERTIES}->{$p};
168 #####################################################################
169 # see if a pidl property matches a value
170 sub property_matches($$$)
172 my($e) = shift;
173 my($p) = shift;
174 my($v) = shift;
176 if (!defined has_property($e, $p)) {
177 return undef;
180 if ($e->{PROPERTIES}->{$p} =~ /$v/) {
181 return 1;
184 return undef;
187 # return 1 if the string is a C constant
188 sub is_constant($)
190 my $s = shift;
191 if (defined $s && $s =~ /^\d/) {
192 return 1;
194 return 0;
197 # return a "" quoted string, unless already quoted
198 sub make_str($)
200 my $str = shift;
201 if (substr($str, 0, 1) eq "\"") {
202 return $str;
204 return "\"" . $str . "\"";
207 # a hack to build on platforms that don't like negative enum values
208 my $useUintEnums = 0;
209 sub setUseUintEnums($)
211 $useUintEnums = shift;
213 sub useUintEnums()
215 return $useUintEnums;