3 # by Elliot Lee <sopwith@redhat.com>
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",
15 # complex types. These need special handling.
17 "C_CALLBACK"=>"C_CALLBACK",
20 "CALLBACK"=>"CALLBACK"
23 $srcdir = $ENV{'srcdir'} || '.';
24 $indent = $ENV{'INDENT'};
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~");
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: $!");
40 #ifndef __GTKMARSHAL_H__
41 #define __GTKMARSHAL_H__ 1
43 #include <gtk/gtktypeutils.h>
44 #include <gtk/gtkobject.h>
48 #endif /* __cplusplus */
50 #define gtk_signal_default_marshaller gtk_marshal_NONE__NONE
54 print OS qq(#include "gtkmarshal.h"\n\n);
56 while (defined($aline = <IL>)) {
58 ($retval, $paramlist) = split(/:/, $aline, 2);
59 @params = split(/\s*,\s*/, $paramlist);
61 my $funcname = $retval."__".join("_",@params);
64 next if (exists $defs{$funcname});
67 for (@params, $retval) {
68 if ($trans{$_} eq "gpointer" && $_ ne "POINTER") {
72 if($_ eq "ENUM" || $_ eq "UINT" || $_ eq "ULONG") {
78 # Translate all function pointers to gpointer
81 print OH "#define gtk_marshal_$funcname ";
84 for (@params, $retval) {
85 if ($trans{$_} eq "gpointer") {
92 $_ = "INT"; # Unvalidated assumption - please check
99 $funcname = $retval."__".join("_",@params);
101 print OH "gtk_marshal_$funcname\n\n";
102 next if (exists $defs{$funcname});
104 $defs{$funcname} = 1;
107 void gtk_marshal_$funcname (GtkObject *object,
114 print OS "typedef $trans{$retval} (*GtkSignal_$funcname) (GtkObject *object, \n";
117 if($_ eq "C_CALLBACK") {
118 print OS "gpointer arg".$argn."a,\n";
119 print OS "gpointer arg".$argn."b,\n";
121 } elsif($_ eq "SIGNAL") {
122 print OS "gpointer arg".$argn."a,\n";
123 print OS "gpointer arg".$argn."b,\n";
125 } elsif($_ eq "ARGS") {
126 print OS "gpointer arg".$argn."a,\n";
127 print OS "gpointer arg".$argn."b,\n";
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";
134 } elsif($_ eq "FOREIGN") {
135 print OS "gpointer arg".$argn."a,\n";
136 print OS "gpointer arg".$argn."b,\n";
139 print OS "$trans{$_} arg".$argn++.",\n" unless $_ eq "NONE";
142 print OS "gpointer user_data);\n";
145 void gtk_marshal_$funcname (GtkObject *object,
150 GtkSignal_$funcname rfunc;
153 if($retval ne "NONE") {
154 print OS " $trans{$retval} *return_val;\n";
156 $retn = scalar @params unless $params[0] eq "NONE";
157 print OS " return_val = GTK_RETLOC_$retval (args[$retn]);\n";
159 print OS " rfunc = (GtkSignal_$funcname) func;\n";
160 print OS " *return_val = " unless $retval eq "NONE";
161 print OS " (* rfunc) (object,\n";
163 for($i = 0; $i < (scalar @params); $i++) {
164 if($params[$i] eq "C_CALLBACK") {
166 GTK_VALUE_C_CALLBACK(args[$i]).func,
167 GTK_VALUE_C_CALLBACK(args[$i]).func_data,
169 } elsif ($params[$i] eq "SIGNAL") {
171 GTK_VALUE_SIGNAL(args[$i]).f,
172 GTK_VALUE_SIGNAL(args[$i]).d,
174 } elsif ($params[$i] eq "CALLBACK") {
176 GTK_VALUE_CALLBACK(args[$i]).marshal,
177 GTK_VALUE_CALLBACK(args[$i]).data,
178 GTK_VALUE_CALLBACK(args[$i]).notify,
180 } elsif ($params[$i] eq "FOREIGN") {
182 GTK_VALUE_FOREIGN(args[$i]).data,
183 GTK_VALUE_FOREIGN(args[$i]).notify,
185 } elsif ($params[$i] eq "NONE") {
187 print OS " GTK_VALUE_$params[$i](args[$i]),\n";
191 print OS " func_data);\n}\n\n";
197 #endif /* __cplusplus */
199 #endif /* __GTKMARSHAL_H__ */
202 close(IL); close(OH); close(OS);