File: sizeof.pl

package info (click to toggle)
libapache2-mod-perl2 2.0.9~1624218-2%2Bdeb8u2
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 11,912 kB
  • ctags: 4,588
  • sloc: perl: 95,064; ansic: 14,527; makefile: 49; sh: 18
file content (62 lines) | stat: -rw-r--r-- 1,302 bytes parent folder | download | duplicates (7)
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
# 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;
}