xref: /btstack/tool/misc/update_btstack_config.py (revision a9d074b9dba9c5bd38d1842c8f19c00e3a437aa8)
1da3afb49SMilanka Ringwald#!/usr/bin/env python3
2da3afb49SMilanka Ringwaldimport fileinput
3da3afb49SMilanka Ringwaldimport os
4da3afb49SMilanka Ringwaldimport re
5da3afb49SMilanka Ringwaldimport sys
6da3afb49SMilanka Ringwald
741e404d3SMilanka Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../../')
841e404d3SMilanka Ringwald
9da3afb49SMilanka Ringwalddefines_to_add = []
10da3afb49SMilanka Ringwalddefines_to_remove = []
11da3afb49SMilanka Ringwald
12da3afb49SMilanka Ringwald# dictionary with existing lines as keys, and new text as value
13da3afb49SMilanka Ringwaldlines_to_replace = {}
14da3afb49SMilanka Ringwald
15da3afb49SMilanka Ringwalddef get_line_ending(full_path):
16da3afb49SMilanka Ringwald    with open(full_path, "r", newline='') as fin:
17da3afb49SMilanka Ringwald        line = fin.readline()
18da3afb49SMilanka Ringwald        if line.endswith('\r\n'):
19da3afb49SMilanka Ringwald            return '\r\n'
20da3afb49SMilanka Ringwald        if line.endswith('\r'):
21da3afb49SMilanka Ringwald            return '\r'
22da3afb49SMilanka Ringwald        return '\n'
23da3afb49SMilanka Ringwald
24da3afb49SMilanka Ringwald
25da3afb49SMilanka Ringwalddef configuration_from_block(block, line_ending):
26da3afb49SMilanka Ringwald    global defines_to_add, defines_to_remove
27da3afb49SMilanka Ringwald    configuration = ""
28da3afb49SMilanka Ringwald
29da3afb49SMilanka Ringwald    if len(block) == 0:
30da3afb49SMilanka Ringwald        return ""
31da3afb49SMilanka Ringwald
32da3afb49SMilanka Ringwald    for item in defines_to_remove:
33da3afb49SMilanka Ringwald        if item in block:
34da3afb49SMilanka Ringwald            block.remove(item)
35da3afb49SMilanka Ringwald
36*a9d074b9SMatthias Ringwald    defines_processed = []
37da3afb49SMilanka Ringwald    for item in temp_defines_to_add:
38da3afb49SMilanka Ringwald        if item in block:
39*a9d074b9SMatthias Ringwald            defines_processed.append(item)
40da3afb49SMilanka Ringwald            continue
41da3afb49SMilanka Ringwald
42da3afb49SMilanka Ringwald        if len(block) > 0:
43da3afb49SMilanka Ringwald            prefix = block[0].split("_")[0]
44da3afb49SMilanka Ringwald            if item.startswith(prefix):
45da3afb49SMilanka Ringwald                block.append(item)
46*a9d074b9SMatthias Ringwald                defines_processed.append(item)
47*a9d074b9SMatthias Ringwald
48*a9d074b9SMatthias Ringwald    for item in defines_processed:
49da3afb49SMilanka Ringwald        temp_defines_to_add.remove(item)
50da3afb49SMilanka Ringwald
51da3afb49SMilanka Ringwald    block.sort()
52da3afb49SMilanka Ringwald    for item in block:
53da3afb49SMilanka Ringwald        configuration += ("#define %s%s" % (item, line_ending))
54da3afb49SMilanka Ringwald
55da3afb49SMilanka Ringwald    configuration += ("%s" % (line_ending))
56da3afb49SMilanka Ringwald    return configuration
57da3afb49SMilanka Ringwald
58da3afb49SMilanka Ringwalddef read_and_update_configuration(full_path, line_ending):
59da3afb49SMilanka Ringwald    global lines_to_replace, temp_defines_to_add
60da3afb49SMilanka Ringwald
61da3afb49SMilanka Ringwald    configuration = ""
62da3afb49SMilanka Ringwald    block = []
63da3afb49SMilanka Ringwald    temp_defines_to_add = defines_to_add.copy()
64da3afb49SMilanka Ringwald
65da3afb49SMilanka Ringwald    with open(full_path, "rt") as fin:
66da3afb49SMilanka Ringwald        for unstripped_line in fin:
67da3afb49SMilanka Ringwald            line = unstripped_line.strip()
68da3afb49SMilanka Ringwald
69da3afb49SMilanka Ringwald            if not line:
70da3afb49SMilanka Ringwald                if len(block) == 0:
71da3afb49SMilanka Ringwald                    # we have newline to deal with
72da3afb49SMilanka Ringwald                    configuration += line_ending
73da3afb49SMilanka Ringwald                else:
74da3afb49SMilanka Ringwald                    configuration += configuration_from_block(block, line_ending)
75da3afb49SMilanka Ringwald                block = []
76da3afb49SMilanka Ringwald            else:
77da3afb49SMilanka Ringwald                if line in lines_to_replace.keys():
78da3afb49SMilanka Ringwald                    configuration += ("%s%s" % (lines_to_replace[line], line_ending))
79da3afb49SMilanka Ringwald                    continue
80da3afb49SMilanka Ringwald
81da3afb49SMilanka Ringwald                parts = re.match("#define\\s*(.*)", line)
82da3afb49SMilanka Ringwald                if parts:
83da3afb49SMilanka Ringwald                    block.append(parts[1])
84da3afb49SMilanka Ringwald                else:
85da3afb49SMilanka Ringwald                    # if commented code follows directly block, process block, and start a new one
86da3afb49SMilanka Ringwald                    configuration += configuration_from_block(block, line_ending)
87da3afb49SMilanka Ringwald                    block = []
88da3afb49SMilanka Ringwald                    configuration += ("%s%s" % (line, line_ending))
89da3afb49SMilanka Ringwald
90da3afb49SMilanka Ringwald    if len(temp_defines_to_add) > 0:
91*a9d074b9SMatthias Ringwald        print("Cannot add defines: \n- " + "\n- ".join(temp_defines_to_add))
92*a9d074b9SMatthias Ringwald        print("ABORT")
93da3afb49SMilanka Ringwald        sys.exit(10)
94da3afb49SMilanka Ringwald
95da3afb49SMilanka Ringwald    # if end of file could not be detected, process last block
96da3afb49SMilanka Ringwald    configuration += configuration_from_block(block, line_ending)
97da3afb49SMilanka Ringwald    return configuration
98da3afb49SMilanka Ringwald
99da3afb49SMilanka Ringwalddef write_configuration(full_path, config_file):
100da3afb49SMilanka Ringwald    with open(full_path, "wb") as fout:
101da3afb49SMilanka Ringwald        bytes = configuration.encode('utf-8')
102da3afb49SMilanka Ringwald        fout.write(bytes)
103da3afb49SMilanka Ringwald
104da3afb49SMilanka Ringwald
105da3afb49SMilanka Ringwaldfor root, dirs, files in os.walk(btstack_root, topdown=True):
106da3afb49SMilanka Ringwald    for f in files:
107da3afb49SMilanka Ringwald        if f.endswith("btstack_config.h"):
108da3afb49SMilanka Ringwald            config_file = root + "/" + f
109da3afb49SMilanka Ringwald            line_ending = get_line_ending(config_file)
110da3afb49SMilanka Ringwald            configuration = read_and_update_configuration(config_file, line_ending)
111da3afb49SMilanka Ringwald            write_configuration(config_file, configuration)
112