]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Ecc/CodeFragmentCollector.py
BaseTools:Fix a ECC issue
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / CodeFragmentCollector.py
CommitLineData
30fdf114
LG
1## @file\r
2# preprocess source file\r
3#\r
231fdbb2 4# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
30fdf114 5#\r
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
18\r
72443dd2 19from __future__ import print_function\r
b6f6b636 20from __future__ import absolute_import\r
30fdf114 21import re\r
1be2ed90 22import Common.LongFilePathOs as os\r
30fdf114 23import sys\r
c60377d7
FB
24if sys.version_info.major == 3:\r
25 import antlr4 as antlr\r
26 from Ecc.CParser4.CLexer import CLexer\r
27 from Ecc.CParser4.CParser import CParser\r
28else:\r
29 import antlr3 as antlr\r
7b6a8c9c 30 antlr.InputStream = antlr.StringStream\r
c60377d7
FB
31 from Ecc.CParser3.CLexer import CLexer\r
32 from Ecc.CParser3.CParser import CParser\r
30fdf114 33\r
30fdf114 34\r
855698fb 35from Ecc import FileProfile\r
36from Ecc.CodeFragment import Comment\r
37from Ecc.CodeFragment import PP_Directive\r
38from Ecc.ParserWarning import Warning\r
30fdf114
LG
39\r
40\r
41##define T_CHAR_SPACE ' '\r
42##define T_CHAR_NULL '\0'\r
43##define T_CHAR_CR '\r'\r
44##define T_CHAR_TAB '\t'\r
45##define T_CHAR_LF '\n'\r
46##define T_CHAR_SLASH '/'\r
47##define T_CHAR_BACKSLASH '\\'\r
48##define T_CHAR_DOUBLE_QUOTE '\"'\r
49##define T_CHAR_SINGLE_QUOTE '\''\r
50##define T_CHAR_STAR '*'\r
51##define T_CHAR_HASH '#'\r
52\r
53(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \\r
54T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \\r
55(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')\r
56\r
f7496d71 57SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')\r
30fdf114
LG
58\r
59(T_COMMENT_TWO_SLASH, T_COMMENT_SLASH_STAR) = (0, 1)\r
60\r
61(T_PP_INCLUDE, T_PP_DEFINE, T_PP_OTHERS) = (0, 1, 2)\r
62\r
63## The collector for source code fragments.\r
64#\r
65# PreprocessFile method should be called prior to ParseFile\r
66#\r
67# GetNext*** procedures mean these procedures will get next token first, then make judgement.\r
68# Get*** procedures mean these procedures will make judgement on current token only.\r
f7496d71 69#\r
30fdf114
LG
70class CodeFragmentCollector:\r
71 ## The constructor\r
72 #\r
73 # @param self The object pointer\r
74 # @param FileName The file that to be parsed\r
75 #\r
76 def __init__(self, FileName):\r
77 self.Profile = FileProfile.FileProfile(FileName)\r
78 self.Profile.FileLinesList.append(T_CHAR_LF)\r
79 self.FileName = FileName\r
80 self.CurrentLineNumber = 1\r
81 self.CurrentOffsetWithinLine = 0\r
82\r
83 self.__Token = ""\r
84 self.__SkippedChars = ""\r
85\r
30fdf114
LG
86 ## __EndOfFile() method\r
87 #\r
88 # Judge current buffer pos is at file end\r
89 #\r
90 # @param self The object pointer\r
91 # @retval True Current File buffer position is at file end\r
92 # @retval False Current File buffer position is NOT at file end\r
93 #\r
94 def __EndOfFile(self):\r
95 NumberOfLines = len(self.Profile.FileLinesList)\r
96 SizeOfLastLine = NumberOfLines\r
97 if NumberOfLines > 0:\r
98 SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
f7496d71 99\r
30fdf114
LG
100 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
101 return True\r
102 elif self.CurrentLineNumber > NumberOfLines:\r
103 return True\r
104 else:\r
105 return False\r
106\r
107 ## __EndOfLine() method\r
108 #\r
109 # Judge current buffer pos is at line end\r
110 #\r
111 # @param self The object pointer\r
112 # @retval True Current File buffer position is at line end\r
113 # @retval False Current File buffer position is NOT at line end\r
114 #\r
115 def __EndOfLine(self):\r
116 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
117 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine - 1:\r
118 return True\r
119 else:\r
120 return False\r
f7496d71 121\r
30fdf114
LG
122 ## Rewind() method\r
123 #\r
124 # Reset file data buffer to the initial state\r
125 #\r
126 # @param self The object pointer\r
127 #\r
128 def Rewind(self):\r
129 self.CurrentLineNumber = 1\r
130 self.CurrentOffsetWithinLine = 0\r
f7496d71 131\r
30fdf114
LG
132 ## __UndoOneChar() method\r
133 #\r
134 # Go back one char in the file buffer\r
135 #\r
136 # @param self The object pointer\r
137 # @retval True Successfully go back one char\r
138 # @retval False Not able to go back one char as file beginning reached\r
f7496d71 139 #\r
30fdf114 140 def __UndoOneChar(self):\r
f7496d71 141\r
30fdf114
LG
142 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
143 return False\r
144 elif self.CurrentOffsetWithinLine == 0:\r
145 self.CurrentLineNumber -= 1\r
146 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1\r
147 else:\r
148 self.CurrentOffsetWithinLine -= 1\r
149 return True\r
f7496d71 150\r
30fdf114
LG
151 ## __GetOneChar() method\r
152 #\r
153 # Move forward one char in the file buffer\r
154 #\r
155 # @param self The object pointer\r
f7496d71 156 #\r
30fdf114
LG
157 def __GetOneChar(self):\r
158 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
159 self.CurrentLineNumber += 1\r
160 self.CurrentOffsetWithinLine = 0\r
161 else:\r
162 self.CurrentOffsetWithinLine += 1\r
163\r
164 ## __CurrentChar() method\r
165 #\r
166 # Get the char pointed to by the file buffer pointer\r
167 #\r
168 # @param self The object pointer\r
169 # @retval Char Current char\r
f7496d71 170 #\r
30fdf114
LG
171 def __CurrentChar(self):\r
172 CurrentChar = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
173# if CurrentChar > 255:\r
174# raise Warning("Non-Ascii char found At Line %d, offset %d" % (self.CurrentLineNumber, self.CurrentOffsetWithinLine), self.FileName, self.CurrentLineNumber)\r
175 return CurrentChar\r
f7496d71 176\r
30fdf114
LG
177 ## __NextChar() method\r
178 #\r
179 # Get the one char pass the char pointed to by the file buffer pointer\r
180 #\r
181 # @param self The object pointer\r
182 # @retval Char Next char\r
183 #\r
184 def __NextChar(self):\r
185 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
186 return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
187 else:\r
188 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
f7496d71 189\r
30fdf114
LG
190 ## __SetCurrentCharValue() method\r
191 #\r
192 # Modify the value of current char\r
193 #\r
194 # @param self The object pointer\r
195 # @param Value The new value of current char\r
196 #\r
197 def __SetCurrentCharValue(self, Value):\r
198 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
f7496d71 199\r
30fdf114
LG
200 ## __SetCharValue() method\r
201 #\r
202 # Modify the value of current char\r
203 #\r
204 # @param self The object pointer\r
205 # @param Value The new value of current char\r
206 #\r
207 def __SetCharValue(self, Line, Offset, Value):\r
208 self.Profile.FileLinesList[Line - 1][Offset] = Value\r
f7496d71 209\r
30fdf114
LG
210 ## __CurrentLine() method\r
211 #\r
212 # Get the list that contains current line contents\r
213 #\r
214 # @param self The object pointer\r
215 # @retval List current line contents\r
216 #\r
217 def __CurrentLine(self):\r
218 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
f7496d71 219\r
30fdf114
LG
220 ## __InsertComma() method\r
221 #\r
222 # Insert ',' to replace PP\r
223 #\r
224 # @param self The object pointer\r
225 # @retval List current line contents\r
226 #\r
227 def __InsertComma(self, Line):\r
f7496d71
LG
228\r
229\r
30fdf114
LG
230 if self.Profile.FileLinesList[Line - 1][0] != T_CHAR_HASH:\r
231 BeforeHashPart = str(self.Profile.FileLinesList[Line - 1]).split(T_CHAR_HASH)[0]\r
232 if BeforeHashPart.rstrip().endswith(T_CHAR_COMMA) or BeforeHashPart.rstrip().endswith(';'):\r
233 return\r
f7496d71 234\r
30fdf114
LG
235 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(','):\r
236 return\r
f7496d71 237\r
30fdf114
LG
238 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(';'):\r
239 return\r
f7496d71 240\r
30fdf114
LG
241 if str(self.Profile.FileLinesList[Line]).lstrip().startswith(',') or str(self.Profile.FileLinesList[Line]).lstrip().startswith(';'):\r
242 return\r
f7496d71 243\r
30fdf114 244 self.Profile.FileLinesList[Line - 1].insert(self.CurrentOffsetWithinLine, ',')\r
f7496d71 245\r
30fdf114
LG
246 ## PreprocessFile() method\r
247 #\r
248 # Preprocess file contents, replace comments with spaces.\r
249 # In the end, rewind the file buffer pointer to the beginning\r
250 # BUGBUG: No !include statement processing contained in this procedure\r
251 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
252 #\r
253 # @param self The object pointer\r
f7496d71 254 #\r
30fdf114
LG
255 def PreprocessFile(self):\r
256\r
257 self.Rewind()\r
258 InComment = False\r
259 DoubleSlashComment = False\r
260 HashComment = False\r
261 PPExtend = False\r
262 CommentObj = None\r
263 PPDirectiveObj = None\r
264 # HashComment in quoted string " " is ignored.\r
265 InString = False\r
f7496d71
LG
266 InCharLiteral = False\r
267\r
30fdf114
LG
268 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
269 while not self.__EndOfFile():\r
f7496d71 270\r
30fdf114
LG
271 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
272 InString = not InString\r
f7496d71 273\r
30fdf114
LG
274 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
275 InCharLiteral = not InCharLiteral\r
276 # meet new line, then no longer in a comment for // and '#'\r
277 if self.__CurrentChar() == T_CHAR_LF:\r
4231a819 278 if HashComment and PPDirectiveObj is not None:\r
30fdf114
LG
279 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
280 PPDirectiveObj.Content += T_CHAR_LF\r
281 PPExtend = True\r
282 else:\r
283 PPExtend = False\r
f7496d71 284\r
30fdf114 285 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
f7496d71 286\r
30fdf114
LG
287 if InComment and DoubleSlashComment:\r
288 InComment = False\r
289 DoubleSlashComment = False\r
290 CommentObj.Content += T_CHAR_LF\r
291 CommentObj.EndPos = EndLinePos\r
292 FileProfile.CommentList.append(CommentObj)\r
293 CommentObj = None\r
294 if InComment and HashComment and not PPExtend:\r
295 InComment = False\r
296 HashComment = False\r
297 PPDirectiveObj.Content += T_CHAR_LF\r
298 PPDirectiveObj.EndPos = EndLinePos\r
299 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
300 PPDirectiveObj = None\r
f7496d71 301\r
30fdf114
LG
302 if InString or InCharLiteral:\r
303 CurrentLine = "".join(self.__CurrentLine())\r
304 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
305 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
306 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
f7496d71 307\r
30fdf114
LG
308 if InComment and not DoubleSlashComment and not HashComment:\r
309 CommentObj.Content += T_CHAR_LF\r
310 self.CurrentLineNumber += 1\r
f7496d71 311 self.CurrentOffsetWithinLine = 0\r
30fdf114
LG
312 # check for */ comment end\r
313 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
314 CommentObj.Content += self.__CurrentChar()\r
315# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
316 self.__GetOneChar()\r
317 CommentObj.Content += self.__CurrentChar()\r
318# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
319 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
320 FileProfile.CommentList.append(CommentObj)\r
321 CommentObj = None\r
322 self.__GetOneChar()\r
323 InComment = False\r
324 # set comments to spaces\r
f7496d71 325 elif InComment:\r
30fdf114
LG
326 if HashComment:\r
327 # // follows hash PP directive\r
328 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
329 InComment = False\r
330 HashComment = False\r
331 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)\r
332 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
333 PPDirectiveObj = None\r
334 continue\r
335 else:\r
336 PPDirectiveObj.Content += self.__CurrentChar()\r
337 if PPExtend:\r
338 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
339 else:\r
340 CommentObj.Content += self.__CurrentChar()\r
341# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
342 self.__GetOneChar()\r
343 # check for // comment\r
344 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
345 InComment = True\r
346 DoubleSlashComment = True\r
347 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)\r
348 # check for '#' comment\r
349 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
350 InComment = True\r
f7496d71 351 HashComment = True\r
30fdf114
LG
352 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
353 # check for /* comment start\r
354 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
355 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)\r
356 CommentObj.Content += self.__CurrentChar()\r
357# self.__SetCurrentCharValue( T_CHAR_SPACE)\r
358 self.__GetOneChar()\r
359 CommentObj.Content += self.__CurrentChar()\r
360# self.__SetCurrentCharValue( T_CHAR_SPACE)\r
361 self.__GetOneChar()\r
362 InComment = True\r
363 else:\r
364 self.__GetOneChar()\r
f7496d71 365\r
30fdf114 366 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
f7496d71 367\r
30fdf114
LG
368 if InComment and DoubleSlashComment:\r
369 CommentObj.EndPos = EndLinePos\r
370 FileProfile.CommentList.append(CommentObj)\r
371 if InComment and HashComment and not PPExtend:\r
372 PPDirectiveObj.EndPos = EndLinePos\r
373 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
374\r
375 self.Rewind()\r
376\r
377 def PreprocessFileWithClear(self):\r
378\r
379 self.Rewind()\r
380 InComment = False\r
381 DoubleSlashComment = False\r
382 HashComment = False\r
383 PPExtend = False\r
384 CommentObj = None\r
385 PPDirectiveObj = None\r
386 # HashComment in quoted string " " is ignored.\r
387 InString = False\r
f7496d71 388 InCharLiteral = False\r
30fdf114
LG
389\r
390 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
391 while not self.__EndOfFile():\r
f7496d71 392\r
30fdf114
LG
393 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
394 InString = not InString\r
f7496d71 395\r
30fdf114
LG
396 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
397 InCharLiteral = not InCharLiteral\r
398 # meet new line, then no longer in a comment for // and '#'\r
399 if self.__CurrentChar() == T_CHAR_LF:\r
4231a819 400 if HashComment and PPDirectiveObj is not None:\r
30fdf114
LG
401 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
402 PPDirectiveObj.Content += T_CHAR_LF\r
403 PPExtend = True\r
404 else:\r
405 PPExtend = False\r
f7496d71 406\r
30fdf114 407 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
f7496d71 408\r
30fdf114
LG
409 if InComment and DoubleSlashComment:\r
410 InComment = False\r
411 DoubleSlashComment = False\r
412 CommentObj.Content += T_CHAR_LF\r
413 CommentObj.EndPos = EndLinePos\r
414 FileProfile.CommentList.append(CommentObj)\r
415 CommentObj = None\r
416 if InComment and HashComment and not PPExtend:\r
417 InComment = False\r
418 HashComment = False\r
419 PPDirectiveObj.Content += T_CHAR_LF\r
420 PPDirectiveObj.EndPos = EndLinePos\r
421 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
422 PPDirectiveObj = None\r
f7496d71 423\r
30fdf114
LG
424 if InString or InCharLiteral:\r
425 CurrentLine = "".join(self.__CurrentLine())\r
426 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
427 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
428 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
f7496d71 429\r
30fdf114
LG
430 if InComment and not DoubleSlashComment and not HashComment:\r
431 CommentObj.Content += T_CHAR_LF\r
432 self.CurrentLineNumber += 1\r
f7496d71 433 self.CurrentOffsetWithinLine = 0\r
30fdf114
LG
434 # check for */ comment end\r
435 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
436 CommentObj.Content += self.__CurrentChar()\r
437 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
438 self.__GetOneChar()\r
439 CommentObj.Content += self.__CurrentChar()\r
440 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
441 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
442 FileProfile.CommentList.append(CommentObj)\r
443 CommentObj = None\r
444 self.__GetOneChar()\r
445 InComment = False\r
446 # set comments to spaces\r
f7496d71 447 elif InComment:\r
30fdf114
LG
448 if HashComment:\r
449 # // follows hash PP directive\r
450 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
451 InComment = False\r
452 HashComment = False\r
453 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)\r
454 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
455 PPDirectiveObj = None\r
456 continue\r
457 else:\r
458 PPDirectiveObj.Content += self.__CurrentChar()\r
459# if PPExtend:\r
460# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
461 else:\r
462 CommentObj.Content += self.__CurrentChar()\r
463 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
464 self.__GetOneChar()\r
465 # check for // comment\r
466 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
467 InComment = True\r
468 DoubleSlashComment = True\r
469 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)\r
470 # check for '#' comment\r
471 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
472 InComment = True\r
f7496d71 473 HashComment = True\r
30fdf114
LG
474 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
475 # check for /* comment start\r
476 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
477 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)\r
478 CommentObj.Content += self.__CurrentChar()\r
479 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
480 self.__GetOneChar()\r
481 CommentObj.Content += self.__CurrentChar()\r
482 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
483 self.__GetOneChar()\r
484 InComment = True\r
485 else:\r
486 self.__GetOneChar()\r
487\r
488 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
f7496d71 489\r
30fdf114
LG
490 if InComment and DoubleSlashComment:\r
491 CommentObj.EndPos = EndLinePos\r
492 FileProfile.CommentList.append(CommentObj)\r
493 if InComment and HashComment and not PPExtend:\r
494 PPDirectiveObj.EndPos = EndLinePos\r
495 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
496 self.Rewind()\r
497\r
498 ## ParseFile() method\r
499 #\r
500 # Parse the file profile buffer to extract fd, fv ... information\r
501 # Exception will be raised if syntax error found\r
502 #\r
503 # @param self The object pointer\r
504 #\r
505 def ParseFile(self):\r
506 self.PreprocessFile()\r
507 # restore from ListOfList to ListOfString\r
508 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
509 FileStringContents = ''\r
510 for fileLine in self.Profile.FileLinesList:\r
511 FileStringContents += fileLine\r
c60377d7 512 cStream = antlr.InputStream(FileStringContents)\r
30fdf114 513 lexer = CLexer(cStream)\r
c60377d7 514 tStream = antlr.CommonTokenStream(lexer)\r
30fdf114
LG
515 parser = CParser(tStream)\r
516 parser.translation_unit()\r
f7496d71 517\r
30fdf114
LG
518 def ParseFileWithClearedPPDirective(self):\r
519 self.PreprocessFileWithClear()\r
520 # restore from ListOfList to ListOfString\r
521 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
522 FileStringContents = ''\r
523 for fileLine in self.Profile.FileLinesList:\r
524 FileStringContents += fileLine\r
c60377d7 525 cStream = antlr.InputStream(FileStringContents)\r
30fdf114 526 lexer = CLexer(cStream)\r
c60377d7 527 tStream = antlr.CommonTokenStream(lexer)\r
30fdf114
LG
528 parser = CParser(tStream)\r
529 parser.translation_unit()\r
f7496d71 530\r
30fdf114
LG
531 def CleanFileProfileBuffer(self):\r
532 FileProfile.CommentList = []\r
533 FileProfile.PPDirectiveList = []\r
534 FileProfile.PredicateExpressionList = []\r
535 FileProfile.FunctionDefinitionList = []\r
536 FileProfile.VariableDeclarationList = []\r
537 FileProfile.EnumerationDefinitionList = []\r
538 FileProfile.StructUnionDefinitionList = []\r
539 FileProfile.TypedefDefinitionList = []\r
540 FileProfile.FunctionCallingList = []\r
f7496d71 541\r
30fdf114 542 def PrintFragments(self):\r
f7496d71 543\r
72443dd2 544 print('################# ' + self.FileName + '#####################')\r
f7496d71 545\r
72443dd2
GL
546 print('/****************************************/')\r
547 print('/*************** COMMENTS ***************/')\r
548 print('/****************************************/')\r
30fdf114 549 for comment in FileProfile.CommentList:\r
72443dd2 550 print(str(comment.StartPos) + comment.Content)\r
f7496d71 551\r
72443dd2
GL
552 print('/****************************************/')\r
553 print('/********* PREPROCESS DIRECTIVES ********/')\r
554 print('/****************************************/')\r
30fdf114 555 for pp in FileProfile.PPDirectiveList:\r
72443dd2 556 print(str(pp.StartPos) + pp.Content)\r
f7496d71 557\r
72443dd2
GL
558 print('/****************************************/')\r
559 print('/********* VARIABLE DECLARATIONS ********/')\r
560 print('/****************************************/')\r
30fdf114 561 for var in FileProfile.VariableDeclarationList:\r
72443dd2 562 print(str(var.StartPos) + var.Modifier + ' '+ var.Declarator)\r
f7496d71 563\r
72443dd2
GL
564 print('/****************************************/')\r
565 print('/********* FUNCTION DEFINITIONS *********/')\r
566 print('/****************************************/')\r
30fdf114 567 for func in FileProfile.FunctionDefinitionList:\r
72443dd2 568 print(str(func.StartPos) + func.Modifier + ' '+ func.Declarator + ' ' + str(func.NamePos))\r
f7496d71 569\r
72443dd2
GL
570 print('/****************************************/')\r
571 print('/************ ENUMERATIONS **************/')\r
572 print('/****************************************/')\r
30fdf114 573 for enum in FileProfile.EnumerationDefinitionList:\r
72443dd2 574 print(str(enum.StartPos) + enum.Content)\r
f7496d71 575\r
72443dd2
GL
576 print('/****************************************/')\r
577 print('/*********** STRUCTS/UNIONS *************/')\r
578 print('/****************************************/')\r
30fdf114 579 for su in FileProfile.StructUnionDefinitionList:\r
72443dd2 580 print(str(su.StartPos) + su.Content)\r
f7496d71 581\r
72443dd2
GL
582 print('/****************************************/')\r
583 print('/********* PREDICATE EXPRESSIONS ********/')\r
584 print('/****************************************/')\r
30fdf114 585 for predexp in FileProfile.PredicateExpressionList:\r
72443dd2 586 print(str(predexp.StartPos) + predexp.Content)\r
f7496d71 587\r
72443dd2
GL
588 print('/****************************************/')\r
589 print('/************** TYPEDEFS ****************/')\r
590 print('/****************************************/')\r
30fdf114 591 for typedef in FileProfile.TypedefDefinitionList:\r
72443dd2 592 print(str(typedef.StartPos) + typedef.ToType)\r
f7496d71 593\r
30fdf114 594if __name__ == "__main__":\r
f7496d71 595\r
30fdf114
LG
596 collector = CodeFragmentCollector(sys.argv[1])\r
597 collector.PreprocessFile()\r
72443dd2 598 print("For Test.")\r