103 lines
4.3 KiB
Python
103 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
|
# Copyright (c) 2017-2018 The PIVX developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
import os, sys
|
|
from subprocess import check_output
|
|
|
|
def countRelevantCommas(line):
|
|
openParensPosStack = []
|
|
openParensPos = 0
|
|
charCounter = 0
|
|
numRelevantCommas = 0
|
|
firstOpenParensIndex = line.find("(")
|
|
|
|
for char in line:
|
|
if char == '(':
|
|
openParensPosStack.append(charCounter)
|
|
|
|
if char == ')':
|
|
openParensPosStack.pop()
|
|
|
|
if char == "," and openParensPosStack[-1] == firstOpenParensIndex:
|
|
numRelevantCommas += 1
|
|
charCounter += 1
|
|
|
|
return numRelevantCommas
|
|
|
|
if __name__ == "__main__":
|
|
out = check_output("git rev-parse --show-toplevel", shell=True, universal_newlines=True)
|
|
srcDir = out.rstrip() + "/src/"
|
|
|
|
filelist = [os.path.join(dp, f) for dp, dn, filenames in os.walk(srcDir) for f in filenames if os.path.splitext(f)[1] == '.cpp' or os.path.splitext(f)[1] == '.h' ]
|
|
incorrectInstanceCounter = 0
|
|
|
|
for file in filelist:
|
|
f = open(file,"r", encoding="utf-8")
|
|
data = f.read()
|
|
rows = data.split("\n")
|
|
count = 0
|
|
full_data = []
|
|
lineCounter = 1
|
|
|
|
tempLine = ""
|
|
tempCount = 0
|
|
|
|
for row in rows:
|
|
# Collapse multiple lines into one
|
|
tempLine += row
|
|
|
|
# Line contains LogPrint or LogPrintf
|
|
if tempLine.find("LogPrint") != -1:
|
|
if tempLine.count("(") == tempLine.count(")"):
|
|
havePercents = tempLine.count('%') > 0
|
|
|
|
if havePercents:
|
|
# This line of code has a format specifier that requires checking number of associated arguments
|
|
# Determine the number of arguments provided, see if that matches the number of format specifiers
|
|
# Count the number of commas after the format specifier string. Check to see if it matches the number of format specifiers.
|
|
# Assumes quotes are not escaped in the specifier string and there are no percent signs when specifying the debug level.
|
|
|
|
# First, determine the position of the comma after the format specifier section, named commaAfterEndSpecifierStringIndex
|
|
firstSpecifierIndex = tempLine.find('%')
|
|
startSpecifierStringIndex = tempLine.rfind('"',firstSpecifierIndex)
|
|
endSpecifierStringIndex = tempLine.find('"',firstSpecifierIndex)
|
|
commaAfterEndSpecifierStringIndex = tempLine.find(',',endSpecifierStringIndex)
|
|
|
|
# Count the number of commas after the specifier string
|
|
line = "(" + tempLine[commaAfterEndSpecifierStringIndex:-1]
|
|
numCommas = countRelevantCommas(line)
|
|
|
|
# Determine number of extra percents after specifier string
|
|
numExtraPercents = tempLine.count('%', commaAfterEndSpecifierStringIndex)
|
|
|
|
# Subtract extra from total count. This is the number of expected specifiers
|
|
# ignore %%
|
|
numPercents = tempLine.count('%') - numExtraPercents - 2*tempLine.count('%%')
|
|
|
|
if numPercents != numCommas:
|
|
print("Incorrect number of arguments for LogPrint(f) statement found.")
|
|
print(str(file) + ":" + str(lineCounter - tempCount))
|
|
print("Line = " + tempLine)
|
|
print("numRelevantCommas = " + str(numCommas) + ", numRelevantPercents = " + str(numPercents))
|
|
print("")
|
|
|
|
incorrectInstanceCounter += 1
|
|
|
|
# Done with this multiline, clear tempLine
|
|
tempLine = ""
|
|
tempCount = 0
|
|
else:
|
|
tempCount += 1
|
|
else:
|
|
# No LogPrint, clear tempLine
|
|
tempLine = ""
|
|
tempCount = 0
|
|
|
|
lineCounter += 1
|
|
|
|
print("# of incorrect instances: " + str(incorrectInstanceCounter))
|
|
|
|
sys.exit(incorrectInstanceCounter)
|