]> Pileus Git - ~andy/gtk/blob - gtk/genmarshal.pl
use PRIORITY_VALIDATE
[~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",
12            "POINTER"=>"gpointer",
13            "OBJECT"=>"gpointer",
14
15 # complex types. These need special handling.
16                 "SIGNAL"=>"SIGNAL"
17                 );
18
19 if ($#ARGV != 2) {
20         die ("Wrong number of arguments given, need <source> <target.h> <target.c>");
21 }
22
23 open(IL, "<" . $ARGV[0]) || die ("Open failed: $!");
24 open(OH, ">" . $ARGV[1]) || die ("Open failed: $!");
25 open(OS, ">" . $ARGV[2]) || die ("Open failed: $!");
26
27 print OH <<EOT;
28 #ifndef __GTK_MARSHAL_H__
29 #define __GTK_MARSHAL_H__
30
31 #include <gtk/gtktypeutils.h>
32 #include <gtk/gtkobject.h>
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif /* __cplusplus */
37
38 #define gtk_signal_default_marshaller gtk_marshal_NONE__NONE
39
40 EOT
41
42 print OS qq(#include "gtkmarshal.h"\n\n);
43
44 while (defined($aline = <IL>)) {
45   chomp $aline;
46   ($retval, $paramlist) = split(/:/, $aline, 2);
47   @params = split(/\s*,\s*/, $paramlist);
48
49   my $funcname = $retval."__".join("_",@params);
50   my $defname;
51   
52   next if (exists $defs{$funcname});
53
54   $doequiv = 0;
55   for (@params, $retval) { 
56       if ($trans{$_} eq "gpointer" && $_ ne "POINTER") {
57           $doequiv = 1;
58           last;
59       }
60       if($_ eq "ENUM" || $_ eq "UINT" || $_ eq "ULONG") {
61         $doequiv = 1;
62         last;
63       }
64   }
65
66   # Translate all function pointers to gpointer
67   $defname = $funcname;
68   if($doequiv) {
69       print OH "#define gtk_marshal_$funcname ";
70       $defs{$defname} = 1;
71       
72       for (@params, $retval) {
73         if ($trans{$_} eq "gpointer") {
74           $_ = "POINTER";
75         }
76         if($_ eq "ENUM") {
77           $_ = "UINT";
78         }
79         if($_ eq "UINT") {
80           $_ = "INT"; # Unvalidated assumption - please check
81         }
82         if($_ eq "ULONG") {
83           $_ = "LONG";
84         }
85       }
86
87       $funcname = $retval."__".join("_",@params);
88
89       print OH "gtk_marshal_$funcname\n\n";
90       next if (exists $defs{$funcname});
91   }
92   $defs{$funcname} = 1;  
93
94   print OH <<EOT;
95 void gtk_marshal_$funcname (GtkObject    *object, 
96                             GtkSignalFunc func, 
97                             gpointer      func_data, 
98                             GtkArg       *args);
99
100 EOT
101   
102   print OS "typedef $trans{$retval} (*GtkSignal_$funcname) (GtkObject *object, \n";
103   $argn = 1;
104   for (@params) { 
105         if($_ eq "SIGNAL") {
106                 print OS "gpointer arg".$argn."a,\n";
107                 print OS "gpointer arg".$argn."b,\n";
108                 $argn++;
109         } else {
110                 print OS "$trans{$_} arg".$argn++.",\n" unless $_ eq "NONE";
111         }
112   }
113   print OS "gpointer user_data);\n";
114
115   print OS <<EOT;
116 void gtk_marshal_$funcname (GtkObject    *object, 
117                             GtkSignalFunc func, 
118                             gpointer      func_data, 
119                             GtkArg       *args)
120 {
121   GtkSignal_$funcname rfunc;
122 EOT
123
124   if($retval ne "NONE") {
125       print OS "  $trans{$retval}  *return_val;\n";
126       $retn = 0;
127       $retn = scalar @params unless $params[0] eq "NONE";
128       print OS "  return_val = GTK_RETLOC_$retval (args[$retn]);\n";
129   }
130   print OS "  rfunc = (GtkSignal_$funcname) func;\n";
131   print OS "  *return_val = " unless $retval eq "NONE";
132   print OS                  " (* rfunc) (object,\n";
133
134   for($i = 0; $i < (scalar @params); $i++) {
135       if ($params[$i] eq "SIGNAL") {
136         print OS <<EOT;
137 GTK_VALUE_SIGNAL(args[$i]).f,
138 GTK_VALUE_SIGNAL(args[$i]).d,
139 EOT
140       } elsif ($params[$i] eq "NONE") {
141       } else {
142         print OS "                      GTK_VALUE_$params[$i](args[$i]),\n";
143       }
144   }
145
146   print OS  "                             func_data);\n}\n\n";
147 }
148 print OH <<EOT;
149
150 #ifdef __cplusplus
151 }
152 #endif /* __cplusplus */
153
154 #endif /* __GTK_MARSHAL_H__ */
155 EOT
156
157 close(IL); close(OH); close(OS);