btstack/tool/misc/fix-misra-12.1.py
David Lechner 73677349c9 tool: consistently use raw strings for regular expressions
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.
2025-01-22 08:40:56 +01:00

71 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import sys
import re
import fileinput
import string
# find root
btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../../')
print(btstack_root)
# messages
cstat_file = 'cstat.txt'
# project prefix
project_prefix = 'c:\\projects\\iar\\btstack\\btstack\\'
def remove_whitespace(line):
return line.replace(' ','')
def add_parantheses(line, expression):
stripped_line = ''
positions = []
for (char,pos) in zip(line, range(len(line))):
if char in string.whitespace:
continue
stripped_line += char
positions.append(pos)
pos = stripped_line.find(expression)
if pos < 0:
return line
pos_start = positions[pos]
pos_end = positions[pos + len(expression)-1]
new_line = line[0:pos_start] + '(' + line[pos_start:pos_end+1] + ")" + line[pos_end+1:]
return new_line
def fix(path, lineno, expression):
full_path = btstack_root + "/" + path
print(full_path, lineno, expression)
for line in fileinput.input(full_path, inplace=True):
if fileinput.lineno() == lineno:
line = add_parantheses(line, expression)
sys.stdout.write(line)
with open(cstat_file, 'rt') as fin:
fixed = 0
total = 0
for line in fin:
chunks = line.strip().split('\t')
if len(chunks) != 4: continue
(msg, rule, severity, location) = chunks
if not rule.startswith('MISRAC2012-Rule-12.1'): continue
parts = re.match(r".*Suggest parentheses.*`(.*)'", msg)
total += 1
expression = parts.groups()[0]
expression = remove_whitespace(expression)
# skip some expressions
if expression.endswith('=='): continue
if expression.endswith('!='): continue
if expression.endswith('>'): continue
if expression.endswith('<'): continue
if expression.endswith('>='): continue
if expression.endswith('<='): continue
# remove windows prefix
location = location.replace(project_prefix, '').replace('\\','/')
parts = location.split(':')
(path, lineno) = parts
fix(path, int(lineno), expression)
fixed += 1
print ("Fixed %u of %u messsages" % (fixed, total))