ECC: declaration format initial check-in.
authorjlin16 <jlin16@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 31 Mar 2008 09:42:26 +0000 (09:42 +0000)
committerjlin16 <jlin16@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 31 Mar 2008 09:42:26 +0000 (09:42 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1095 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Ecc/c.py

index ec02a2a..ed84a2e 100644 (file)
@@ -13,6 +13,7 @@ import MetaDataParser
 IncludeFileListDict = {}\r
 IncludePathListDict = {}\r
 ComplexTypeDict = {}\r
+SUDict = {}\r
 \r
 def GetIgnoredDirListPattern():\r
     p = re.compile(r'.*[\\/](?:BUILD|INTELRESTRICTEDTOOLS|INTELRESTRICTEDPKG|PCCTS)[\\/].*')\r
@@ -293,7 +294,7 @@ def CollectSourceCodeDataIntoDB(RootDir):
 \r
     Db.UpdateIdentifierBelongsToFunction()\r
 \r
-def GetTableID(FullFileName, ErrorMsgList):\r
+def GetTableID(FullFileName, ErrorMsgList = []):\r
     Db = GetDB()\r
     \r
     SqlStatement = """ select ID\r
@@ -377,20 +378,21 @@ def GetPredicateListFromPredicateExpStr(PES):
     i = 0\r
     PredicateBegin = 0\r
     #PredicateEnd = 0\r
-    LogicOpPos = 0\r
+    LogicOpPos = -1\r
     while i < len(PES) - 1:\r
-        if (PES[i].isalpha() or PES[i] == '_') and LogicOpPos >= PredicateBegin:\r
+        if (PES[i].isalpha() or PES[i] == '_') and LogicOpPos > PredicateBegin:\r
             PredicateBegin = i\r
         if (PES[i] == '&' and PES[i+1] == '&') or (PES[i] == '|' and PES[i+1] == '|'):\r
             LogicOpPos = i\r
-            PredicateList.append(PES[PredicateBegin:i].strip())\r
+            PredicateList.append(PES[PredicateBegin:i].rstrip(';').rstrip(')').strip())\r
         i += 1\r
     \r
     if PredicateBegin > LogicOpPos:\r
-        PredicateList.append(PES[PredicateBegin:len(PES)].strip())\r
+        PredicateList.append(PES[PredicateBegin:len(PES)].rstrip(';').rstrip(')').strip())\r
     return PredicateList\r
     \r
 def GetPredicateVariable(Lvalue):\r
+    Lvalue += ' '\r
     i = 0\r
     SearchBegin = 0\r
     VarStart = -1\r
@@ -412,6 +414,7 @@ def GetPredicateVariable(Lvalue):
         if VarEnd == -1:\r
             break\r
         \r
+        \r
         Index = Lvalue[VarEnd:].find('.')\r
         if Index > 0:\r
             SearchBegin += VarEnd + Index\r
@@ -432,12 +435,18 @@ def SplitPredicateByOp(Str, Op):
     Name = Str.strip()\r
     Value = None\r
     \r
-    PredPartList = Str.split(Op)\r
-    if len(PredPartList) > 1:\r
-        Name = PredPartList[0].strip()\r
-        Value = PredPartList[1].strip()\r
-        return [Name, Value]\r
-    return [Name]\r
+    TmpStr = Str.rstrip(';').rstrip(')')\r
+    while True:\r
+        Index = TmpStr.rfind(Op)\r
+        if Index == -1:\r
+            return [Name]\r
+        \r
+        if Str[Index - 1].isalnum() or Str[Index - 1].isspace():\r
+            Name = Str[0:Index].strip()\r
+            Value = Str[Index + len(Op):].strip()\r
+            return [Name, Value]   \r
+    \r
+        TmpStr = Str[0:Index - 1]\r
 \r
 def SplitPredicateStr(Str):\r
     PredPartList = SplitPredicateByOp(Str, '==')\r
@@ -447,6 +456,14 @@ def SplitPredicateStr(Str):
     PredPartList = SplitPredicateByOp(Str, '!=')\r
     if len(PredPartList) > 1:\r
         return [PredPartList, '!=']\r
+    \r
+    PredPartList = SplitPredicateByOp(Str, '>=')\r
+    if len(PredPartList) > 1:\r
+        return [PredPartList, '>=']\r
+        \r
+    PredPartList = SplitPredicateByOp(Str, '<=')\r
+    if len(PredPartList) > 1:\r
+        return [PredPartList, '<=']\r
         \r
     PredPartList = SplitPredicateByOp(Str, '>')\r
     if len(PredPartList) > 1:\r
@@ -456,14 +473,6 @@ def SplitPredicateStr(Str):
     if len(PredPartList) > 1:\r
         return [PredPartList, '<']\r
         \r
-    PredPartList = SplitPredicateByOp(Str, '>=')\r
-    if len(PredPartList) > 1:\r
-        return [PredPartList, '>=']\r
-        \r
-    PredPartList = SplitPredicateByOp(Str, '<=')\r
-    if len(PredPartList) > 1:\r
-        return [PredPartList, '<=']\r
-        \r
     return [[Str, None], None]\r
 \r
 def GetFuncContainsPE(ExpLine, ResultSet):\r
@@ -504,7 +513,7 @@ def GetTypedefDict(FullFileName):
     if Dict != None:\r
         return Dict\r
     \r
-    FileID = GetTableID(FullFileName, ErrorMsgList)\r
+    FileID = GetTableID(FullFileName)\r
     FileTable = 'Identifier' + str(FileID)\r
     Db = GetDB()\r
     SqlStatement = """ select Modifier, Name, Value, ID\r
@@ -520,7 +529,7 @@ def GetTypedefDict(FullFileName):
         \r
     IncludeFileList = GetAllIncludeFiles(FullFileName)\r
     for F in IncludeFileList:\r
-        FileID = GetTableID(F, ErrorMsgList)\r
+        FileID = GetTableID(F)\r
         if FileID < 0:\r
             continue\r
     \r
@@ -531,7 +540,6 @@ def GetTypedefDict(FullFileName):
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF)\r
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
     \r
