1 ###################################################
2 # Samba4 parser generator for IDL structures
3 # Copyright jelmer@samba.org 2005
4 # released under the GNU GPL
6 package Parse
::Pidl
::Typelist
;
10 @EXPORT_OK = qw(hasType getType resolveType mapTypeName scalar_is_reference expandAlias
11 mapScalarType addType typeIs is_signed is_scalar enum_type_fn
12 bitmap_type_fn mapType typeHasBody
14 use vars
qw($VERSION);
17 use Parse::Pidl::Util qw(has_property);
22 my @reference_scalars = (
23 "string", "string_array", "nbt_string",
24 "wrepl_nbt_name", "ipv4address"
27 # a list of known scalar types
34 "uint16" => "uint16_t",
36 "uint32" => "uint32_t",
37 "hyper" => "uint64_t",
39 "udlong" => "uint64_t",
40 "udlongr" => "uint64_t",
43 "DATA_BLOB" => "DATA_BLOB",
44 "string" => "const char *",
45 "string_array" => "const char **",
48 "NTTIME_1sec" => "NTTIME",
49 "NTTIME_hyper" => "NTTIME",
51 "NTSTATUS" => "NTSTATUS",
52 "COMRESULT" => "COMRESULT",
53 "nbt_string" => "const char *",
54 "wrepl_nbt_name"=> "struct nbt_name *",
55 "ipv4address" => "const char *",
59 "error_status_t" => "uint32",
60 "boolean8" => "uint8",
61 "boolean32" => "uint32",
70 "HRESULT" => "COMRESULT",
77 return $aliases{$name} if defined($aliases{$name});
82 # map from a IDL type to a C header type
87 # it's a bug when a type is not in the list
88 # of known scalars or has no mapping
89 return $scalars{$name} if defined($scalars{$name});
91 die("Unknown scalar type $name");
97 $types{$t->{NAME
}} = $t;
104 if (not hasType
($ctype)) {
105 # assume struct typedef
106 return { TYPE
=> "TYPEDEF", NAME
=> $ctype, DATA
=> { TYPE
=> "STRUCT" } };
108 return getType
($ctype);
117 return ($t) if (ref($t) eq "HASH" and not defined($t->{NAME
}));
118 return undef if not hasType
($t);
119 return $types{$t->{NAME
}} if (ref($t) eq "HASH");
127 if (ref($t) eq "HASH") {
128 return 1 if ($t->{TYPE
} eq $tt);
131 return 1 if (hasType
($t) and getType
($t)->{TYPE
} eq "TYPEDEF" and
132 getType
($t)->{DATA
}->{TYPE
} eq $tt);
139 if (ref($t) eq "HASH") {
140 return 1 if (not defined($t->{NAME
}));
141 return 1 if (defined($types{$t->{NAME
}}) and
142 $types{$t->{NAME
}}->{TYPE
} eq $t->{TYPE
});
145 return 1 if defined($types{$t});
167 return 1 if (ref($type) eq "HASH" and
168 ($type->{TYPE
} eq "SCALAR" or $type->{TYPE
} eq "ENUM" or
169 $type->{TYPE
} eq "BITMAP"));
171 if (my $dt = getType
($type)) {
172 return is_scalar
($dt->{DATA
}) if ($dt->{TYPE
} eq "TYPEDEF");
173 return 1 if ($dt->{TYPE
} eq "SCALAR" or $dt->{TYPE
} eq "ENUM" or
174 $dt->{TYPE
} eq "BITMAP");
180 sub scalar_is_reference
($)
184 return 1 if (grep(/^$name$/, @reference_scalars));
188 sub RegisterScalars
()
190 foreach (keys %scalars) {
194 BASEFILE
=> "<builtin>",
207 $enum->{TYPE
} eq "ENUM" or die("not an enum");
209 # for typedef enum { } we need to check $enum->{PARENT}
210 if (has_property
($enum, "enum8bit")) {
212 } elsif (has_property
($enum, "enum16bit")) {
214 } elsif (has_property
($enum, "v1_enum")) {
216 } elsif (has_property
($enum->{PARENT
}, "enum8bit")) {
218 } elsif (has_property
($enum->{PARENT
}, "enum16bit")) {
220 } elsif (has_property
($enum->{PARENT
}, "v1_enum")) {
226 sub bitmap_type_fn
($)
230 $bitmap->{TYPE
} eq "BITMAP" or die("not a bitmap");
232 if (has_property
($bitmap, "bitmap8bit")) {
234 } elsif (has_property
($bitmap, "bitmap16bit")) {
236 } elsif (has_property
($bitmap, "bitmap64bit")) {
247 if ($e->{TYPE
} eq "TYPEDEF") {
248 return 0 unless(defined($e->{DATA
}));
249 return typeHasBody
($e->{DATA
});
252 return defined($e->{ELEMENTS
});
260 return mapType
($t->{DATA
}, $n) if ($t->{TYPE
} eq "TYPEDEF");
261 return mapScalarType
($n) if ($t->{TYPE
} eq "SCALAR");
262 return "enum $n" if ($t->{TYPE
} eq "ENUM");
263 return "struct $n" if ($t->{TYPE
} eq "STRUCT" or $t->{TYPE
} eq "INTERFACE");
264 return "union $n" if ($t->{TYPE
} eq "UNION");
265 return mapScalarType
(bitmap_type_fn
($t)) if ($t->{TYPE
} eq "BITMAP");
266 die("Unknown type $t->{TYPE}");
272 return "void" unless defined($t);
274 $t = expandAlias
($t);
276 unless ($dt or ($dt = getType
($t))) {
281 return mapType
($dt, $dt->{NAME
});
287 my $basename = shift;
289 foreach my $x (@
{$idl}) {
290 next if $x->{TYPE
} ne "INTERFACE";
292 # DCOM interfaces can be types as well
297 BASEFILE
=> $basename,
298 }) if (has_property
($x, "object"));
300 foreach my $y (@
{$x->{DATA
}}) {
301 if ($y->{TYPE
} eq "TYPEDEF"
302 or $y->{TYPE
} eq "UNION"
303 or $y->{TYPE
} eq "STRUCT"
304 or $y->{TYPE
} eq "ENUM"
305 or $y->{TYPE
} eq "BITMAP") {
306 $y->{BASEFILE
} = $basename;
313 sub GenerateTypeLib
()
315 return Parse
::Pidl
::Util
::MyDumper
(\
%types);