]> Pileus Git - ~andy/gtk/blobdiff - gtk/genmarshal.pl
clean up a little
[~andy/gtk] / gtk / genmarshal.pl
index f1c76a986774a314135ed0e9451fcc81e9c6507e..cfde7948b7bdcda39ea1c3d476e5f101866fd429 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/perl -w
 #
 # by Elliot Lee <sopwith@redhat.com>
 
           "ULONG"=>"gulong", "FLOAT"=>"gfloat",
           "DOUBLE"=>"gdouble", "STRING"=>"gpointer",
           "ENUM"=>"gint", "FLAGS"=>"gint",
-          "BOXED"=>"gpointer", "FOREIGN"=>"gpointer",
-          "CALLBACK"=>"gpointer", "POINTER"=>"gpointer",
-          "ARGS"=>"gpointer", "SIGNAL"=>"gpointer",
-          "C_CALLBACK"=>"gpointer");
+          "BOXED"=>"gpointer",
+          "POINTER"=>"gpointer",
+          "OBJECT"=>"gpointer",
 
-open(IL, "<gtkmarshal.list") || die("Open failed: $!");
-open(OH, ">gtkmarshal.h") || die("Open failed: $!");
-open(OS, ">gtkmarshal.c") || die("Open failed: $!");
+# complex types. These need special handling.
+               "SIGNAL"=>"SIGNAL"
+               );
 
-print OH "#ifndef __GTKMARSHAL_H__\n#define __GTKMARSHAL_H__ 1\n\n";
-print OH "#include \"gtktypeutils.h\"\n#include \"gtkobject.h\"\n";
+if ($#ARGV != 2) {
+       die ("Wrong number of arguments given, need <source> <target.h> <target.c>");
+}
+
+open(IL, "<" . $ARGV[0]) || die ("Open failed: $!");
+open(OH, ">" . $ARGV[1]) || die ("Open failed: $!");
+open(OS, ">" . $ARGV[2]) || die ("Open failed: $!");
+
+print OH <<EOT;
+#ifndef __GTK_MARSHAL_H__
+#define __GTK_MARSHAL_H__
+
+#include <gtk/gtktypeutils.h>
+#include <gtk/gtkobject.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
 
-print OS "#include \"gtkmarshal.h\"\n";
+#define gtk_signal_default_marshaller gtk_marshal_NONE__NONE
 
