blob: 1a6d3ecf03b34aded6ad3e52ef5602b85b11471d [file] [log] [blame]
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
#calculate structure sizes listed in pod/modperl_sizeof.pod via sizeof()
use strict;
use ExtUtils::Embed;
use Config;
my $file = shift || 'pod/modperl_sizeof.pod';
open my $pod, $file or die "open $file: $!";
FINDSTRUCT: {
while (<$pod>) {
next unless /^\s*(\w+)\s*=\s*\{/;
my $name = $1;
my $size = sizeof($name, $pod);
print "sizeof $name => $size\n";
redo FINDSTRUCT;
}
}
sub sizeof {
my($struct, $h) = @_;
my @elts;
while (<$h>) {
last if /^\s*\}\;$/;
next unless m:(\w+).*?//\s*(.*):;
push @elts, "sizeof($2) /* $1 */";
}
my $name = "perl_sizeof_$struct";
my $tmpfile = "$name.c";
open my $fh, '>', $tmpfile or die "open $tmpfile: $!";
local $" = " + \n";
print $fh <<EOF;
#include <stdio.h>
#define PERLIO_NOT_STDIO 0
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#undef fprintf
int main(void) {
int size = @elts;
fprintf(stdout, "%d", size);
return 1;
}
EOF
my $opts = ccopts();
system "$Config{cc} -o $name $tmpfile $opts";
my $size = `$name`;
unlink $name, $tmpfile;
return $size;
}