ldb_map objectClass munging: Don't hard-code 'extensibleObject'.
[samba.git] / source4 / pidl / lib / Parse / Pidl / Samba4.pm
1 ###################################################
2 # Common Samba4 functions
3 # Copyright jelmer@samba.org 2006
4 # released under the GNU GPL
5
6 package Parse::Pidl::Samba4;
7
8 require Exporter;
9 @ISA = qw(Exporter);
10 @EXPORT = qw(is_intree choose_header NumStars ElementStars ArrayBrackets DeclLong);
11
12 use Parse::Pidl::Util qw(has_property is_constant);
13 use Parse::Pidl::NDR qw(GetNextLevel);
14 use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
15 use strict;
16
17 use vars qw($VERSION);
18 $VERSION = '0.01';
19
20 sub is_intree()
21 {
22         my $srcdir = $ENV{srcdir};
23         $srcdir = $srcdir ? "$srcdir/" : "";
24         return 4 if (-f "${srcdir}kdc/kdc.c");
25         return 3 if (-f "${srcdir}include/smb.h");
26         return 0;
27 }
28
29 # Return an #include line depending on whether this build is an in-tree
30 # build or not.
31 sub choose_header($$)
32 {
33         my ($in,$out) = @_;
34         return "#include \"$in\"" if (is_intree());
35         return "#include <$out>";
36 }
37
38 sub NumStars($;$)
39 {
40         my ($e, $d) = @_;
41         $d = 0 unless defined($d);
42         my $n = 0;
43
44         foreach my $l (@{$e->{LEVELS}}) {
45                 next unless ($l->{TYPE} eq "POINTER");
46
47                 my $nl = GetNextLevel($e, $l);
48                 next if (defined($nl) and $nl->{TYPE} eq "ARRAY");
49
50                 $n++;
51         }
52
53         if ($n >= 1) {
54                 $n-- if (scalar_is_reference($e->{TYPE}));
55         }
56
57         foreach my $l (@{$e->{LEVELS}}) {
58                 next unless ($l->{TYPE} eq "ARRAY");
59                 next if ($l->{IS_FIXED}) and not has_property($e, "charset");
60                 $n++;
61         }
62
63         fatal($e->{ORIGINAL}, "Too few pointers $n < $d") if ($n < $d);
64
65         $n -= $d;
66
67         return $n;
68 }
69
70 sub ElementStars($;$)
71 {
72         my ($e, $d) = @_;
73         my $res = "";
74         my $n = 0;
75
76         $n = NumStars($e, $d);
77         $res .= "*" foreach (1..$n);
78
79         return $res;
80 }
81
82 sub ArrayBrackets($)
83 {
84         my ($e) = @_;
85         my $res = "";
86
87         foreach my $l (@{$e->{LEVELS}}) {
88                 next unless ($l->{TYPE} eq "ARRAY");
89                 next unless ($l->{IS_FIXED}) and not has_property($e, "charset");
90                 $res .= "[$l->{SIZE_IS}]";
91         }
92
93         return $res;
94 }
95
96 sub DeclLong($)
97 {
98         my ($e) = shift;
99         my $res = "";
100
101         if (has_property($e, "represent_as")) {
102                 $res .= mapTypeName($e->{PROPERTIES}->{represent_as})." ";
103         } else {
104                 if (has_property($e, "charset")) {
105                         $res .= "const char ";
106                 } else {
107                         $res .= mapTypeName($e->{TYPE})." ";
108                 }
109
110                 $res .= ElementStars($e);
111         }
112         $res .= $e->{NAME};
113         $res .= ArrayBrackets($e);
114
115         return $res;
116 }
117
118 1;