]> Pileus Git - ~andy/gtk/blob - gtk/genmarshal.pl
db0487b99021a3cb9fe1421152c2474c9dbf73f4
[~andy/gtk] / gtk / genmarshal.pl
1 #!/usr/bin/perl -w
2 #
3 # by Elliot Lee <sopwith@redhat.com>
4
5 %trans = ( "NONE"=>"void", "CHAR"=>"char",
6            "BOOL"=>"gboolean", "INT"=>"gint",
7            "UINT"=>"guint", "LONG"=>"glong",
8            "ULONG"=>"gulong", "FLOAT"=>"gfloat",
9            "DOUBLE"=>"gdouble", "STRING"=>"gpointer",
10            "ENUM"=>"gint", "FLAGS"=>"gint",
11            "BOXED"=>"gpointer", "FOREIGN"=>"gpointer",
12            "POINTER"=>"gpointer",
13            "OBJECT"=>"gpointer",
14
15 # complex types. These need special handling.
16                 "FOREIGN"=>"FOREIGN",
17                 "C_CALLBACK"=>"C_CALLBACK",
18                 "SIGNAL"=>"SIGNAL",
19                 "ARGS"=>"ARGS",
20                 "CALLBACK"=>"CALLBACK"
21                 );
22
23 $srcdir = $ENV{'srcdir'} || '.';
24 $indent = $ENV{'INDENT'};
25
26 sub indent {
27     my $filename = shift;
28     if (defined($indent) && $indent ne "") {
29         system($indent, $filename);
30         # we try the most likely names for backup files
31         system("rm", "-f", "$filename.bak", "$filename~");
32     }
33 }
34
35 open(IL, "<$srcdir/gtkmarshal.list") || die("Open failed: $!");
36 open(OH, ">s-gmh") || die("Open failed: $!");
37 open(OS, ">s-gmc") || die("Open failed: $!");
38
39 print OH <<EOT;
40 #ifndef __GTKMARSHAL_H__
41 #define __GTKMARSHAL_H__ 1
42
43 #include <gtk/gtktypeutils.h>
44 #include <gtk/gtkobject.h>
45
46 #ifdef __cplusplus
47 extern "C" {
48 #endif /* __cplusplus */
49
50 #define gtk_signal_default_marshaller gtk_marshal_NONE__NONE
51
52 EOT
53
54 print OS qq(#include "gtkmarshal.h"\n\n);
55
56 while (defined($aline = <IL>)) {
57   chomp $aline;
58   ($retval, $paramlist) = split(/:/, $aline, 2);
59   @params = split(/\s*,\s*/, $paramlist);
60
61   my $funcname = $retval."__".join("_",@params);
62   my $defname;
63   
64   next if (exists $defs{$funcname});
65
66   $doequiv = 0;
67   for (@params, $retval) { 
68       if ($trans{$_} eq "gpointer" && $_ ne "POINTER") {
69           $doequiv = 1;
70           last;
71       }
72       if($_ eq "ENUM" || $_ eq "UINT" || $_ eq "ULONG") {
73         $doequiv = 1;
74         last;
75       }
76   }
77
78   # Translate all function pointers to gpointer
79   $defname = $funcname;
80   if($doequiv) {
81       print OH "#define gtk_marshal_$funcname ";
82       $defs{$defname} = 1;
83       
84       for (@params, $retval) {
85         if ($trans{$_} eq "gpointer") {
86           $_ = "POINTER";
87         }
88         if($_ eq "ENUM") {
89           $_ = "UINT";
90         }
91         if($_ eq "UINT") {
92           $_ = "INT"; # Unvalidated assumption - please check
93         }
94         if($_ eq "ULONG") {
95           $_ = "LONG";
96         }
97       }
98
99       $funcname = $retval."__".join("_",@params);
100
101       print OH "gtk_marshal_$funcname\n\n";
102       next if (exists $defs{$funcname});
103   }
104   $defs{$funcname} = 1;  
105
106   print OH <<EOT;
107 void gtk_marshal_$funcname (GtkObject    *object, 
108                             GtkSignalFunc func, 
109                             gpointer      func_data, 
110                             GtkArg       *args);
111
112 EOT
113   
114   print OS "typedef $trans{$retval} (*GtkSignal_$funcname) (GtkObject *object, \n";
115   $argn = 1;
116   for (@params) { 
117         if($_ eq "C_CALLBACK") {
118                 print OS "gpointer arg".$argn."a,\n";
119                 print OS "gpointer arg".$argn."b,\n";
120                 $argn++;
121         } elsif($_ eq "SIGNAL") {
122                 print OS "gpointer arg".$argn."a,\n";
123                 print OS "gpointer arg".$argn."b,\n";
124                 $argn++;
125         } elsif($_ eq "ARGS") {
126                 print OS "gpointer arg".$argn."a,\n";
127                 print OS "gpointer arg".$argn."b,\n";
128                 $argn++;
129         } elsif($_ eq "CALLBACK") {
130                 print OS "gpointer arg".$argn."a,\n";
131                 print OS "gpointer arg".$argn."b,\n";
132                 print OS "gpointer arg".$argn."c,\n";
133                 $argn++;
134         } elsif($_ eq "FOREIGN") {
135                 print OS "gpointer arg".$argn."a,\n";
136                 print OS "gpointer arg".$argn."b,\n";
137                 $argn++;
138         } else {
139                 print OS "$trans{$_} arg".$argn++.",\n" unless $_ eq "NONE";
140         }
141   }
142   print OS "gpointer user_data);\n";
143
144   print OS <<EOT;
145 void gtk_marshal_$funcname (GtkObject    *object, 
146                             GtkSignalFunc func, 
147                             gpointer      func_data, 
148                             GtkArg       *args)
149 {
150   GtkSignal_$funcname rfunc;
151 EOT
152
153   if($retval ne "NONE") {
154       print OS "  $trans{$retval}  *return_val;\n";
155       $retn = 0;
156       $retn = scalar @params unless $params[0] eq "NONE";
157       print OS "  return_val = GTK_RETLOC_$retval (args[$retn]);\n";
158   }
159   print OS "  rfunc = (GtkSignal_$funcname) func;\n";
160   print OS "  *return_val = " unless $retval eq "NONE";
161   print OS                  " (* rfunc) (object,\n";
162
163   for($i = 0; $i < (scalar @params); $i++) {
164       if($params[$i] eq "C_CALLBACK") {
165         print OS <<EOT;
166 GTK_VALUE_C_CALLBACK(args[$i]).func,
167 GTK_VALUE_C_CALLBACK(args[$i]).func_data,
168 EOT
169       } elsif ($params[$i] eq "SIGNAL") {
170         print OS <<EOT;
171 GTK_VALUE_SIGNAL(args[$i]).f,
172 GTK_VALUE_SIGNAL(args[$i]).d,
173 EOT
174       } elsif ($params[$i] eq "CALLBACK") {
175         print OS <<EOT;
176 GTK_VALUE_CALLBACK(args[$i]).marshal,
177 GTK_VALUE_CALLBACK(args[$i]).data,
178 GTK_VALUE_CALLBACK(args[$i]).notify,
179 EOT
180       } elsif ($params[$i] eq "FOREIGN") {
181         print OS <<EOT;
182 GTK_VALUE_FOREIGN(args[$i]).data,
183 GTK_VALUE_FOREIGN(args[$i]).notify,
184 EOT
185       } elsif ($params[$i] eq "NONE") {
186       } else {
187         print OS "                      GTK_VALUE_$params[$i](args[$i]),\n";
188       }
189   }
190
191   print OS  "                             func_data);\n}\n\n";
192 }
193 print OH <<EOT;
194
195 #ifdef __cplusplus
196 }
197 #endif /* __cplusplus */
198
199 #endif /* __GTKMARSHAL_H__ */
200 EOT
201
202 close(IL); close(OH); close(OS);
203
204 indent("s-gmh");
205 indent("s-gmc");