1 ###################################################
2 # Samba4 parser generator for IDL structures
3 # Copyright jelmer@samba.org 2005
4 # released under the GNU GPL
12 # a list of known scalar types
44 "uint16" => { C_TYPE => "uint16_t",
55 "uint32" => { C_TYPE => "uint32_t",
84 C_TYPE => "DATA_BLOB",
91 C_TYPE => "const char *",
96 C_TYPE => "const char **",
131 C_TYPE => "NTSTATUS",
138 C_TYPE => "const char *",
143 C_TYPE => "const char *",
149 # map from a IDL type to a C header type
154 # it's a bug when a type is not in the list
155 # of known scalars or has no mapping
156 return $typedefs{$name}->{DATA}->{C_TYPE} if defined($typedefs{$name}) and defined($typedefs{$name}->{DATA}->{C_TYPE});
158 die("Unknown scalar type $name");
161 sub getScalarAlignment($)
165 # it's a bug when a type is not in the list
166 # of known scalars or has no mapping
167 return $scalars->{$name}{NDR_ALIGN} if defined($scalars->{$name}) and defined($scalars->{$name}{NDR_ALIGN});
169 die("Unknown scalar type $name");
175 $typedefs{$t->{NAME}} = $t;
181 return undef if not hasType($t);
182 return $typedefs{$t};
190 return 1 if (hasType($t) and getType($t)->{DATA}->{TYPE} eq $tt);
197 return 1 if defined($typedefs{$t});
205 return 0 unless(hasType($type));
207 if (my $dt = getType($type)->{DATA}->{TYPE}) {
208 return 1 if ($dt eq "SCALAR" or $dt eq "ENUM" or $dt eq "BITMAP");
214 sub scalar_is_reference($)
218 return $scalars->{$name}{IS_REFERENCE} if defined($scalars->{$name}) and defined($scalars->{$name}{IS_REFERENCE});
222 sub RegisterScalars()
224 foreach my $k (keys %{$scalars}) {
228 DATA => $scalars->{$k}
230 $typedefs{$k}->{DATA}->{TYPE} = "SCALAR";
231 $typedefs{$k}->{DATA}->{NAME} = $k;
245 sub RegisterAliases()
247 foreach my $k (keys %{$aliases}) {
248 $typedefs{$k} = $typedefs{$aliases->{$k}};
255 if (util::has_property($enum->{PARENT}, "enum8bit")) {
257 } elsif (util::has_property($enum->{PARENT}, "v1_enum")) {
263 sub bitmap_type_fn($)
267 if (util::has_property($bitmap, "bitmap8bit")) {
269 } elsif (util::has_property($bitmap, "bitmap16bit")) {
271 } elsif (util::has_property($bitmap, "bitmap64bit")) {
280 die("Undef passed to mapType") unless defined($t);
283 unless ($dt or ($dt = getType($t))) {
287 return mapScalarType($t) if ($dt->{DATA}->{TYPE} eq "SCALAR");
288 return "enum $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "ENUM");
289 return "struct $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "STRUCT");
290 return "struct $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "INTERFACE");
291 return "union $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "UNION");
293 if ($dt->{DATA}->{TYPE} eq "BITMAP") {
294 return mapScalarType(bitmap_type_fn($dt->{DATA}));
297 die("Unknown type $dt->{DATA}->{TYPE}");
304 foreach my $x (@{$idl}) {
305 next if $x->{TYPE} ne "INTERFACE";
307 # DCOM interfaces can be types as well
312 }) if (util::has_property($x, "object"));
314 foreach my $y (@{$x->{DATA}}) {
316 $y->{TYPE} eq "TYPEDEF"
317 or $y->{TYPE} eq "DECLARE");