aboutsummaryrefslogtreecommitdiff
path: root/sort-library.py
blob: 331c81a027cc8fd644675754f94fd65753930ca3 (plain) (blame)
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
#!/usr/bin/env python

"""
Sort the library file like KiCad does, to minimize diffs
"""

import os
import re
import sys
import pprint

def chunk_file(fd):
    res = []
    for this in fd.readlines():
        res += [this]
        if this.startswith('ENDDEF'):
            if res[0] != '#\n':
                res = ['#\n'] + res
            name = res[1].split(' ')[1][:-1]
            yield(name, ''.join(res))
            res = []


def sort_symbols(fn_in, fn_out, refdes):
    in_ = open(fn_in)
    out = open(fn_out, 'w')
    fn = os.path.basename(fn_in)
    print('Remapping symbols in in {}'.format(fn))
    header = in_.readline() + in_.readline()
    symbols = {}
    for k, v in sorted(chunk_file(in_)):
        symbols[k] = v

    out.write(header)
    for k in sorted(symbols.keys()):
        out.write(symbols[k])
    out.write('#End Library\n')
    return True


def main(libs):
    refdes = {}
    for this in sorted(libs):
        if sort_symbols(this, this + '.tmp', refdes):
            os.rename(this + '.tmp', this)

    return True


if __name__ == '__main__':
    try:
        if len(sys.argv) == 0:
            sys.stderr.write('Syntax: sort-symbols.py *.lib\n')
            sys.exit(1)
        libs = [x for x in sys.argv if x.endswith('.lib')]
        res = main(libs)
        if res:
            sys.exit(0)
        sys.exit(1)
    except KeyboardInterrupt:
        pass