mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-31 19:20:26 +00:00
Newer versions of Python raise a SyntaxWarning when a regular expression contains a backslash that is not part of an escape sequence. To prevent this warning and future exceptions, use raw strings for all regular expressions. Even strings without escape sequences are converted for consistency. Some IDEs will apply special syntax highlighting to raw strings, which can make it easier to decipher regular expressions.
112 lines
3.4 KiB
Python
Executable File
112 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import fileinput
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../../')
|
|
|
|
defines_to_add = []
|
|
defines_to_remove = []
|
|
|
|
# dictionary with existing lines as keys, and new text as value
|
|
lines_to_replace = {}
|
|
|
|
def get_line_ending(full_path):
|
|
with open(full_path, "r", newline='') as fin:
|
|
line = fin.readline()
|
|
if line.endswith('\r\n'):
|
|
return '\r\n'
|
|
if line.endswith('\r'):
|
|
return '\r'
|
|
return '\n'
|
|
|
|
|
|
def configuration_from_block(block, line_ending):
|
|
global defines_to_add, defines_to_remove
|
|
configuration = ""
|
|
|
|
if len(block) == 0:
|
|
return ""
|
|
|
|
for item in defines_to_remove:
|
|
if item in block:
|
|
block.remove(item)
|
|
|
|
defines_processed = []
|
|
for item in temp_defines_to_add:
|
|
if item in block:
|
|
defines_processed.append(item)
|
|
continue
|
|
|
|
if len(block) > 0:
|
|
prefix = block[0].split("_")[0]
|
|
if item.startswith(prefix):
|
|
block.append(item)
|
|
defines_processed.append(item)
|
|
|
|
for item in defines_processed:
|
|
temp_defines_to_add.remove(item)
|
|
|
|
block.sort()
|
|
for item in block:
|
|
configuration += ("#define %s%s" % (item, line_ending))
|
|
|
|
configuration += ("%s" % (line_ending))
|
|
return configuration
|
|
|
|
def read_and_update_configuration(full_path, line_ending):
|
|
global lines_to_replace, temp_defines_to_add
|
|
|
|
configuration = ""
|
|
block = []
|
|
temp_defines_to_add = defines_to_add.copy()
|
|
|
|
with open(full_path, "rt") as fin:
|
|
for unstripped_line in fin:
|
|
line = unstripped_line.strip()
|
|
|
|
if not line:
|
|
if len(block) == 0:
|
|
# we have newline to deal with
|
|
configuration += line_ending
|
|
else:
|
|
configuration += configuration_from_block(block, line_ending)
|
|
block = []
|
|
else:
|
|
if line in lines_to_replace.keys():
|
|
configuration += ("%s%s" % (lines_to_replace[line], line_ending))
|
|
continue
|
|
|
|
parts = re.match(r"#define\s*(.*)", line)
|
|
if parts:
|
|
block.append(parts[1])
|
|
else:
|
|
# if commented code follows directly block, process block, and start a new one
|
|
configuration += configuration_from_block(block, line_ending)
|
|
block = []
|
|
configuration += ("%s%s" % (line, line_ending))
|
|
|
|
if len(temp_defines_to_add) > 0:
|
|
print("Cannot add defines: \n- " + "\n- ".join(temp_defines_to_add))
|
|
print("ABORT")
|
|
sys.exit(10)
|
|
|
|
# if end of file could not be detected, process last block
|
|
configuration += configuration_from_block(block, line_ending)
|
|
return configuration
|
|
|
|
def write_configuration(full_path, config_file):
|
|
with open(full_path, "wb") as fout:
|
|
bytes = configuration.encode('utf-8')
|
|
fout.write(bytes)
|
|
|
|
|
|
for root, dirs, files in os.walk(btstack_root, topdown=True):
|
|
for f in files:
|
|
if f.endswith("btstack_config.h"):
|
|
config_file = root + "/" + f
|
|
line_ending = get_line_ending(config_file)
|
|
configuration = read_and_update_configuration(config_file, line_ending)
|
|
write_configuration(config_file, configuration)
|