1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
#! /usr/bin/python
import os
import os.path
import re
import sys
ErrorPattern = re.compile('([A-Z]{3}_ERROR_[A-Z_0-9]+)\s+=?\s*\(?([A-Z_0-9-][A-Z_0-9-+ ]+[A-Z_0-9])')
LoggerPattern = re.compile('NPT_SET_LOCAL_LOGGER\s*\([ "]*(\S+)[ "]*\)')
NakedErrorPattern = re.compile('return.*[ \(]..._FAILURE')
FilePatternH = re.compile('^.*\.h$')
FilePatternC = re.compile('^.*\.(c|cpp)$')
Errors = {}
Codes = {}
Loggers = []
def ResolveErrors():
keep_going = True
while keep_going:
keep_going = False
for key in Errors.keys():
value = Errors[key]
if type(value) is str:
elements = [x.strip() for x in value.split('-')]
if len(elements[0]) == 0:
first = 0
else:
first = elements[0]
if Errors.has_key(first):
first = Errors[first]
if not type(first) is str:
second = int(elements[1])
Errors[key] = first-second
keep_going = True
def AnalyzeErrorCodes(file):
input = open(file)
for line in input.readlines():
m = ErrorPattern.search(line)
if m:
Errors[m.group(1)] = m.group(2)
input.close()
def ScanErrorCodes(top):
for root, dirs, files in os.walk(top):
for file in files:
if FilePatternH.match(file):
AnalyzeErrorCodes(os.path.join(root, file))
ResolveErrors()
for key in Errors:
#print key,"==>",Errors[key]
if (key.find("ERROR_BASE") > 1): continue
if Codes.has_key(Errors[key]):
raise Exception("duplicate error code: "+ str(key) +" --> " + str(Errors[key]) + "=" + Codes[Errors[key]])
Codes[Errors[key]] = key
sorted_keys = Codes.keys()
sorted_keys.sort()
sorted_keys.reverse()
last = 0
for code in sorted_keys:
if type(code) != int:
continue
if code != last-1:
print
print code,"==>", Codes[code]
last = code
def AnalyzeLoggers(file):
input = open(file)
for line in input.readlines():
m = LoggerPattern.search(line)
if m:
if m.group(1) not in Loggers:
Loggers.append(m.group(1))
input.close()
def ScanLoggers(top):
for root, dirs, files in os.walk(top):
for file in files:
if FilePatternC.match(file):
AnalyzeLoggers(os.path.join(root, file))
Loggers.sort()
for logger in Loggers:
print logger
def AnalyzeNakedErrors(file, prefix):
line_number = 0
input = open(file)
for line in input.readlines():
line_number += 1
m = NakedErrorPattern.search(line)
if m:
print file[len(prefix):],line_number," --> ", line,
input.close()
def ScanNakedErrors(top):
for root, dirs, files in os.walk(top):
for file in files:
if FilePatternC.match(file):
AnalyzeNakedErrors(os.path.join(root, file), top)
def FindTabsInFile(file):
input = open(file)
for line in input.readlines():
if line.find('\t') >= 0:
print "TAB found in", file
input.close()
return
input.close()
def FindTabs(top):
for root, dirs, files in os.walk(top):
for file in files:
if FilePatternC.match(file) or FilePatternH.match(file):
FindTabsInFile(os.path.join(root, file))
####################################################
# main
####################################################
sys.argv.reverse()
sys.argv.pop()
action = None
top = None
while len(sys.argv):
arg = sys.argv.pop()
if arg == '--list-error-codes':
action = ScanErrorCodes
elif arg == '--list-loggers':
action = ScanLoggers
elif arg == '--list-naked-errors':
action = ScanNakedErrors
elif arg == '--find-tabs':
action = FindTabs
elif top == None:
top = arg
else:
raise "unexpected argument " + arg
if not action or not top:
print "CodeScanner {--list-error-codes | --list-loggers | --find-tabs} <directory-root>"
sys.exit(1)
action(top)
|