-        Dict = {}\r
         for Result in ResultSet:\r
             if len(Result[0]) == 0:\r
                 Dict[Result[1]] = Result[2]\r
@@ -539,9 +547,89 @@ def GetTypedefDict(FullFileName):
     ComplexTypeDict[FullFileName] = Dict\r
     return Dict\r
 \r
+def GetSUDict(FullFileName):\r
+    \r
+    Dict = SUDict.get(FullFileName)\r
+    if Dict != None:\r
+        return Dict\r
+    \r
+    FileID = GetTableID(FullFileName)\r
+    FileTable = 'Identifier' + str(FileID)\r
+    Db = GetDB()\r
+    SqlStatement = """ select Name, Value, ID\r
+                       from %s\r
+                       where Model = %d or Model = %d\r
+                   """ % (FileTable, DataClass.MODEL_IDENTIFIER_STRUCTURE, DataClass.MODEL_IDENTIFIER_UNION)\r
+    ResultSet = Db.TblFile.Exec(SqlStatement)\r
+    \r
+    Dict = {}\r
+    for Result in ResultSet:\r
+        if len(Result[1]) > 0:\r
+            Dict[Result[0]] = Result[1]\r
+        \r
+    IncludeFileList = GetAllIncludeFiles(FullFileName)\r
+    for F in IncludeFileList:\r
+        FileID = GetTableID(F)\r
+        if FileID < 0:\r
+            continue\r
+    \r
+        FileTable = 'Identifier' + str(FileID)\r
+        SqlStatement = """ select Name, Value, ID\r
+                       from %s\r
+                       where Model = %d or Model = %d\r
+                   """ % (FileTable, DataClass.MODEL_IDENTIFIER_STRUCTURE, DataClass.MODEL_IDENTIFIER_UNION)\r
+        ResultSet = Db.TblFile.Exec(SqlStatement)\r
+    \r
+        for Result in ResultSet:\r
+            if len(Result[1]) > 0:\r
+                Dict[Result[0]] = Result[1]\r
+                \r
+    SUDict[FullFileName] = Dict\r
+    return Dict\r
+\r
+def GetFinalTypeValue(Type, FieldName, TypedefDict, SUDict):\r
+    Value = TypedefDict.get(Type)\r
+    if Value == None:\r
+        Value = SUDict.get(Type)\r
+    if Value == None:\r
+        return None\r
+    \r
+    LBPos = Value.find('{')\r
+    while LBPos == -1:\r
+        FTList = Value.split()\r
+        for FT in FTList:\r
+            if FT not in ('struct', 'union'):\r
+                Value = TypedefDict.get(FT)\r
+                if Value == None:\r
+                    Value = SUDict.get(FT)\r
+                break\r
+        \r
+        if Value == None:\r
+            return None\r
+     \r
+        LBPos = Value.find('{')\r
+     \r
+#    RBPos = Value.find('}')\r
+    Fields = Value[LBPos + 1:]\r
+    FieldsList = Fields.split(';')\r
+    for Field in FieldsList:\r
+        Field = Field.strip()\r
+        Index = Field.find(FieldName)\r
+        if Index < 1:\r
+            continue\r
+        if not Field[Index - 1].isalnum():\r
+            if Index + len(FieldName) == len(Field):\r
+                return GetPredicateVariable(Field[0:Index])[0]\r
+            else:\r
+                if not Field[Index + len(FieldName) + 1].isalnum():\r
+                    return GetPredicateVariable(Field[0:Index])[0]\r
+    return None\r
+    \r
+\r
 def GetTypeInfo(RefList, Modifier, FullFileName):\r
     TypedefDict = GetTypedefDict(FullFileName)\r
