10 %optctl = (includes => \$INCLUDES);
12 GetOptions(\%optctl, "includes=s");
16 die "Can't find file \"$file\""
19 my $parser = new XML::Parser(ErrorContext => 2);
24 open OUTPUT, ">dump-sizes.c" || die "Cannot open dump-sizes.c: $!\n";
31 main (int argc, char *argv[])
35 $parser->setHandlers(Start => \&start_handler,
36 End => \&end_handler);
38 $parser->parsefile($file);
48 $CC = $ENV{CC} ? $ENV{CC} : "gcc";
49 $LD = $ENV{LD} ? $ENV{LD} : $CC;
50 $CFLAGS = $ENV{CFLAGS} ? $ENV{CFLAGS} : "";
51 $LDFLAGS = $ENV{LDFLAGS} ? $ENV{LDFLAGS} : "";
54 if ($CC =~ /libtool/) {
55 $o_file = "dump-sizes.lo"
57 $o_file = "dump-sizes.o"
60 $command = "$CC $CFLAGS -c -o $o_file dump-sizes.c && $LD -o dump-sizes $o_file $LDFLAGS";
62 system($command) == 0 or die "Compilation failed\n";
64 system("./dump-sizes > sizes.out") == 0 or die "Scan failed\n";
66 #unlink "./dump-sizes.c", "./dump-sizes.o", "./dump-sizes.lo", "./dump-sizes";
70 open SIZES, "<sizes.out" || die "Can't open sizes.out: $!";
72 if (m/(\w*) (\w*) (\d*)/) {
73 $Sizes{$1 . "." . $2} = $3;
79 open OUTPUT2, ">$file.new" || die "Cannot open $file.new: $!\n";
81 $parser->setHandlers(Start => \&dump_start_handler,
82 End => \&dump_end_handler);
84 $parser->parsefile($file);
100 if ($att eq "name") {
103 elsif ($att eq "cname") {
106 elsif ($att eq "class") {
111 if (($el eq "object") || ($el eq "interface")) {
112 if (!($cname eq "")) {
113 $structname = $cname;
119 if (!($class eq "")) {
122 elsif ($el eq "object") {
123 $classname = $structname . "Class";
126 $classname = $structname . "Iface";
129 elsif ($el eq "field") {
130 if (!($cname eq "")) {
131 need_offset ($structname, $cname);
134 need_offset ($structname, $name);
137 elsif ($el eq "vfunc") {
138 if (!($cname eq "")) {
139 need_offset ($classname, $cname);
142 need_offset ($classname, $name);
152 if (($el eq "object") ||
153 ($el eq "interface") ||
167 print OUTPUT " g_print (\"$struct $name %d\\n\", G_STRUCT_OFFSET ($struct, $name));\n";
175 print OUTPUT2 " offset=\"" . $Sizes{$struct . "." . $name } . "\""
178 sub dump_start_handler
186 print OUTPUT2 "<$el";
192 print OUTPUT2 " $att=\"$val\"";
194 if ($att eq "name") {
197 elsif ($att eq "cname") {
200 elsif ($att eq "class") {
205 if (($el eq "object") || ($el eq "interface")) {
206 if (!($cname eq "")) {
207 $structname = $cname;
213 if (!($class eq "")) {
216 elsif ($el eq "object") {
217 $classname = $structname . "Class";
220 $classname = $structname . "Iface";
223 elsif ($el eq "field") {
224 if (!($cname eq "")) {
225 write_offset ($structname, $cname);
228 write_offset ($structname, $name);
231 elsif ($el eq "vfunc") {
232 if (!($cname eq "")) {
233 write_offset ($classname, $cname);
236 write_offset ($classname, $name);
247 if (($el eq "object") ||
248 ($el eq "interface") ||
256 print OUTPUT2 "</$el>\n";