summaryrefslogtreecommitdiff
path: root/gtk/genmarshal.pl
blob: 7738ca05317b3d0217dbbcec7a92874171c18a7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/perl
#
# by Elliot Lee <sopwith@redhat.com>

%trans = ( "NONE"=>"void", "CHAR"=>"char",
	   "BOOL"=>"gboolean", "INT"=>"gint",
	   "UINT"=>"guint", "LONG"=>"glong",
	   "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");

open(IL, "<".$ENV{'srcdir'}."/gtkmarshal.list") || die("Open failed: $!");
open(OH, ">gtkmarshal.h") || die("Open failed: $!");
open(OS, ">gtkmarshal.c") || die("Open failed: $!");

print OH "#ifndef __GTKMARSHAL_H__\n#define __GTKMARSHAL_H__ 1\n\n";
print OH "#include \"gtktypeutils.h\"\n#include \"gtkobject.h\"\n";

print OS "#include \"gtkmarshal.h\"\n";

while(chomp($aline = <IL>)) {
  ($retval, $paramlist) = split(/:/, $aline, 2);
  @params = split(/\s*,\s*/, $paramlist);

  if($defs{$retval."__".join("_",@params)} == 1) { next; }

  $doequiv = 0;
  foreach(@params) { if($trans{$_} eq "gpointer") { $doequiv = 1; } }

  $defname = "";
  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;
  }

  $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, ";

  $argn = 1;
  foreach $it(@params) { print OS $trans{$it}." arg".$argn++.",\n"; }
  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 "{\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 "rfunc = (GtkSignal_".$retval."__".join("_",@params).") func;\n";

  if($retval ne "NONE") { print OS "*return_val = "; }

  print OS "(* rfunc)(object, ";
  for($i = 0; $i < (scalar @params); $i++) {
    print OS "GTK_VALUE_".$params[$i]."(args[$i]), ";
  }

  print OS "func_data);\n}\n\n";
}
print OH "#endif\n";
close(IL); close(OH); close(OS);