From 620c6e8f1cd9c1e8bdb4166b69debf19cdcf274e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 25 Jan 2016 13:41:27 +0100 Subject: [PATCH] reduce: improved removing of code blocks. loop until nothing is removed. --- tools/reduce.py | 118 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 89 insertions(+), 29 deletions(-) diff --git a/tools/reduce.py b/tools/reduce.py index c5c6c7578..b049add8d 100644 --- a/tools/reduce.py +++ b/tools/reduce.py @@ -84,6 +84,21 @@ def replaceandrun2(what, filedata, i, line1, line2): filedata[i] = bak1 filedata[i+1] = bak2 +def clearandrun(what, filedata, i1, i2): + print(what + ' ' + str(i1+1) + '/' + str(len(filedata)) + '..') + filedata2 = list(filedata) + i = i1 + while i <= i2 and i < len(filedata2): + filedata2[i] = '' + i = i + 1 + writefile(FILE, filedata2) + if runtool() == True: + print('pass') + writefile(BACKUPFILE, filedata2) + return filedata2 + print('fail') + return filedata + def removecomments(filedata): for i in range(len(filedata)): line = filedata[i] @@ -184,6 +199,43 @@ def removeemptyblocks(filedata): if checkpar(fd1) and fd1.endswith('{') and fd2 == '}': replaceandrun2('remove block', filedata, i, '', '') +def removeblocks(filedata): + if len(filedata) < 3: + return filedata + + for i in range(len(filedata)): + strippedline = filedata[i].strip() + if len(strippedline)==0: + continue + if strippedline[-1] != '}' and strippedline[-1] != ';': + continue + + i1 = i + 1 + while i1 < len(filedata) and filedata[i1].startswith('#'): + i1 = i1 + 1 + + i2 = i1 + indent = 0 + while i2 < len(filedata): + for c in filedata[i2]: + if c == '}': + indent = indent - 1 + if indent <= 0: + break + elif c == '{': + indent = indent + 1 + i2 = i2 + 1 + if i2 == i1 or i2 >= len(filedata): + continue + if filedata[i2].strip() != '}' and filedata[i2].strip() != '};': + continue + if indent < 0: + i2 = i2 - 1 + filedata = clearandrun('remove codeblock', filedata, i1, i2) + + return filedata + + def removenamespaces(filedata): if len(filedata) < 3: return filedata @@ -208,26 +260,20 @@ def removenamespaces(filedata): if strippedline.find('}') < 0 and strippedline.find('{') == len(strippedline)-1: i2 = i + 1 - level = 1 - while i2 < len(filedata) and level > 0: + indent = 1 + while i2 < len(filedata) and indent > 0: #print(str(i2)+':'+str(level)+':'+filedata[i2]) for c in filedata[i2]: if c == '}': - level = level - 1 - if level <= 0: + indent = indent - 1 + if indent <= 0: break elif c == '{': - level = level + 1 + indent = indent + 1 i2 = i2 + 1 - if level == 0 and (filedata[i2-1].strip().endswith('}') or filedata[i2-1].strip().endswith('};')): + if indent == 0 and (filedata[i2-1].strip().endswith('}') or filedata[i2-1].strip().endswith('};')): #print(str(i)+';'+str(i2)) - filedata2 = list(filedata) - ii = i - while ii < i2: - filedata2[ii] = '' - ii = ii + 1 - if replaceandrun('remove codeblock', filedata2, i, ''): - filedata = filedata2 + filedata = clearandrun('remove codeblock', filedata, i, i2-1) return filedata # reduce.. @@ -242,23 +288,37 @@ f.close() writefile(BACKUPFILE, filedata) -print('remove comments...') -removecomments(filedata) -print('combine lines..') -combinelines(filedata) -print('remove namespaces...') -filedata = removenamespaces(filedata) -print('remove includes...') -removeincludes(filedata) -print('remove line...') -removeline(filedata) -print('remove includes...') -removeincludes(filedata) -print('remove empty blocks...') -removeemptyblocks(filedata) -print('remove namespaces...') -filedata = removenamespaces(filedata) +while True: + filedata1 = list(filedata) + print('remove comments...') + removecomments(filedata) + print('remove includes...') + removeincludes(filedata) + + print('remove empty blocks...') + removeemptyblocks(filedata) + + print('remove blocks...') + filedata = removeblocks(filedata) + + print('combine lines..') + combinelines(filedata) + + print('remove namespaces...') + filedata = removenamespaces(filedata) + + print('remove line...') + removeline(filedata) + + # if filedata and filedata2 are identical then stop + if len(filedata1) == len(filedata): + i = 0 + while i < len(filedata1): + if filedata[i] != filedata1[i]: + break + if i == len(filedata1): + break writefile(FILE, filedata)