68e35a85324f3ff2051b71f913ff6a0bcdd09dfd
[ira/wip.git] / source / pidl / lib / Parse / Pidl / Samba4 / Python.pm
1 ###################################################
2 # Python function wrapper generator
3 # Copyright jelmer@samba.org 2007
4 # released under the GNU GPL
5
6 package Parse::Pidl::Samba4::Python;
7
8 use Exporter;
9 @ISA = qw(Exporter);
10
11 use strict;
12 use Parse::Pidl::Typelist;
13 use Parse::Pidl::Util qw(has_property ParseExpr);
14
15 use vars qw($VERSION);
16 $VERSION = '0.01';
17
18 sub new($) {
19         my ($class) = @_;
20         my $self = { res => "", res_hdr => "", tabs => "", constants => {}};
21         bless($self, $class);
22 }
23
24 sub pidl_hdr ($$)
25 {
26         my $self = shift;
27         $self->{res_hdr} .= shift;
28 }
29
30 sub pidl($$)
31 {
32         my ($self, $d) = @_;
33         if ($d) {
34                 $self->{res} .= $self->{tabs};
35                 $self->{res} .= $d;
36         }
37         $self->{res} .= "\n";
38 }
39
40 sub indent($)
41 {
42         my ($self) = @_;
43         $self->{tabs} .= "\t";
44 }
45
46 sub deindent($)
47 {
48         my ($self) = @_;
49         $self->{tabs} = substr($self->{tabs}, 0, -1);
50 }
51
52 sub Parse($$$$)
53 {
54     my($self,$basename,$ndr,$hdr) = @_;
55     
56     my $py_hdr = $hdr;
57     $py_hdr =~ s/ndr_([^\/]+)$/py_$1/g;
58
59     $self->pidl_hdr("/* header auto-generated by pidl */\n\n");
60         
61     $self->pidl("
62 /* Python wrapper functions auto-generated by pidl */
63 #include \"includes.h\"
64 #include <Python.h>
65 #include \"$hdr\"
66 #include \"$py_hdr\"
67
68 ");
69         
70         $self->pidl("static PyMethodDef $basename\_methods[] = {");
71         $self->indent;
72         $self->pidl("{ NULL, NULL, 0, NULL }");
73         $self->deindent;
74         $self->pidl("};");
75
76         $self->pidl("");
77
78         $self->pidl("void init$basename(void)");
79         $self->pidl("{");
80         $self->indent;
81         $self->pidl("PyObject *m;");
82         $self->pidl("m = Py_InitModule((char *)\"$basename\", $basename\_methods);");
83         # FIXME
84         $self->deindent;
85         $self->pidl("}");
86     return ($self->{res_hdr}, $self->{res});
87 }
88
89 1;