-while(chomp($aline = <IL>)) {
+EOT
+
+print OS qq(#include "gtkmarshal.h"\n\n);
+
+while (defined($aline = <IL>)) {
+  chomp $aline;
   ($retval, $paramlist) = split(/:/, $aline, 2);
   @params = split(/\s*,\s*/, $paramlist);
 
-  if($defs{$retval."__".join("_",@params)} == 1) { next; }
+  my $funcname = $retval."__".join("_",@params);
+  my $defname;
+  
+  next if (exists $defs{$funcname});
 
   $doequiv = 0;
-  foreach(@params) { if($trans{$_} eq "gpointer") { $doequiv = 1; } }
+  for (@params, $retval) { 
+      if ($trans{$_} eq "gpointer" && $_ ne "POINTER") {
+         $doequiv = 1;
+         last;
+      }
+      if($_ eq "ENUM" || $_ eq "UINT" || $_ eq "ULONG") {
+       $doequiv = 1;
+       last;
+      }
+  }
 
-  $defname = "";
+  # Translate all function pointers to gpointer
+  $defname = $funcname;
   if($doequiv) {
-    $defname = $retval."__".join("_",@params);
-    print OH "#define gtk_marshal_".$retval."__".join("_",@params)." ";
-
-    for($i = 0; $i < scalar @params; $i++)
-      { if($trans{$params[$i]} eq "gpointer") { $params[$i] = "POINTER"; } }
-    if($trans{$retval} eq "gpointer") { $retval = "POINTER"; }
-    print OH "gtk_marshal_".$retval."__".join("_",@params)."\n";
-
-    $regname = $retval."__".join("_",@params);
-    if($defs{$regname} == 1) { next; }
-    $defs{$defname} = 1;
+      print OH "#define gtk_marshal_$funcname ";
+      $defs{$defname} = 1;
+      
+      for (@params, $retval) {
+       if ($trans{$_} eq "gpointer") {
+         $_ = "POINTER";
+       }
+       if($_ eq "ENUM") {
+         $_ = "UINT";
+       }
+       if($_ eq "UINT") {
+         $_ = "INT"; # Unvalidated assumption - please check
+       }
+       if($_ eq "ULONG") {
+         $_ = "LONG";
+       }
+      }
+
+      $funcname = $retval."__".join("_",@params);
+
+      print OH "gtk_marshal_$funcname\n\n";
+      next if (exists $defs{$funcname});
   }
+  $defs{$funcname} = 1;  
 
-  $defs{$retval."__".join("_",@params)} = 1;  
-
-  print OH "void gtk_marshal_".$retval."__".join("_",@params)."(GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg *args);\n";
-
-  print OS "typedef ".$trans{$retval}. " (*GtkSignal_"
-    .$retval."__".join("_",@params).")(GtkObject *object, ";
+  print OH <<EOT;
+void gtk_marshal_$funcname (GtkObject    *object, 
+                            GtkSignalFunc func, 
+                            gpointer      func_data, 
+                            GtkArg       *args);
 
+EOT
+  
+  print OS "typedef $trans{$retval} (*GtkSignal_$funcname) (GtkObject *object, \n";
   $argn = 1;
-  foreach $it(@params) { print OS $trans{$it}." arg".$argn++.",\n"; }
+  for (@params) { 
+       if($_ eq "SIGNAL") {
+               print OS "gpointer arg".$argn."a,\n";
+               print OS "gpointer arg".$argn."b,\n";
+               $argn++;
+       } else {
+               print OS "$trans{$_} arg".$argn++.",\n" unless $_ eq "NONE";
+       }
+  }
   print OS "gpointer user_data);\n";
 
-  print OS "void gtk_marshal_".$retval."__".join("_",@params)."(GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg *args)\n";
+  print OS <<EOT;
+void gtk_marshal_$funcname (GtkObject    *object, 
+                            GtkSignalFunc func, 
+                            gpointer      func_data, 
+                            GtkArg       *args)
+{
+  GtkSignal_$funcname rfunc;
+EOT
 
-  print OS "{\nGtkSignal_".$retval."__".join("_",@params)." rfunc;\n";
   if($retval ne "NONE") {
-    print OS $trans{$retval}." *return_val;\n";
-
-    print OS "return_val = GTK_RETLOC_".$retval."(args[".(scalar @params)."]);\n";
+      print OS "  $trans{$retval}  *return_val;\n";
+      $retn = 0;
+      $retn = scalar @params unless $params[0] eq "NONE";
+      print OS "  return_val = GTK_RETLOC_$retval (args[$retn]);\n";
   }
-  print OS "rfunc = (GtkSignal_".$retval."__".join("_",@params).") func;\n";
-
-  if($retval ne "NONE") { print OS "*return_val = "; }
+  print OS "  rfunc = (GtkSignal_$funcname) func;\n";
+  print OS "  *return_val = " unless $retval eq "NONE";
+  print OS                  " (* rfunc) (object,\n";
 
-  print OS "(* rfunc)(object, ";
   for($i = 0; $i < (scalar @params); $i++) {
-    print OS "GTK_VALUE_".$params[$i]."(args[$i]), ";
+      if ($params[$i] eq "SIGNAL") {
+       print OS <<EOT;
+GTK_VALUE_SIGNAL(args[$i]).f,
+GTK_VALUE_SIGNAL(args[$i]).d,
+EOT
+      } elsif ($params[$i] eq "NONE") {
+      } else {
+       print OS "                      GTK_VALUE_$params[$i](args[$i]),\n";
+      }
   }
 
-  print OS "func_data);\n}\n\n";
+  print OS  "                             func_data);\n}\n\n";
 }
-print OH "#endif\n";
+print OH <<EOT;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GTK_MARSHAL_H__ */
+EOT
+
 close(IL); close(OH); close(OS);