]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/PcdTools/org/tianocore/pcd/entity/Token.java
Fix track EDKT213: PCD value size should be specificed when generate const variable...
[mirror_edk2.git] / Tools / Source / PcdTools / org / tianocore / pcd / entity / Token.java
index 8429dfd0036ca8ee114f02739370739b4c7f954a..74f55ddec31748b75e9528c4f07496757e775739 100644 (file)
@@ -21,9 +21,6 @@ import java.util.HashMap;
 import java.util.List;\r
 import java.util.Map;\r
 \r
-import org.tianocore.pcd.entity.UsageIdentification;\r
-import org.tianocore.pcd.exception.EntityException;\r
-\r
 /**\r
    This class is to descript a PCD token object. The information of a token mainly\r
    comes from MSA, SPD and setting produced by platform developer.\r
@@ -32,7 +29,7 @@ public class Token {
     ///\r
     /// Enumeration macro defintion for PCD type.\r
     ///\r
-    public enum             PCD_TYPE {FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODULE, DYNAMIC,\r
+    public static enum      PCD_TYPE {FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODULE, DYNAMIC,\r
                                       DYNAMIC_EX, UNKNOWN}\r
 \r
     ///\r
@@ -40,12 +37,12 @@ public class Token {
     /// Wizard maybe expand this type as "int, unsigned int, short, unsigned short etc" in\r
     /// prompt dialog.\r
     ///\r
-    public enum             DATUM_TYPE {UINT8, UINT16, UINT32, UINT64, BOOLEAN, POINTER, UNKNOWN}\r
+    public static enum      DATUM_TYPE {UINT8, UINT16, UINT32, UINT64, BOOLEAN, POINTER, UNKNOWN}\r
 \r
     ///\r
     /// Enumeration macor defintion for usage of PCD\r
     ///\r
-    public enum             PCD_USAGE {ALWAYS_PRODUCED, ALWAYS_CONSUMED, SOMETIMES_PRODUCED,\r
+    public static enum      PCD_USAGE {ALWAYS_PRODUCED, ALWAYS_CONSUMED, SOMETIMES_PRODUCED,\r
                                        SOMETIMES_CONSUMED, UNKNOWN}\r
 \r
     ///\r
@@ -137,7 +134,8 @@ public class Token {
       @param pcdType    new PCD type found in FPD file for this token.\r
     **/\r
     public void updateSupportPcdType(PCD_TYPE pcdType) {\r
-        for (int index = 0; index < this.supportedPcdType.size(); index ++) {\r
+        int size = supportedPcdType.size();\r
+        for (int index = 0; index < size; index++) {\r
             if (supportedPcdType.get(index) == pcdType) {\r
                 return;\r
             }\r
@@ -156,7 +154,7 @@ public class Token {
        @param pcdType       the judged pcd type\r
 \r
        @return boolean\r
-     */\r
+    **/\r
     public static boolean isDynamic(PCD_TYPE pcdType) {\r
         if ((pcdType == PCD_TYPE.DYNAMIC   ) ||\r
             (pcdType == PCD_TYPE.DYNAMIC_EX)) {\r
@@ -166,8 +164,15 @@ public class Token {
         return false;\r
     }\r
 \r
+    /**\r
+       The pcd type is DynamicEx?\r
+\r
+       @retval true     Is DynamicEx type\r
+       @retval false    not DynamicEx type\r
+    **/\r
     public boolean isDynamicEx() {\r
-        for (int i = 0; i < supportedPcdType.size(); i++) {\r
+        int size = supportedPcdType.size();\r
+        for (int i = 0; i < size; i++) {\r
             if (supportedPcdType.get(i) == PCD_TYPE.DYNAMIC_EX) {\r
                 return true;\r
             }\r
@@ -188,7 +193,7 @@ public class Token {
         if (tokenSpaceName == null) {\r
             return cName + "_nullTokenSpaceGuid";\r
         } else {\r
-            return cName + "_" + tokenSpaceName.toString().replace('-', '_');\r
+            return cName + "_" + tokenSpaceName.toString().replace('-', '_').toLowerCase();\r
         }\r
     }\r
 \r
@@ -196,7 +201,7 @@ public class Token {
        If skudata list contains more than one data, then Sku mechanism is enable.\r
 \r
        @retval boolean  if the number of sku data exceed to 1\r
-     */\r
+    **/\r
     public boolean isSkuEnable() {\r
         if (this.skuData.size() > 1) {\r
             return true;\r
@@ -232,7 +237,7 @@ public class Token {
        Get the token primary key in token database.\r
 \r
        @return String\r
-     */\r
+    **/\r
     public String getPrimaryKeyString () {\r
         return Token.getPrimaryKeyString(cName, tokenSpaceName);\r
     }\r
@@ -277,16 +282,9 @@ public class Token {
       @retval TRUE  - Success to add usage instance.\r
       @retval FALSE - Fail to add usage instance\r
     **/\r
-    public boolean addUsageInstance(UsageInstance usageInstance) throws EntityException {\r
-        String exceptionStr;\r
-\r
+    public boolean addUsageInstance(UsageInstance usageInstance) {\r
         if (isUsageInstanceExist(usageInstance.usageId)) {\r
-            exceptionStr = String.format("[PCD Collection Tool Exception] PCD %s for module %s has already exist in database, Please check all PCD build entries "+\r
-                                         "in modules %s in <ModuleSA> to make sure no duplicated definitions in FPD file!",\r
-                                         usageInstance.parentToken.cName,\r
-                                         usageInstance.usageId.moduleName,\r
-                                         usageInstance.usageId.moduleName);\r
-            throw new EntityException(exceptionStr);\r
+            return false;\r
         }\r
 \r
         //\r
@@ -303,7 +301,7 @@ public class Token {
        @param usageId       The UsageInstance identification for usage instance\r
 \r
        @return boolean      whether exist an usage instance for this token.\r
-     */\r
+    **/\r
     public boolean isUsageInstanceExist(UsageIdentification usageId) {\r
         String keyStr = UsageInstance.getPrimaryKey(usageId);\r
 \r
@@ -317,7 +315,7 @@ public class Token {
 \r
       @return PCD_TYPE\r
     **/\r
-    public static PCD_TYPE getpcdTypeFromString(String pcdTypeStr) {\r
+    public static PCD_TYPE getPcdTypeFromString(String pcdTypeStr) {\r
         if (pcdTypeStr == null) {\r
             return PCD_TYPE.UNKNOWN;\r
         }\r
@@ -345,21 +343,7 @@ public class Token {
       @return The string of datum type.\r
     **/\r
     public static String getStringOfdatumType(DATUM_TYPE  datumType) {\r
-        switch (datumType) {\r
-        case UINT8:\r
-            return "UINT8";\r
-        case UINT16:\r
-            return "UINT16";\r
-        case UINT32:\r
-            return "UINT32";\r
-        case UINT64:\r
-            return "UINT64";\r
-        case POINTER:\r
-            return "POINTER";\r
-        case BOOLEAN:\r
-            return "BOOLEAN";\r
-        }\r
-        return "UNKNOWN";\r
+        return datumType.toString();\r
     }\r
 \r
     /**\r
@@ -394,19 +378,7 @@ public class Token {
       @return The string of PCD_TYPE.\r
     **/\r
     public static String getStringOfpcdType(PCD_TYPE pcdType) {\r
-        switch (pcdType) {\r
-        case FEATURE_FLAG:\r
-            return "FEATURE_FLAG";\r
-        case FIXED_AT_BUILD:\r
-            return "FIXED_AT_BUILD";\r
-        case PATCHABLE_IN_MODULE:\r
-            return "PATCHABLE_IN_MODULE";\r
-        case DYNAMIC:\r
-            return "DYNAMIC";\r
-        case DYNAMIC_EX:\r
-            return "DYNAMIC_EX";\r
-        }\r
-        return "UNKNOWN";\r
+        return pcdType.toString();\r
     }\r
 \r
     /**\r
@@ -442,17 +414,7 @@ public class Token {
       @return The string of PDC_USAGE.\r
     **/\r
     public static String getStringOfUsage(PCD_USAGE usage) {\r
-        switch (usage) {\r
-        case ALWAYS_PRODUCED:\r
-            return "ALWAYS_PRODUCED";\r
-        case ALWAYS_CONSUMED:\r
-            return "ALWAYS_CONSUMED";\r
-        case SOMETIMES_PRODUCED:\r
-            return "SOMETIMES_PRODUCED";\r
-        case SOMETIMES_CONSUMED:\r
-            return "SOMETIMES_CONSUMED";\r
-        }\r
-        return "UNKNOWN";\r
+        return usage.toString();\r
     }\r
 \r
     /**\r
@@ -540,9 +502,9 @@ public class Token {
        @retval DynamicTokenValue    the value of this dyanmic token.\r
     **/\r
     public DynamicTokenValue getDefaultSku() {\r
-        int               index;\r
-\r
-        for (index = 0; index < this.skuData.size(); index ++) {\r
+        int index;\r
+        int size = skuData.size();\r
+        for (index = 0; index < size; index++) {\r
             if (skuData.get(index).id == 0) {\r
                 return skuData.get(index).value;\r
             }\r
@@ -564,7 +526,7 @@ public class Token {
        Get the size of PCD value, this PCD is POINTER type.\r
 \r
        @param str   the string of the value\r
-       @param al\r
+       @param al    the array list for outer parameter.\r
     **/\r
     private void getCurrentSizeFromDefaultValue (String str, ArrayList<Integer> al) {\r
         if (isValidNullValue(str)) {\r
@@ -644,8 +606,8 @@ public class Token {
        SKU 0 will be returned; For Default type, the defaultvalue of default SKU\r
        0 will be returned.\r
 \r
-       @return String\r
-     */\r
+       @return String get the default value for a DYNAMIC type PCD.\r
+    **/\r
     public String getDynamicDefaultValue() {\r
         DynamicTokenValue dynamicData = getDefaultSku();\r
         if (hasDefaultValue()) {\r
@@ -658,10 +620,11 @@ public class Token {
         return null;\r
     }\r
 \r
-    //\r
-    // BugBug: We need change this algorithm accordingly when schema is updated\r
-    //          to support no default value.\r
-    //\r
+    /**\r
+        Judge whether a DYNAMIC PCD has default value.\r
+\r
+        @return whether a DYNAMIC PCD has default value.\r
+    **/\r
     public boolean hasDefaultValue () {\r
         DynamicTokenValue dynamicValue  = null;\r
 \r
@@ -687,10 +650,10 @@ public class Token {
     /**\r
        Judge the value is NULL value. NULL value means the value is uninitialized value\r
 \r
-       @param judgedValue\r
+       @param judgedValue   the want want to be judged\r
 \r
-       @return boolean\r
-     */\r
+       @return boolean  whether the value of PCD is NULL.\r
+    **/\r
     public boolean isValidNullValue(String judgedValue) {\r
         String      subStr;\r
         BigInteger  bigIntValue;\r
@@ -742,12 +705,21 @@ public class Token {
             }\r
             break;\r
         case POINTER:\r
-            if (judgedValue.equalsIgnoreCase("")        ||\r
-                judgedValue.equalsIgnoreCase("\"\"")   ||\r
+            if (judgedValue.equalsIgnoreCase("\"\"")   ||\r
                 judgedValue.equalsIgnoreCase("L\"\"")   ||\r
-                (judgedValue.length() == 0)             ||\r
-                judgedValue.equalsIgnoreCase("{0}")) {\r
+                (judgedValue.length() == 0)) {\r
                 return true;\r
+            } else if (judgedValue.trim().charAt(0) == '{') {\r
+                int       start         = judgedValue.indexOf('{');\r
+                int       end           = judgedValue.lastIndexOf('}');\r
+                String[]  strValueArray = judgedValue.substring(start + 1, end).split(",");\r
+                if (strValueArray.length > 1) {\r
+                    return false;\r
+                } else {\r
+                    if (strValueArray[0].matches("(0x)?(0X)?0*")) {\r
+                        return true;\r
+                    }\r
+                }\r
             }\r
         }\r
         return false;\r
@@ -756,7 +728,7 @@ public class Token {
     /**\r
        Is the string value in Unicode\r
 \r
-       @return boolean\r
+       @return boolean the string value is UNICODE type string.\r
     **/\r
     public boolean isHiiDefaultValueUnicodeStringType() {\r
         DynamicTokenValue dynamicData = getDefaultSku();\r
@@ -771,7 +743,7 @@ public class Token {
     /**\r
        Is the string value in ANSCI\r
 \r
-       @return boolean\r
+       @return boolean whether the dfault value for HII case is string type.\r
     **/\r
     public boolean isHiiDefaultValueASCIIStringType() {\r
         DynamicTokenValue dynamicData = getDefaultSku();\r
@@ -785,8 +757,9 @@ public class Token {
 \r
     /**\r
        Judege whether current value is UNICODE string type.\r
-       @return boolean\r
-     */\r
+\r
+       @return boolean whether the value is UNICODE string.\r
+    **/\r
     public boolean isUnicodeStringType () {\r
         String str = getDynamicDefaultValue();\r
 \r
@@ -803,6 +776,11 @@ public class Token {
         return false;\r
     }\r
 \r
+    /**\r
+       Judge whether the string type is ANSIC string.\r
+\r
+       @return boolean whether the string type is ANSIC string\r
+    **/\r
     public boolean isASCIIStringType () {\r
         String str = getDynamicDefaultValue();\r
 \r
@@ -819,6 +797,12 @@ public class Token {
         return false;\r
     }\r
 \r
+    /**\r
+       Judge whether the string value is byte array.\r
+\r
+       @return boolean  whether the string value is byte array.\r
+\r
+    **/\r
     public boolean isByteStreamType () {\r
         String str = getDynamicDefaultValue();\r
 \r
@@ -836,9 +820,139 @@ public class Token {
 \r
     }\r
 \r
+    /**\r
+       Get string value for ANSIC string type\r
+\r
+       @return String the string value\r
+    **/\r
     public String getStringTypeString () {\r
         return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1);\r
     }\r
+\r
+    /**\r
+       Judge whether a datum string is byte array.\r
+       \r
+       @param datum             datum string\r
+       \r
+       @return boolean          true - is byte array, false - not byte array\r
+    **/\r
+    public static boolean isByteArrayDatum(String datum) {\r
+        if (datum == null) {\r
+            return false;\r
+        }\r
+\r
+        String trimedStr = datum.trim();\r
+\r
+        if (trimedStr.length() == 0) {\r
+            return false;\r
+        }\r
+\r
+        if (trimedStr.startsWith("{") && \r
+            trimedStr.endsWith("}")) {\r
+            return true;\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    /**\r
+       Judge whether a datum string is unicode.\r
+       \r
+       @param datum             datum string\r
+       \r
+       @return boolean          true - is unicode, false - not unicode\r
+    **/\r
+    public static boolean isUnicodeDatum(String datum) {\r
+        if (datum  == null) {\r
+            return false;\r
+        }\r
+\r
+        String trimedStr = datum.trim();\r
+        if (trimedStr.length() == 0) {\r
+            return false;\r
+        }\r
+\r
+        if (trimedStr.startsWith("L")  &&\r
+            trimedStr.charAt(1) == '"' &&\r
+            trimedStr.endsWith("\"")) {\r
+            return true;\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    /**\r
+       Judge whether a datum string is ANSCI string.\r
+       \r
+       @param datum             datum string\r
+       \r
+       @return boolean          true - is ANSIC, false - not ANSIC\r
+    **/\r
+    public static boolean isAnsciDatum(String datum) {\r
+        if (datum == null) {\r
+            return false;\r
+        }\r
+\r
+        String trimedStr = datum.trim();\r
+\r
+        if (trimedStr.length() == 0) {\r
+            return false;\r
+        }\r
+\r
+        if (datum.startsWith("\"") &&\r
+            datum.endsWith("\"")) {\r
+            return true;\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    /**\r
+       Get byte array string for POINTER type Datum.\r
+       \r
+       @param datum         the datum whose type is POINTER\r
+       \r
+       @return String       the byte array string\r
+    **/\r
+    public String getByteArrayForPointerDatum(String datum) {\r
+        String byteArray = "{";\r
+\r
+        if (datumType != Token.DATUM_TYPE.POINTER) {\r
+            return null;\r
+        }\r
+\r
+        if (Token.isAnsciDatum(datum)) {\r
+            String trimedStr = datum.trim();\r
+            trimedStr = trimedStr.substring(1, trimedStr.length() - 1);\r
+            char charArray[] = trimedStr.toCharArray();\r
+            for (int index = 0; index < charArray.length; index++) {\r
+                byteArray += String.format("0x%02x ", (byte)charArray[index]);\r
+                if (index != (charArray.length - 1)) {\r
+                    byteArray += ",";\r
+                }\r
+            }\r
+        } else if (Token.isUnicodeDatum(datum)) {\r
+            String trimedStr = datum.trim();\r
+            trimedStr = trimedStr.substring(2, trimedStr.length() - 1);\r
+            for (int index = 0; index < trimedStr.length(); index++) {\r
+                short unicodeVal = (short)trimedStr.codePointAt(index);\r
+                byteArray += String.format("0x%02x, 0x%02x", \r
+                                           (byte)unicodeVal,\r
+                                           (byte)((unicodeVal & 0xFF00) >> 8));\r
+                if (index != (trimedStr.length() - 1)) {\r
+                    byteArray += " ,";\r
+                }\r
+            }\r
+        } else if (Token.isByteArrayDatum(datum)){\r
+            return datum;\r
+        } else {\r
+            return null;\r
+        }\r
+\r
+        byteArray += "}";\r
+\r
+        return byteArray;\r
+    }\r
 }\r
 \r
 \r