aboutsummaryrefslogtreecommitdiffstats
path: root/debian/lib/python/debian_linux/abi.py
blob: 7a0861c3947f5606abb547237448e3677e9410ca (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
81
82
83
84
85
86
87
class symbols(object):
    def __init__(self, filename = None):
        if filename is not None:
            self.read(file(filename))

    def cmp(self, new):
        symbols_ref = set(self.symbols.keys())
        symbols_new = set(new.symbols.keys())

        symbols_add = {}
        symbols_remove = {}

        symbols_change = {}

        for symbol in symbols_new - symbols_ref:
            symbols_add[symbol] = {'module': new.symbols[symbol][0]}

        for symbol in symbols_ref.intersection(symbols_new):
            module_ref, version_ref = self.symbols[symbol]
            module_new, version_new = new.symbols[symbol]

            ent = {}
            if module_ref != module_new:
                ent['module'] = module_ref, module_new
            if version_ref != version_new:
                ent['version'] = version_ref, version_new
            if ent:
                symbols_change[symbol] = ent

        for symbol in symbols_ref - symbols_new:
            symbols_remove[symbol] = {'module': self.symbols[symbol][0]}

        return symbols_add, symbols_change, symbols_remove

    def read(self, file):
        self.modules = {}
        self.symbols = {}

        for line in file.readlines():
            symbol, module, version = line.strip().split()

            symbols = self.modules.get(module, {})
            symbols[symbol] = version
            self.modules[module] = symbols
            if self.symbols.has_key(symbol):
                pass
            self.symbols[symbol] = module, version

    def read_kernel(self, file):
        self.modules = {}
        self.symbols = {}

        for line in file.readlines():
            version, symbol, module = line.strip().split('\t')

            symbols = self.modules.get(module, {})
            symbols[symbol] = version
            self.modules[module] = symbols
            if self.symbols.has_key(symbol):
                pass
            self.symbols[symbol] = module, version

    def write(self, file):
        symbols = self.symbols.items()
        symbols.sort()
        for symbol, i in symbols:
            module, version = i
            file.write("%s %s %s\n" % (symbol, module, version))

    def write_human(self, file):
        modules = self.modules.keys()
        modules.sort()
        modules.remove('vmlinux')

        file.write("Symbols in vmlinux\n\n")
        symbols = self.modules['vmlinux'].items()
        symbols.sort()
        for symbol, version in symbols:
            file.write("%-48s %s\n" % (symbol, version))

        for module in modules:
            file.write("\n\nSymbols in module %s\n\n" % module)
            symbols = self.modules[module].items()
            symbols.sort()
            for symbol, version in symbols:
                file.write("%-48s %s\n" % (symbol, version))