]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/Expression.py
BaseTools: Fix flexible PCD single quote and double quote bugs
[mirror_edk2.git] / BaseTools / Source / Python / Common / Expression.py
index edb0a60de6007a367bdf80245fc061d665a3e469..f1516d5c7bb8c9bd39ffcc5dd1eabad2a2ff6d1d 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
@@ -483,6 +496,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 +505,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 +554,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