Skip to content

Commit d734a98

Browse files
committed
xml dump: Added tools/cppcheckdata.py that loads the dump.
1 parent 51c2245 commit d734a98

File tree

1 file changed

+214
-0
lines changed

1 file changed

+214
-0
lines changed

tools/cppcheckdata.py

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
# Module that loads a cppcheck dump
2+
3+
from lxml import etree
4+
5+
class Token:
6+
Id = None
7+
str = None
8+
next = None
9+
previous = None
10+
scopeId = None
11+
scope = None
12+
linkId = None
13+
link = None
14+
varId = None
15+
variableId = None
16+
variable = None
17+
functionId = None
18+
function = None
19+
valuesId = None
20+
values = None
21+
astParentId = None
22+
astParent = None
23+
astOperand1Id = None
24+
astOperand1 = None
25+
astOperand2Id = None
26+
astOperand2 = None
27+
28+
def __init__(self, element):
29+
self.Id = element.get('id')
30+
self.str = element.get('str')
31+
self.next = None
32+
self.previous = None
33+
self.scopeId = element.get('scope')
34+
self.scope = None
35+
self.linkId = element.get('link')
36+
self.link = None
37+
self.varId = element.get('varId')
38+
self.variableId = element.get('variable')
39+
self.variable = None
40+
self.functionId = element.get('function')
41+
self.function = None
42+
self.valuesId = element.get('values')
43+
self.values = None
44+
self.astParentId = element.get('astParent')
45+
self.astParent = None
46+
self.astOperand1Id = element.get('astOperand1')
47+
self.astOperand1 = None
48+
self.astOperand2Id = element.get('astOperand2')
49+
self.astOperand2 = None
50+
51+
def setId(self, IdMap):
52+
self.scope = IdMap[self.scopeId]
53+
self.link = IdMap[self.linkId]
54+
self.variable = IdMap[self.variableId]
55+
self.function = IdMap[self.functionId]
56+
self.values = IdMap[self.valuesId]
57+
self.astParent = IdMap[self.astParentId]
58+
self.astOperand1 = IdMap[self.astOperand1Id]
59+
self.astOperand2 = IdMap[self.astOperand2Id]
60+
61+
class Scope:
62+
Id = None
63+
classStartId = None
64+
classStart = None
65+
classEndId = None
66+
classEnd = None
67+
className = None
68+
69+
def __init__(self,element):
70+
self.Id = element.get('id')
71+
self.className = element.get('className')
72+
self.classStartId = element.get('classStart')
73+
self.classStart = None
74+
self.classEndId = element.get('classEnd')
75+
self.classEnd = None
76+
self.nestedInId = element.get('nestedId')
77+
self.nestedIn = None
78+
79+
def setId(self, IdMap):
80+
self.classStart = IdMap[self.classStartId]
81+
self.classEnd = IdMap[self.classEndId]
82+
self.nestedIn = IdMap[self.nestedInId]
83+
84+
class Function:
85+
Id = None
86+
argument = None
87+
argumentId = None
88+
def __init__(self,element):
89+
self.Id = element.get('id')
90+
self.argument = {}
91+
self.argumentId = {}
92+
for arg in element:
93+
self.argumentId[arg.get('nr')] = arg.get('id')
94+
def setId(self, IdMap):
95+
for argnr, argid in self.argumentId.iteritems():
96+
self.argument[argnr] = IdMap[argid]
97+
98+
class Variable:
99+
Id = None
100+
nameTokenId = None
101+
nameToken = None
102+
typeStartTokenId = None
103+
typeStartToken = None
104+
typeEndTokenId = None
105+
typeEndToken = None
106+
isArgument = None
107+
isArray = None
108+
isClass = None
109+
isLocal = None
110+
isPointer = None
111+
isReference = None
112+
isStatic = None
113+
114+
def __init__(self, element):
115+
self.Id = element.get('id')
116+
self.nameTokenId = element.get('nameToken')
117+
self.nameToken = None
118+
self.typeStartTokenId = element.get('typeStartToken')
119+
self.typeStartToken = None
120+
self.typeEndTokenId = element.get('typeEndToken')
121+
self.typeEndToken = None
122+
self.isArgument = element.get('isArgument')
123+
self.isArray = element.get('isArray')
124+
self.isClass = element.get('isClass')
125+
self.isLocal = element.get('isLocal')
126+
self.isPointer = element.get('isPointer')
127+
self.isReference = element.get('isReference')
128+
self.isStatic = element.get('isStatic')
129+
130+
def setId(self, IdMap):
131+
self.nameToken = IdMap[self.nameTokenId]
132+
self.typeStartToken = IdMap[self.typeStartTokenId]
133+
self.typeEndToken = IdMap[self.typeEndTokenId]
134+
135+
class ValueFlow:
136+
class Value:
137+
intvalue = None
138+
condition = None
139+
def __init__(self, element):
140+
intvalue = element.get('intvalue')
141+
condition = element.get('condition-line')
142+
143+
Id = None
144+
values = None
145+
def __init__(self, element):
146+
self.Id = element.get('id')
147+
self.values = []
148+
for value in element:
149+
self.values.append(ValueFlow.Value(value))
150+
151+
class CppcheckData:
152+
tokenlist = []
153+
scopes = []
154+
functions = []
155+
variables = []
156+
values = []
157+
158+
def __init__(self, filename):
159+
self.tokenlist = []
160+
self.scopes = []
161+
self.variables = []
162+
self.valueflow = []
163+
164+
data = etree.parse(filename)
165+
for element in data.getroot():
166+
if element.tag == 'tokenlist':
167+
for token in element:
168+
self.tokenlist.append(Token(token))
169+
170+
# set next/previous..
171+
prev = None
172+
for token in self.tokenlist:
173+
token.previous = prev
174+
if prev:
175+
prev.next = token
176+
if element.tag == 'scopes':
177+
for scope in element:
178+
self.scopes.append(Scope(scope))
179+
for functionList in scope:
180+
if functionList.tag == 'functionList':
181+
for function in functionList:
182+
self.functions.append(Function(function))
183+
if element.tag == 'variables':
184+
for variable in element:
185+
self.variables.append(Variable(variable))
186+
if element.tag == 'valueflow':
187+
for values in element:
188+
self.valueflow.append(ValueFlow(values))
189+
190+
IdMap = {}
191+
IdMap[None] = None
192+
IdMap['0'] = None
193+
for token in self.tokenlist:
194+
IdMap[token.Id] = token
195+
for scope in self.scopes:
196+
IdMap[scope.Id] = scope
197+
for function in self.functions:
198+
IdMap[function.Id] = function
199+
for variable in self.variables:
200+
IdMap[variable.Id] = variable
201+
for values in self.valueflow:
202+
IdMap[values.Id] = values
203+
204+
for token in self.tokenlist:
205+
token.setId(IdMap)
206+
for scope in self.scopes:
207+
scope.setId(IdMap)
208+
for function in self.functions:
209+
function.setId(IdMap)
210+
for variable in self.variables:
211+
variable.setId(IdMap)
212+
213+
def parsedump(filename):
214+
return CppcheckData(filename)

0 commit comments

Comments
 (0)