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",
12 "POINTER"=>"gpointer",
15 # complex types. These need special handling.
20 die ("Wrong number of arguments given, need <source> <target.h> <target.c>");
23 open(IL, "<" . $ARGV[0]) || die ("Open failed: $!");
24 open(OH, ">" . $ARGV[1]) || die ("Open failed: $!");
25 open(OS, ">" . $ARGV[2]) || die ("Open failed: $!");
28 #ifndef __GTK_MARSHAL_H__
29 #define __GTK_MARSHAL_H__
31 #include <gtk/gtktypeutils.h>
32 #include <gtk/gtkobject.h>
36 #endif /* __cplusplus */
38 #define gtk_signal_default_marshaller gtk_marshal_NONE__NONE
42 print OS qq(#include "gtkmarshal.h"\n\n);
44 while (defined($aline = <IL>)) {
46 ($retval, $paramlist) = split(/:/, $aline, 2);
47 @params = split(/\s*,\s*/, $paramlist);
49 my $funcname = $retval."__".join("_",@params);
52 next if (exists $defs{$funcname});
55 for (@params, $retval) {
56 if ($trans{$_} eq "gpointer" && $_ ne "POINTER") {
60 if($_ eq "ENUM" || $_ eq "UINT" || $_ eq "ULONG") {
66 # Translate all function pointers to gpointer
69 print OH "#define gtk_marshal_$funcname ";
72 for (@params, $retval) {
73 if ($trans{$_} eq "gpointer") {
80 $_ = "INT"; # Unvalidated assumption - please check
87 $funcname = $retval."__".join("_",@params);
89 print OH "gtk_marshal_$funcname\n\n";
90 next if (exists $defs{$funcname});
95 void gtk_marshal_$funcname (GtkObject *object,
102 print OS "typedef $trans{$retval} (*GtkSignal_$funcname) (GtkObject *object, \n";
106 print OS "gpointer arg".$argn."a,\n";
107 print OS "gpointer arg".$argn."b,\n";
110 print OS "$trans{$_} arg".$argn++.",\n" unless $_ eq "NONE";
113 print OS "gpointer user_data);\n";
116 void gtk_marshal_$funcname (GtkObject *object,
121 GtkSignal_$funcname rfunc;
124 if($retval ne "NONE") {
125 print OS " $trans{$retval} *return_val;\n";
127 $retn = scalar @params unless $params[0] eq "NONE";
128 print OS " return_val = GTK_RETLOC_$retval (args[$retn]);\n";
130 print OS " rfunc = (GtkSignal_$funcname) func;\n";
131 print OS " *return_val = " unless $retval eq "NONE";
132 print OS " (* rfunc) (object,\n";
134 for($i = 0; $i < (scalar @params); $i++) {
135 if ($params[$i] eq "SIGNAL") {
137 GTK_VALUE_SIGNAL(args[$i]).f,
138 GTK_VALUE_SIGNAL(args[$i]).d,
140 } elsif ($params[$i] eq "NONE") {
142 print OS " GTK_VALUE_$params[$i](args[$i]),\n";
146 print OS " func_data);\n}\n\n";
152 #endif /* __cplusplus */
154 #endif /* __GTK_MARSHAL_H__ */
157 close(IL); close(OH); close(OS);