* the beginnings of non-constant fixed arrays
authorAndrew Tridgell <tridge@samba.org>
Sun, 16 Nov 2003 13:48:05 +0000 (13:48 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 16 Nov 2003 13:48:05 +0000 (13:48 +0000)
 * added relative pointers support
(This used to be commit 4a34a4f29cf8ab79582ce7b503da907df7b4d209)

source4/build/pidl/header.pm
source4/build/pidl/idl.gram
source4/build/pidl/parser.pm
source4/build/pidl/util.pm

index e5acad2a634bf7ca9c3b7be396210182cd601cd0..7f7f2db977d35582c67a676570780181f82415fc 100644 (file)
@@ -59,13 +59,14 @@ sub HeaderElement($)
                    $res .= "*";
            }
     }
-    if (defined $element->{ARRAY_LEN} && $element->{ARRAY_LEN} eq "*") {
+    if (defined $element->{ARRAY_LEN} && 
+       !util::is_constant($element->{ARRAY_LEN})) {
            # conformant arrays are ugly! I choose to implement them with
            # pointers instead of the [1] method
            $res .= "*";
     }
     $res .= "$element->{NAME}";
-    if (defined $element->{ARRAY_LEN} && $element->{ARRAY_LEN} ne "*") {
+    if (defined $element->{ARRAY_LEN} && util::is_constant($element->{ARRAY_LEN})) {
            $res .= "[$element->{ARRAY_LEN}]";
     }
     $res .= ";\n";
@@ -128,7 +129,7 @@ sub HeaderType($$$)
        }
        if ($data =~ "unistr") {
                $res .= "const char";
-       } elsif ($data =~ "relstr") {
+       } elsif ($data =~ "nstring") {
                $res .= "const char *";
        } elsif (util::is_scalar_type($data)) {
                $res .= "$data";
@@ -198,6 +199,9 @@ sub HeaderInterface($)
     my($interface) = shift;
     my($data) = $interface->{DATA};
     foreach my $d (@{$data}) {
+           if (!defined $d->{TYPE}) {
+                   print Dumper $d;
+           }
        ($d->{TYPE} eq "TYPEDEF") &&
            HeaderTypedef($d);
        ($d->{TYPE} eq "FUNCTION") && 
index 1e96431e47e34d9a5e07356b2e278e847275adff..f340b9787e238a1149101d7a8b92b8dfcfbf2916 100644 (file)
@@ -78,10 +78,12 @@ base_element: property_list(s?) type pointer(s?) identifier array_len(?)
             | <error>
 
 array_len: 
-        '[]'
+        '[' ']'
         { "*" }
-        | '[' <commit> constant ']' 
-         { $item{constant} }
+        | '[' '*' ']'
+        { "*" }
+        | '[' <commit> text ']' 
+         { "$item{text}" }
          | <error?>
 
 element_list1: base_element(s? /;/) ';' 
@@ -105,6 +107,7 @@ property: 'unique'
          | 'context_handle'
          | 'string'
          | 'public'
+         | 'relative'
          | 'subcontext'
          | 'byte_count_pointer' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
           | 'size_is' '(' expression ')' {{ "$item[1]" => "$item{expression}" }}
index e341d9f21624b52b1a526429e6eb39db38dfb925..6037fb3d89703d68aea99f4f3b8687a65f23a301 100644 (file)
@@ -198,7 +198,9 @@ sub ParseElementPushScalar($$$)
        my($ndr_flags) = shift;
        my $cprefix = util::c_push_prefix($e);
 
-       if (my $value = util::has_property($e, "value")) {
+       if (util::has_property($e, "relative")) {
+               $res .= "\tNDR_CHECK(ndr_push_relative(ndr, NDR_SCALARS, $var_prefix$e->{NAME}, (ndr_push_const_fn_t) ndr_push_$e->{TYPE}));\n";
+       } elsif (my $value = util::has_property($e, "value")) {
                $res .= "\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $value));\n";
        } elsif (defined $e->{VALUE}) {
                $res .= "\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $e->{VALUE}));\n";
@@ -301,7 +303,9 @@ sub ParseElementPullScalar($$$)
        my($ndr_flags) = shift;
        my $cprefix = util::c_pull_prefix($e);
 
-       if (defined $e->{VALUE}) {
+       if (util::has_property($e, "relative")) {
+               $res .= "\tNDR_CHECK(ndr_pull_relative(ndr, (const void **)&$var_prefix$e->{NAME}, sizeof(*$var_prefix$e->{NAME}), (ndr_pull_flags_fn_t)ndr_pull_$e->{TYPE}));\n";
+       } elsif (defined $e->{VALUE}) {
                $res .= "\tNDR_CHECK(ndr_pull_$e->{TYPE}(ndr, $e->{VALUE}));\n";
        } elsif (util::need_wire_pointer($e)) {
                $res .= "\tNDR_CHECK(ndr_pull_uint32(ndr, &_ptr_$e->{NAME}));\n";
@@ -344,7 +348,9 @@ sub ParseElementPushBuffer($$$)
                $res .= "\tif ($var_prefix$e->{NAME}) {\n";
        }
            
-       if (util::array_size($e)) {
+       if (util::has_property($e, "relative")) {
+               $res .= "\tNDR_CHECK(ndr_push_relative(ndr, NDR_BUFFERS, $cprefix$var_prefix$e->{NAME}, (ndr_push_const_fn_t) ndr_push_$e->{TYPE}));\n";
+       } elsif (util::array_size($e)) {
                ParseArrayPush($e, "r->", "NDR_SCALARS|NDR_BUFFERS");
        } elsif (my $switch = util::has_property($e, "switch_is")) {
                if ($e->{POINTERS}) {
@@ -408,6 +414,10 @@ sub ParseElementPullBuffer($$$)
                return;
        }
 
+       if (util::has_property($e, "relative")) {
+               return;
+       }
+
        if (util::need_wire_pointer($e)) {
                $res .= "\tif ($var_prefix$e->{NAME}) {\n";
        }
index 916ae79d5f9acd145fee040fd271d550cc959a3a..16cb012d0ce06981de122fadd91cce898826d7f2 100644 (file)
@@ -329,7 +329,7 @@ sub c_pull_prefix($)
        if ($e->{TYPE} =~ "unistr.*") {
                return "&";
        }
-       if ($e->{TYPE} =~ "relstr.*") {
+       if ($e->{TYPE} =~ "nstring.*") {
                return "&";
        }
 
@@ -367,6 +367,17 @@ sub is_fixed_array($)
        return 0;
 }
 
+# return 1 if this is a inline array
+sub is_inline_array($)
+{
+       my $e = shift;
+       my $len = $e->{"ARRAY_LEN"};
+       if (defined $len && $len ne "*") {
+               return 1;
+       }
+       return 0;
+}
+
 sub dump($)
 {
        print Dumper shift;