]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/Expression.py
BaseTools: report error if flag in LABEL() invalid
[mirror_edk2.git] / BaseTools / Source / Python / Common / Expression.py
index edb0a60de6007a367bdf80245fc061d665a3e469..5a0ade9e7ecad6d1fa6cbeb2dec09f7d4ef26eae 100644 (file)
@@ -45,15 +45,28 @@ ERR_IN_OPERAND          = 'Macro after IN operator can only be: $(FAMILY), $(ARC
 #  For example: abc"de\"f"ghi"jkl"mn will be: ['abc', '"de\"f"', 'ghi', '"jkl"', 'mn']\r
 #\r
 def SplitString(String):\r
-    # There might be escaped quote: "abc\"def\\\"ghi"\r
-    Str = String.replace('\\\\', '//').replace('\\\"', '\\\'')\r
+    # There might be escaped quote: "abc\"def\\\"ghi", 'abc\'def\\\'ghi'\r
+    Str = String\r
     RetList = []\r
-    InQuote = False\r
+    InSingleQuote = False\r
+    InDoubleQuote = False\r
     Item = ''\r
     for i, ch in enumerate(Str):\r
-        if ch == '"':\r
-            InQuote = not InQuote\r
-            if not InQuote:\r
+        if ch == '"' and not InSingleQuote:\r
+            if Str[i - 1] != '\\':\r
+                InDoubleQuote = not InDoubleQuote\r
+            if not InDoubleQuote:\r
+                Item += String[i]\r
+                RetList.append(Item)\r
+                Item = ''\r
+                continue\r
+            if Item:\r
+                RetList.append(Item)\r
+                Item = ''\r
+        elif ch == "'" and not InDoubleQuote:\r
+            if Str[i - 1] != '\\':\r
+                InSingleQuote = not InSingleQuote\r
+            if not InSingleQuote:\r
                 Item += String[i]\r
                 RetList.append(Item)\r
                 Item = ''\r
@@ -62,7 +75,7 @@ def SplitString(String):
                 RetList.append(Item)\r
                 Item = ''\r
         Item += String[i]\r
-    if InQuote:\r
+    if InSingleQuote or InDoubleQuote:\r
         raise BadExpression(ERR_STRING_TOKEN % Item)\r
     if Item:\r
         RetList.append(Item)\r
@@ -106,6 +119,12 @@ def SplitPcdValueString(String):
         RetList.append(Item)\r
     return RetList\r
 \r
+def IsValidCString(Str):\r
+    ValidString = re.compile(r'[_a-zA-Z][_0-9a-zA-Z]*$')\r
+    if not ValidString.match(Str):\r
+        return False\r
+    return True\r
+\r
 ## ReplaceExprMacro\r
 #\r
 def ReplaceExprMacro(String, Macros, ExceptionList = None):\r
@@ -483,6 +502,8 @@ class ValueExpression(object):
             Flag = 0\r
             for Index in range(len(self._Token)):\r
                 if self._Token[Index] in ['"']:\r
+                    if self._Token[Index - 1] == '\\':\r
+                        continue\r
                     Flag += 1\r
             if Flag == 2 and self._Token.endswith('"'):\r
                 return True\r
@@ -490,6 +511,8 @@ class ValueExpression(object):
             Flag = 0\r
             for Index in range(len(self._Token)):\r
                 if self._Token[Index] in ["'"]:\r
+                    if self._Token[Index - 1] == '\\':\r
+                        continue\r
                     Flag += 1\r
             if Flag == 2 and self._Token.endswith("'"):\r
                 return True\r
@@ -537,16 +560,25 @@ class ValueExpression(object):
         self._Idx += 1\r
 \r
         # Replace escape \\\", \"\r
-        Expr = self._Expr[self._Idx:].replace('\\\\', '//').replace('\\\"', '\\\'')\r
-        for Ch in Expr:\r
-            self._Idx += 1\r
-            if Ch == '"' or Ch == "'":\r
-                break\r
-        self._Token = self._LiteralToken = self._Expr[Idx:self._Idx]\r
-        if self._Token.startswith('"') and not self._Token.endswith('"'):\r
-            raise BadExpression(ERR_STRING_TOKEN % self._Token)\r
-        if self._Token.startswith("'") and not self._Token.endswith("'"):\r
-            raise BadExpression(ERR_STRING_TOKEN % self._Token)\r
+        if self._Expr[Idx] == '"':\r
+            Expr = self._Expr[self._Idx:].replace('\\\\', '//').replace('\\\"', '\\\'')\r
+            for Ch in Expr:\r
+                self._Idx += 1\r
+                if Ch == '"':\r
+                    break\r
+            self._Token = self._LiteralToken = self._Expr[Idx:self._Idx]\r
+            if not self._Token.endswith('"'):\r
+                raise BadExpression(ERR_STRING_TOKEN % self._Token)\r
+        #Replace escape \\\', \'\r
+        elif self._Expr[Idx] == "'":\r
+            Expr = self._Expr[self._Idx:].replace('\\\\', '//').replace("\\\'", "\\\"")\r
+            for Ch in Expr:\r
+                self._Idx += 1\r
+                if Ch == "'":\r
+                    break\r
+            self._Token = self._LiteralToken = self._Expr[Idx:self._Idx]\r
+            if not self._Token.endswith("'"):\r
+                raise BadExpression(ERR_STRING_TOKEN % self._Token)\r
         self._Token = self._Token[1:-1]\r
         return self._Token\r
 \r
@@ -859,13 +891,13 @@ class ValueExpressionEx(ValueExpression):
                         for Index, Item in enumerate(PcdValueList):\r
                             # compute byte offset of every LABEL\r
                             Item = Item.strip()\r
-                            try:\r
-                                LabelList = ReLabel.findall(Item)\r
+                            LabelList = ReLabel.findall(Item)\r
+                            if LabelList:\r
                                 for Label in LabelList:\r
+                                    if not IsValidCString(Label):\r
+                                        raise BadExpression('%s is not a valid c variable name' % Label)\r
                                     if Label not in LabelDict.keys():\r
                                         LabelDict[Label] = str(LabelOffset)\r
-                            except:\r
-                                pass\r
                             if Item.startswith('UINT8'):\r
                                 LabelOffset = LabelOffset + 1\r
                             elif Item.startswith('UINT16'):\r