Logoj0ke.net Open Build Service > Projects > GFS > kernel-kdump > modversions
Sign Up | Log In

File modversions of Package kernel-kdump

 
1
#! /usr/bin/perl -w
2
3
use File::Basename;
4
use File::Path;
5
use File::Find;
6
use Getopt::Long;
7
use strict;
8
9
my %symbol_type_name = (
10
    n => 'normal', t => 'typedef', e => 'enum', s => 'struct', u => 'union'
11
);
12
13
my %definitions;
14
my %override;
15
my %override_locally;
16
my %locally_unknown;
17
my %locally_defined;
18
19
sub expand_types($);
20
sub expand_types($) {
21
    my ($definition) = @_;
22
    local ($_, $1, $2);
23
24
    my @defn = split ' ', $definition;
25
    for (@defn[1..$#defn]) {
26
    if (/^(.)#(.*)/) {
27
        #print "<<$defn[0] : $_>>\n";
28
        next if exists $locally_defined{$_};
29
        $locally_defined{$_} = 1;
30
31
        if ($locally_unknown{$_}) {
32
        print "$_ $symbol_type_name{$1} $2 { UNKNOWN } \n";
33
        } else {
34
        if (!exists $definitions{$_}) {
35
            die "Missing definition of $symbol_type_name{$1} $2\n";
36
        }
37
        expand_types("$_ $definitions{$_}");
38
        }
39
    }
40
    }
41
    print "override " if $override_locally{$defn[0]};
42
    print "$definition\n";
43
}
44
45
sub pack_dump($$) {
46
    my ($dir, $ext) = @_;
47
    my @files;
48
49
    $ext = ".symtypes" unless defined $ext;
50
51
    find(sub ($) { /\Q$ext\E$/ && push @files, $File::Find::name}, $dir);
52
    map { s/^\Q$dir\E\/(.*)\Q$ext\E$/$1/ } @files;
53
54
    foreach my $file (sort @files) {
55
    print "/* $file.o */\n";
56
57
    local *FD;
58
    open FD, "< $dir/$file$ext"
59
        or die "$dir/$file$ext: $!\n";
60
    while (<FD>) {
61
        chomp;
62
63
        my $override = "";
64
        if (s/^override //) {
65
        $override = $&;
66
        }
67
68
        if (/^(\S)#(\S+)\s*(.*)/) {
69
        my $sym = "$1#$2";
70
        my $definition = $3;
71
72
        if (/^$sym\s+$symbol_type_name{$1}\s+$2\s+{\s+UNKNOWN\s+}\s*$/) {
73
            $_ = $override . substr($sym, 0, 1) . "##" . substr($sym, 2);
74
        } else {
75
            if (exists $definitions{$sym} && $definitions{$sym} eq $definition) {
76
            if (($override ne "") == (exists $override{$sym})) {
77
                next;
78
            }
79
            $_ = "$override$sym";
80
            } else {
81
            $definitions{$sym} = $definition;
82
            if ($override eq "") {
83
                delete $override{$sym};
84
            } else {
85
                $override{$sym} = 1;
86
            }
87
            }
88
        }
89
        }
90
        print "$_\n";
91
    }
92
    close FD;
93
    print "\n";
94
    }
95
}
96
97
sub unpack_dump($$) {
98
    my ($dir, $ext) = @_;
99
100
    $ext = ".symref" unless defined $ext;
101
102
    while (<STDIN>) {
103
    next if /^$/;
104
    chomp;
105
106
    if (/^\/\* (.*)\.o \*\//) {
107
        close STDOUT;
108
        mkpath(dirname("$dir/$1$ext"));
109
        open STDOUT, "> $dir/$1$ext"
110
        or die "$dir/$1$ext: $!\n";
111
        %locally_defined = ();
112
        %locally_unknown = ();
113
        %override_locally = %override;
114
        next;
115
    }
116
117
    my $override = /^override\s/;
118
119
    if (/^([^ ])#(#?)([^ ]+) *(.*)$/) {
120
        my $sym = "$1#$3";
121
122
        if ($4 ne "") {
123
        if (/\s+{\s+UNKNOWN\s+}\s*$/) {
124
            $locally_unknown{$sym} = 1;
125
            $override_locally{$sym} = $override;
126
        } else {
127
            $definitions{$sym} = $4;
128
            $locally_unknown{$sym} = 0;
129
            $override{$sym} = $override;
130
            $override_locally{$sym} = $override;
131
        }
132
        } else {
133
        $locally_unknown{$sym} = ($2 ne "");
134
        $override_locally{$sym} = $override;
135
        }
136
        next;
137
    }
138
    expand_types($_);
139
    }
140
}
141
142
my ($pack, $unpack, $ext);
143
GetOptions("pack" => \$pack, "unpack" => \$unpack, "ext:s" => \$ext)
144
    && ($pack || $unpack) && @ARGV == 1
145
    or die "USAGE:\t$0 [--ext extension] --pack {dir} > file\n" .
146
         "\t$0 [--ext extension] --unpack {dir} < file\n";
147
148
pack_dump($ARGV[0], $ext) if $pack;
149
unpack_dump($ARGV[0], $ext) if $unpack;
150