}
#####################################################################
-# see if a pidl property list contains a give property
+# see if a pidl property list contains a given property
sub has_property($$)
{
my($e) = shift;
my %enum_list;
-sub register_enum($$)
-{
- my $enum = shift;
- my $name = shift;
- $enum_list{$name} = $enum;
-}
-
-sub is_enum($)
-{
- my $name = shift;
- return defined $enum_list{$name}
-}
-
-sub get_enum($)
-{
- my $name = shift;
- return $enum_list{$name};
-}
-
sub enum_type_decl($)
{
my $enum = shift;
my %bitmap_list;
-sub register_bitmap($$)
-{
- my $bitmap = shift;
- my $name = shift;
- $bitmap_list{$name} = $bitmap;
-}
-
-sub is_bitmap($)
-{
- my $name = shift;
- return defined $bitmap_list{$name};
-}
-
-sub get_bitmap($)
-{
- my $name = shift;
- return $bitmap_list{$name};
-}
-
-sub bitmap_type_decl($)
+sub bitmap_type_fn($)
{
my $bitmap = shift;
return "uint32";
}
-sub bitmap_type_fn($)
+sub bitmap_type_decl($)
{
my $bitmap = shift;
- return bitmap_type_decl($bitmap);
-}
-
-sub is_scalar_type($)
-{
- my($type) = shift;
-
- if ($type =~ /^u?int\d+/) {
- return 1;
- }
- if ($type =~ /char|short|long|NTTIME|NTTIME_1sec|
- time_t|error_status_t|boolean32|unsigned32|
- HYPER_T|wchar_t|DATA_BLOB|WERROR/x) {
- return 1;
- }
-
- if (is_enum($type)) {
- return 1;
- }
-
- if (is_bitmap($type)) {
- return 1;
- }
-
- return 0;
+ return map_type(bitmap_type_fn($bitmap));
}
-# return the NDR alignment for a type
-sub type_align($)
-{
- my($e) = shift;
- my $type = $e->{TYPE};
-
- if (need_wire_pointer($e)) {
- return 4;
- }
-
- return 1, if ($type eq "char");
- return 1, if ($type eq "int8");
- return 1, if ($type eq "uint8");
-
- return 2, if ($type eq "short");
- return 2, if ($type eq "wchar_t");
- return 2, if ($type eq "int16");
- return 2, if ($type eq "uint16");
-
- return 4, if ($type eq "long");
- return 4, if ($type eq "int32");
- return 4, if ($type eq "uint32");
-
- return 4, if ($type eq "int64");
- return 4, if ($type eq "uint64");
-
- return 4, if ($type eq "NTTIME");
- return 4, if ($type eq "NTTIME_1sec");
- return 4, if ($type eq "time_t");
-
- return 4, if ($type eq "DATA_BLOB");
-
- return 8, if ($type eq "HYPER_T");
-
- # it must be an external type - all we can do is guess
- return 4;
-}
-
-# this is used to determine if the ndr push/pull functions will need
-# a ndr_flags field to split by buffers/scalars
-sub is_builtin_type($)
-{
- my($type) = shift;
-
- return 1, if (is_scalar_type($type));
-
- return 0;
-}
-
-# determine if an element needs a reference pointer on the wire
-# in its NDR representation
-sub need_wire_pointer($)
-{
- my $e = shift;
- if ($e->{POINTERS} &&
- !has_property($e, "ref")) {
- return $e->{POINTERS};
- }
- return undef;
-}
# determine if an element is a pass-by-reference structure
sub is_ref_struct($)
return 0;
}
-# determine if an element is a pure scalar. pure scalars do not
-# have a "buffers" section in NDR
-sub is_pure_scalar($)
-{
- my $e = shift;
- if (has_property($e, "ref")) {
- return 1;
- }
- if (is_scalar_type($e->{TYPE}) &&
- !$e->{POINTERS} &&
- !array_size($e)) {
- return 1;
- }
- return 0;
-}
-
# determine the array size (size_is() or ARRAY_LEN)
sub array_size($)
{
return undef;
}
-# see if a variable needs to be allocated by the NDR subsystem on pull
-sub need_alloc($)
-{
- my $e = shift;
-
- if (has_property($e, "ref")) {
- return 0;
- }
-
- if ($e->{POINTERS} || array_size($e)) {
- return 1;
- }
-
- return 0;
-}
-
-# determine the C prefix used to refer to a variable when passing to a push
-# function. This will be '*' for pointers to scalar types, '' for scalar
-# types and normal pointers and '&' for pass-by-reference structures
-sub c_push_prefix($)
-{
- my $e = shift;
-
- if ($e->{TYPE} =~ "string") {
- return "";
- }
-
- if (is_scalar_type($e->{TYPE}) &&
- $e->{POINTERS}) {
- return "*";
- }
- if (!is_scalar_type($e->{TYPE}) &&
- !$e->{POINTERS} &&
- !array_size($e)) {
- return "&";
- }
- return "";
-}
-
-
-# determine the C prefix used to refer to a variable when passing to a pull
-# return '&' or ''
-sub c_pull_prefix($)
-{
- my $e = shift;
-
- if (!$e->{POINTERS} && !array_size($e)) {
- return "&";
- }
-
- if ($e->{TYPE} =~ "string") {
- return "&";
- }
-
- return "";
-}
-
-# determine if an element has a direct buffers component
-sub has_direct_buffers($)
-{
- my $e = shift;
- if ($e->{POINTERS} || array_size($e)) {
- return 1;
- }
- return 0;
-}
-
# return 1 if the string is a C constant
sub is_constant($)
{
return 0;
}
-# return 1 if this is a fixed array
-sub is_fixed_array($)
-{
- my $e = shift;
- my $len = $e->{"ARRAY_LEN"};
- if (defined $len && is_constant($len)) {
- return 1;
- }
- return 0;
-}
-
-# return 1 if this is a inline array
-sub is_inline_array($)
-{
- my $e = shift;
- my $len = $e->{"ARRAY_LEN"};
- if (is_fixed_array($e) ||
- defined $len && $len ne "*") {
- return 1;
- }
- return 0;
-}
-
# return a "" quoted string, unless already quoted
sub make_str($)
{
return "\"" . $str . "\"";
}
+
+# provide mappings between IDL base types and types in our headers
+my %type_mappings =
+ (
+ "int8" => "int8_t",
+ "uint8" => "uint8_t",
+ "short" => "int16_t",
+ "wchar_t" => "uint16_t",
+ "int16" => "int16_t",
+ "uint16" => "uint16_t",
+ "int32" => "int32_t",
+ "uint32" => "uint32_t",
+ "int64" => "int64_t",
+ "uint64" => "uint64_t",
+ "dlong" => "int64_t",
+ "udlong" => "uint64_t",
+ "udlongr" => "uint64_t",
+ "hyper" => "uint64_t",
+ "NTTIME_1sec" => "NTTIME",
+ "NTTIME_hyper" => "NTTIME",
+ "ipv4address" => "const char *"
+ );
+
+# map from a IDL type to a C header type
+sub map_type($)
+{
+ my $name = shift;
+ if (my $ret = $type_mappings{$name}) {
+ return $ret;
+ }
+ return $name;
+}
+
1;