-    Type = GetReturnTypeFromModifier(Modifier)\r
+    SUDict = GetSUDict(FullFileName)\r
+    Type = GetReturnTypeFromModifier(Modifier).rstrip('*')\r
     Index = 0\r
     while Index < len(RefList):\r
         FieldName = RefList[Index]\r
@@ -551,19 +639,25 @@ def GetTypeInfo(RefList, Modifier, FullFileName):
         Type = FromType\r
         Index += 1\r
 \r
+    return Type\r
+\r
 def GetVarInfo(PredVarList, FuncRecord, FullFileName):\r
     \r
     PredVar = PredVarList[0]\r
+    FileID = GetTableID(FullFileName)\r
+    \r
+    Db = GetDB()\r
+    FileTable = 'Identifier' + str(FileID)\r
     # really variable, search local variable first\r
     SqlStatement = """ select Modifier, ID\r
                        from %s\r
-                       where Model = %d and Name = \'%s\' and BelongsToFunction = %d\r
-                   """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE, PredVar, FuncRecord[4])\r
+                       where Model = %d and Name = \'%s\' and StartLine >= %d and StartLine <= %d\r
+                   """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE, PredVar, FuncRecord[0], FuncRecord[1])\r
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
     VarFound = False\r
     for Result in ResultSet:\r
         if len(PredVarList) > 1:\r
-            Type = GetTypeInfo(PredVarList[1:], Result[0])\r
+            Type = GetTypeInfo(PredVarList[1:], Result[0], FullFileName)\r
             return Type\r
                 \r
     # search function parameters second\r
@@ -571,7 +665,7 @@ def GetVarInfo(PredVarList, FuncRecord, FullFileName):
     for Param in ParamList:\r
         if Param.Name.strip() == PredVar:\r
             if len(PredVarList) > 1:\r
-                Type = GetTypeInfo(PredVarList[1:], Result[0])\r
+                Type = GetTypeInfo(PredVarList[1:], Param.Modifier, FullFileName)\r
                 return Type\r
           \r
     # search global variable next\r
@@ -583,26 +677,26 @@ def GetVarInfo(PredVarList, FuncRecord, FullFileName):
 \r
     for Result in ResultSet:\r
         if len(PredVarList) > 1:\r
-            Type = GetTypeInfo(PredVarList[1:], Result[0])\r
+            Type = GetTypeInfo(PredVarList[1:], Result[0], FullFileName)\r
             return Type\r
     \r
     # search variable in include files\r
     IncludeFileList = GetAllIncludeFiles(FullFileName)\r
     for F in IncludeFileList:\r
-        FileID = GetTableID(F, ErrorMsgList)\r
+        FileID = GetTableID(F)\r
         if FileID < 0:\r
             continue\r
     \r
         FileTable = 'Identifier' + str(FileID)\r
         SqlStatement = """ select Modifier, ID\r
                        from %s\r
-                       where Model = %d and BelongsToFunction = -1 and Name = %s\r
+                       where Model = %d and BelongsToFunction = -1 and Name = \'%s\'\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE, PredVar)\r
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
 \r
         for Result in ResultSet:\r
             if len(PredVarList) > 1:\r
-                Type = GetTypeInfo(PredVarList[1:], Result[0])\r
+                Type = GetTypeInfo(PredVarList[1:], Result[0], FullFileName)\r
                 return Type\r
 \r
 def CheckFuncLayoutReturnType(FullFileName):\r