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