diff options
Diffstat (limited to 'source4/build/pidl/Parse/Pidl/Samba/TDR.pm')
-rw-r--r-- | source4/build/pidl/Parse/Pidl/Samba/TDR.pm | 266 |
1 files changed, 0 insertions, 266 deletions
diff --git a/source4/build/pidl/Parse/Pidl/Samba/TDR.pm b/source4/build/pidl/Parse/Pidl/Samba/TDR.pm deleted file mode 100644 index b9bfd83e41..0000000000 --- a/source4/build/pidl/Parse/Pidl/Samba/TDR.pm +++ /dev/null @@ -1,266 +0,0 @@ -################################################### -# Trivial Parser Generator -# Copyright jelmer@samba.org 2005 -# released under the GNU GPL - -package Parse::Pidl::Samba::TDR; -use Parse::Pidl::Util qw(has_property ParseExpr is_constant); -use Data::Dumper; - -use strict; - -my $ret = ""; -my $tabs = ""; - -sub indent() { $tabs.="\t"; } -sub deindent() { $tabs = substr($tabs, 1); } -sub pidl($) { $ret .= $tabs.(shift)."\n"; } -sub fatal($$) { my ($e,$s) = @_; die("$e->{FILE}:$e->{LINE}: $s\n"); } -sub static($) { my $p = shift; return("static ") unless ($p); return ""; } -sub printarg($) { - my $t = shift; - return(", const char *name") if ($t eq "print"); - return(""); -} - -sub ContainsArray($) -{ - my $e = shift; - foreach (@{$e->{ELEMENTS}}) { - next if (has_property($_, "charset") and - scalar(@{$_->{ARRAY_LEN}}) == 1); - return 1 if (defined($_->{ARRAY_LEN}) and - scalar(@{$_->{ARRAY_LEN}}) > 0); - } - return 0; -} - -sub ParserElement($$$) -{ - my ($e,$t,$env) = @_; - my $switch = ""; - my $array = ""; - my $name = ""; - - fatal($e,"Pointers not supported in TDR") if ($e->{POINTERS} > 0); - fatal($e,"size_is() not supported in TDR") if (has_property($e, "size_is")); - fatal($e,"length_is() not supported in TDR") if (has_property($e, "length_is")); - - if ($t eq "print") { - $name = ", \"$e->{NAME}\"$array"; - } - - if (has_property($e, "flag")) { - pidl "{"; - indent; - pidl "uint32_t saved_flags = tdr->flags;"; - pidl "tdr->flags |= $e->{PROPERTIES}->{flag};"; - } - - if (has_property($e, "charset")) { - fatal($e,"charset() on non-array element") unless (defined($e->{ARRAY_LEN}) and scalar(@{$e->{ARRAY_LEN}}) > 0); - - my $len = @{$e->{ARRAY_LEN}}[0]; - if ($len eq "*") { $len = "-1"; } - pidl "TDR_CHECK(tdr_$t\_charset(tdr$name, &v->$e->{NAME}, $len, sizeof($e->{TYPE}_t), CH_$e->{PROPERTIES}->{charset}));"; - return; - } - - - if (has_property($e, "switch_is")) { - $switch = ", " . ParseExpr($e->{PROPERTIES}->{switch_is}, $env); - } - - if (defined($e->{ARRAY_LEN}) and scalar(@{$e->{ARRAY_LEN}}) > 0) { - my $len = ParseExpr($e->{ARRAY_LEN}[0], $env); - - if ($t eq "pull" and not is_constant($len)) { - pidl "TDR_ALLOC(tdr, v->$e->{NAME}, $len);" - } - - pidl "for (i = 0; i < $len; i++) {"; - indent; - $array = "[i]"; - } - - if (has_property($e, "value") && $t eq "push") { - pidl "v->$e->{NAME} = ".ParseExpr($e->{PROPERTIES}->{value}, $env).";"; - } - - pidl "TDR_CHECK(tdr_$t\_$e->{TYPE}(tdr$name$switch, &v->$e->{NAME}$array));"; - - if ($array) { deindent; pidl "}"; } - - if (has_property($e, "flag")) { - pidl "tdr->flags = saved_flags;"; - deindent; - pidl "}"; - } -} - -sub ParserStruct($$$$) -{ - my ($e,$n,$t,$p) = @_; - - pidl static($p)."NTSTATUS tdr_$t\_$n (struct tdr_$t *tdr".printarg($t).", struct $n *v)"; - pidl "{"; indent; - pidl "int i;" if (ContainsArray($e)); - - if ($t eq "print") { - pidl "tdr->print(tdr, \"\%-25s: struct $n\", name);"; - pidl "tdr->level++;"; - } - - my %env = map { $_->{NAME} => "v->$_->{NAME}" } @{$e->{ELEMENTS}}; - ParserElement($_, $t, \%env) foreach (@{$e->{ELEMENTS}}); - - if ($t eq "print") { - pidl "tdr->level--;"; - } - - pidl "return NT_STATUS_OK;"; - - deindent; pidl "}"; -} - -sub ParserUnion($$$$) -{ - my ($e,$n,$t,$p) = @_; - - pidl static($p)."NTSTATUS tdr_$t\_$n(struct tdr_$t *tdr".printarg($t).", int level, union $n *v)"; - pidl "{"; indent; - pidl "int i;" if (ContainsArray($e)); - - if ($t eq "print") { - pidl "tdr->print(tdr, \"\%-25s: union $n\", name);"; - pidl "tdr->level++;"; - } - - pidl "switch (level) {"; indent; - foreach (@{$e->{ELEMENTS}}) { - if (has_property($_, "case")) { - pidl "case " . $_->{PROPERTIES}->{case} . ":"; - } elsif (has_property($_, "default")) { - pidl "default:"; - } - indent; ParserElement($_, $t, {}); deindent; - pidl "break;"; - } - deindent; pidl "}"; - - if ($t eq "print") { - pidl "tdr->level--;"; - } - - pidl "return NT_STATUS_OK;\n"; - deindent; pidl "}"; -} - -sub ParserBitmap($$$$) -{ - my ($e,$n,$t,$p) = @_; - return if ($p); - pidl "#define tdr_$t\_$n tdr_$t\_" . Parse::Pidl::Typelist::bitmap_type_fn($e); -} - -sub ParserEnum($$$$) -{ - my ($e,$n,$t,$p) = @_; - my $bt = Parse::Pidl::Typelist::enum_type_fn($e); - - pidl static($p)."NTSTATUS tdr_$t\_$n (struct tdr_$t *tdr".printarg($t).", enum $n *v)"; - pidl "{"; - if ($t eq "pull") { - pidl "\t$bt\_t r;"; - pidl "\tTDR_CHECK(tdr_$t\_$bt(tdr, \&r));"; - pidl "\t*v = r;"; - } elsif ($t eq "push") { - pidl "\tTDR_CHECK(tdr_$t\_$bt(tdr, ($bt\_t *)v));"; - } elsif ($t eq "print") { - pidl "\t/* FIXME */"; - } - pidl "\treturn NT_STATUS_OK;"; - pidl "}"; -} - -sub ParserTypedef($$) -{ - my ($e,$t) = @_; - - return if (has_property($e, "no$t")); - - { STRUCT => \&ParserStruct, UNION => \&ParserUnion, - ENUM => \&ParserEnum, BITMAP => \&ParserBitmap - }->{$e->{DATA}->{TYPE}}($e->{DATA}, $e->{NAME}, $t, has_property($e, "public")); - - pidl ""; -} - -sub ParserInterface($) -{ - my $x = shift; - - foreach (@{$x->{DATA}}) { - next if ($_->{TYPE} ne "TYPEDEF"); - ParserTypedef($_, "pull"); - ParserTypedef($_, "push"); - ParserTypedef($_, "print"); - } -} - -sub Parser($$) -{ - my ($idl,$hdrname) = @_; - $ret = ""; - pidl "/* autogenerated by pidl */"; - pidl "#include \"includes.h\""; - pidl "#include \"$hdrname\""; - foreach (@$idl) { ParserInterface($_) if ($_->{TYPE} eq "INTERFACE"); } - return $ret; -} - -sub HeaderInterface($$) -{ - my ($x,$outputdir) = @_; - - pidl "#ifndef __TDR_$x->{NAME}_HEADER__"; - pidl "#define __TDR_$x->{NAME}_HEADER__"; - - pidl "#include \"$outputdir/$x->{NAME}.h\""; - - foreach my $e (@{$x->{DATA}}) { - next unless ($e->{TYPE} eq "TYPEDEF"); - next unless has_property($e, "public"); - - my $switch = ""; - - $switch = ", int level" if ($e->{DATA}->{TYPE} eq "UNION"); - - if ($e->{DATA}->{TYPE} eq "BITMAP") { - # FIXME - } else { - my ($n, $d) = ($e->{NAME}, lc($e->{DATA}->{TYPE})); - pidl "NTSTATUS tdr_pull\_$n(struct tdr_pull *tdr$switch, $d $n *v);"; - pidl "NTSTATUS tdr_print\_$n(struct tdr_print *tdr, const char *name$switch, $d $n *v);"; - pidl "NTSTATUS tdr_push\_$n(struct tdr_push *tdr$switch, $d $n *v);"; - } - - pidl ""; - } - - pidl "#endif /* __TDR_$x->{NAME}_HEADER__ */"; -} - -sub Header($$) -{ - my ($idl,$outputdir) = @_; - $ret = ""; - pidl "/* Generated by pidl */"; - - foreach (@$idl) { - HeaderInterface($_, $outputdir) if ($_->{TYPE} eq "INTERFACE"); - } - return $ret; -} - -1; |