1 ###################################################
2 # utility functions to support pidl
3 # Copyright tridge@samba.org 2000
4 # released under the GNU GPL
7 #####################################################################
8 # load a data structure from a file (as saved with SaveStructure)
12 my $contents = FileLoad
($f);
13 defined $contents || return undef;
14 return eval "$contents";
19 #####################################################################
20 # flatten an array of arrays into a single array
33 #####################################################################
34 # flatten an array of arrays into a single array
47 #####################################################################
48 # flatten an array of hashes into a single hash
54 for my $k (keys %{$d}) {
61 #####################################################################
62 # traverse a perl data structure removing any empty arrays or
63 # hashes and any hash elements that map to undef
68 if (ref($v) eq "ARRAY") {
69 foreach my $i (0 .. $#{$v}) {
71 if (ref($v->[$i]) eq "ARRAY" && $#{$v->[$i]}==-1) {
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}) {
81 if (!defined $v->{$x}) { delete($v->{$x}); next; }
82 if (ref($v->{$x}) eq "ARRAY" && $#{$v->{$x}}==-1) { delete($v->{$x}); next; }
88 #####################################################################
89 # return the modification time of a file
92 my($filename) = shift;
93 return (stat($filename))[9];
96 #####################################################################
97 # read a file into a string
100 my($filename) = shift;
102 open(INPUTFILE
, $filename) || return undef;
103 my($saved_delim) = $/;
105 my($data) = <INPUTFILE
>;
111 #####################################################################
112 # write a string into a file
115 my($filename) = shift;
118 open(FILE
, ">$filename") || die "can't open $filename";
123 #####################################################################
124 # return a filename with a changed extension
125 sub ChangeExtension
($$)
129 if ($fname =~ /^(.*)\.(.*?)$/) {
135 #####################################################################
136 # a dumper wrapper to prevent dependence on the Data::Dumper module
137 # unless we actually need it
140 require Data
::Dumper
;
142 return Data
::Dumper
::Dumper
($s);
145 #####################################################################
146 # save a data structure into a file
147 sub SaveStructure
($$)
149 my($filename) = shift;
151 FileSave
($filename, MyDumper
($v));
154 #####################################################################
155 # see if a pidl property list contains a given property
161 if (!defined $e->{PROPERTIES
}) {
165 return $e->{PROPERTIES
}->{$p};
168 #####################################################################
169 # see if a pidl property matches a value
170 sub property_matches
($$$)
176 if (!defined has_property
($e, $p)) {
180 if ($e->{PROPERTIES
}->{$p} =~ /$v/) {
187 # return 1 if the string is a C constant
191 if (defined $s && $s =~ /^\d/) {
197 # return a "" quoted string, unless already quoted
201 if (substr($str, 0, 1) eq "\"") {
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;
215 return $useUintEnums;
220 my($expr,$varlist) = @_;
222 die("Undefined value in ParseExpr") if not defined($expr);
224 my @tokens = split /((?:[A-Za-z_])(?:(?:(?:[A-Za-z0-9_.])|(?:->))+))/, $expr;
227 foreach my $t (@tokens) {
228 if (defined($varlist->{$t})) {
229 $ret .= $varlist->{$t};