**/\r
package org.tianocore.build.pcd.action;\r
\r
-import java.io.BufferedReader; \r
import java.io.File;\r
-import java.io.FileReader;\r
import java.io.IOException;\r
import java.math.BigInteger;\r
import java.util.ArrayList;\r
import org.tianocore.pcd.entity.UsageInstance;\r
import org.tianocore.pcd.exception.EntityException;\r
\r
-/**\r
- CStructTypeDeclaration \r
- \r
- This class is used to store the declaration string, such as\r
- "UINT32 PcdPlatformFlashBaseAddress", of \r
- each memember in the C structure, which is a standard C language\r
- feature used to implement a simple and efficient database for\r
- dynamic(ex) type PCD entry.\r
-**/\r
-\r
-class CStructTypeDeclaration {\r
- String key;\r
- int alignmentSize;\r
- String cCode;\r
- boolean initTable;\r
- \r
- public CStructTypeDeclaration (String key, int alignmentSize, String cCode, boolean initTable) {\r
- this.key = key;\r
- this.alignmentSize = alignmentSize;\r
- this.cCode = cCode;\r
- this.initTable = initTable;\r
- }\r
-}\r
-\r
-/**\r
- StringTable \r
- \r
- This class is used to store the String in a PCD database.\r
- \r
-**/\r
-class StringTable {\r
- private ArrayList<String> al; \r
- private ArrayList<String> alComments;\r
- private String phase;\r
- int len; \r
-\r
- public StringTable (String phase) {\r
- this.phase = phase;\r
- al = new ArrayList<String>();\r
- alComments = new ArrayList<String>();\r
- len = 0;\r
- }\r
-\r
- public String getSizeMacro () {\r
- return String.format(PcdDatabase.StringTableSizeMacro, phase, getSize());\r
- }\r
-\r
- private int getSize () {\r
- //\r
- // We have at least one Unicode Character in the table.\r
- //\r
- return len == 0 ? 1 : len;\r
- }\r
-\r
- public String getExistanceMacro () {\r
- return String.format(PcdDatabase.StringTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
- }\r
- \r
- public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable) {\r
- final String stringTable = "StringTable";\r
- final String tab = "\t";\r
- final String newLine = "\r\n";\r
- final String commaNewLine = ",\r\n";\r
- \r
- CStructTypeDeclaration decl;\r
-\r
- String cDeclCode = "";\r
- String cInstCode = "";\r
-\r
- //\r
- // If we have a empty StringTable\r
- //\r
- if (al.size() == 0) {\r
- cDeclCode += String.format("%-20s%s[1]; /* StringTable is empty */", "UINT16", stringTable) + newLine; \r
- decl = new CStructTypeDeclaration (\r
- stringTable,\r
- 2,\r
- cDeclCode,\r
- true\r
- ); \r
- declaList.add(decl);\r
-\r
- cInstCode = String.format("/* %s */", stringTable) + newLine + tab + "{ 0 }";\r
- instTable.put(stringTable, cInstCode);\r
- } else {\r
-\r
- //\r
- // If there is any String in the StringTable\r
- //\r
- for (int i = 0; i < al.size(); i++) {\r
- String str = al.get(i);\r
- String stringTableName;\r
- \r
- if (i == 0) {\r
- //\r
- // StringTable is a well-known name in the PCD DXE driver\r
- //\r
- stringTableName = stringTable;\r
- \r
- } else {\r
- stringTableName = String.format("%s_%d", stringTable, i);\r
- cDeclCode += tab;\r
- }\r
- cDeclCode += String.format("%-20s%s[%d]; /* %s */", "UINT16", \r
- stringTableName, str.length() + 1, \r
- alComments.get(i)) \r
- + newLine;\r
- \r
- if (i == 0) {\r
- cInstCode = "/* StringTable */" + newLine;\r
- }\r
- \r
- cInstCode += tab + String.format("L\"%s\" /* %s */", al.get(i), alComments.get(i));\r
- if (i != al.size() - 1) {\r
- cInstCode += commaNewLine;\r
- }\r
- }\r
- \r
- decl = new CStructTypeDeclaration (\r
- stringTable,\r
- 2,\r
- cDeclCode,\r
- true\r
- ); \r
- declaList.add(decl);\r
- \r
- instTable.put(stringTable, cInstCode);\r
- }\r
- }\r
-\r
- public int add (String inputStr, Token token) {\r
- int i;\r
- int pos;\r
-\r
- String str = inputStr;\r
- \r
- //\r
- // The input can be two types:\r
- // "L\"Bootmode\"" or "Bootmode". \r
- // We drop the L\" and \" for the first type. \r
- if (str.startsWith("L\"") && str.endsWith("\"")) {\r
- str = str.substring(2, str.length() - 1);\r
- }\r
- //\r
- // Check if StringTable has this String already.\r
- // If so, return the current pos.\r
- //\r
- for (i = 0, pos = 0; i < al.size(); i++) {\r
- String s = al.get(i);;\r
-\r
- if (str.equals(s)) {\r
- return pos;\r
- }\r
- pos = s.length() + 1;\r
- }\r
- \r
- i = len;\r
- //\r
- // Include the NULL character at the end of String\r
- //\r
- len += str.length() + 1; \r
- al.add(str);\r
- alComments.add(token.getPrimaryKeyString());\r
-\r
- return i;\r
- }\r
-}\r
-\r
-/**\r
- SizeTable \r
- \r
- This class is used to store the Size information for\r
- POINTER TYPE PCD entry in a PCD database.\r
-\r
-**/\r
-class SizeTable {\r
- private ArrayList<ArrayList<Integer>> al;\r
- private ArrayList<String> alComments;\r
- private int len;\r
- private String phase;\r
- \r
- public SizeTable (String phase) {\r
- al = new ArrayList<ArrayList<Integer>>();\r
- alComments = new ArrayList<String>();\r
- len = 0;\r
- this.phase = phase;\r
- }\r
-\r
- public String getSizeMacro () {\r
- return String.format(PcdDatabase.SizeTableSizeMacro, phase, getSize());\r
- }\r
- \r
- private int getSize() {\r
- return len == 0 ? 1 : len;\r
- }\r
-\r
- public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
- final String name = "SizeTable";\r
- \r
- CStructTypeDeclaration decl;\r
- String cCode;\r
-\r
- cCode = String.format(PcdDatabase.SizeTableDeclaration, phase); \r
- decl = new CStructTypeDeclaration (\r
- name,\r
- 2,\r
- cCode,\r
- true\r
- ); \r
- declaList.add(decl);\r
-\r
-\r
- cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
- instTable.put(name, cCode);\r
- }\r
-\r
- private ArrayList<String> getInstantiation () {\r
- final String comma = ",";\r
- ArrayList<String> Output = new ArrayList<String>();\r
-\r
- Output.add("/* SizeTable */");\r
- Output.add("{");\r
- if (al.size() == 0) {\r
- Output.add("\t0");\r
- } else {\r
- for (int index = 0; index < al.size(); index++) {\r
- ArrayList<Integer> ial = al.get(index);\r
- \r
- String str = "\t";\r
- \r
- for (int index2 = 0; index2 < ial.size(); index2++) {\r
- str += " " + ial.get(index2).toString();\r
- if (index2 != ial.size() - 1) {\r
- str += comma;\r
- }\r
- }\r
-\r
- str += " /* " + alComments.get(index) + " */"; \r
- \r
- if (index != (al.size() - 1)) {\r
- str += comma;\r
- }\r
-\r
- Output.add(str);\r
- \r
- }\r
- }\r
- Output.add("}");\r
-\r
- return Output;\r
- }\r
-\r
- public void add (Token token) {\r
-\r
- //\r
- // We only have size information for POINTER type PCD entry.\r
- //\r
- if (token.datumType != Token.DATUM_TYPE.POINTER) {\r
- return;\r
- }\r
- \r
- ArrayList<Integer> ial = token.getPointerTypeSize();\r
- \r
- len+= ial.size(); \r
-\r
- al.add(ial);\r
- alComments.add(token.getPrimaryKeyString());\r
-\r
- return;\r
- }\r
- \r
-}\r
-\r
-/**\r
- GuidTable \r
- \r
- This class is used to store the GUIDs in a PCD database.\r
-**/\r
-class GuidTable {\r
- private ArrayList<UUID> al;\r
- private ArrayList<String> alComments;\r
- private String phase;\r
- private int len;\r
- private int bodyLineNum;\r
-\r
- public GuidTable (String phase) {\r
- this.phase = phase;\r
- al = new ArrayList<UUID>();\r
- alComments = new ArrayList<String>();\r
- len = 0;\r
- bodyLineNum = 0;\r
- }\r
-\r
- public String getSizeMacro () {\r
- return String.format(PcdDatabase.GuidTableSizeMacro, phase, getSize());\r
- }\r
-\r
- private int getSize () {\r
- return (al.size() == 0)? 1 : al.size();\r
- }\r
-\r
- public String getExistanceMacro () {\r
- return String.format(PcdDatabase.GuidTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
- }\r
-\r
- public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
- final String name = "GuidTable";\r
- \r
- CStructTypeDeclaration decl;\r
- String cCode = "";\r
-\r
- cCode += String.format(PcdDatabase.GuidTableDeclaration, phase); \r
- decl = new CStructTypeDeclaration (\r
- name,\r
- 4,\r
- cCode,\r
- true\r
- ); \r
- declaList.add(decl);\r
-\r
-\r
- cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
- instTable.put(name, cCode);\r
- }\r
-\r
- private String getUuidCString (UUID uuid) {\r
- String[] guidStrArray;\r
-\r
- guidStrArray =(uuid.toString()).split("-");\r
-\r
- return String.format("{0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
- guidStrArray[0],\r
- guidStrArray[1],\r
- guidStrArray[2],\r
- (guidStrArray[3].substring(0, 2)),\r
- (guidStrArray[3].substring(2, 4)),\r
- (guidStrArray[4].substring(0, 2)),\r
- (guidStrArray[4].substring(2, 4)),\r
- (guidStrArray[4].substring(4, 6)),\r
- (guidStrArray[4].substring(6, 8)),\r
- (guidStrArray[4].substring(8, 10)),\r
- (guidStrArray[4].substring(10, 12))\r
- );\r
- }\r
-\r
- private ArrayList<String> getInstantiation () {\r
- ArrayList<String> Output = new ArrayList<String>();\r
-\r
- Output.add("/* GuidTable */");\r
- Output.add("{");\r
-\r
- if (al.size() == 0) {\r
- Output.add("\t" + getUuidCString(new UUID(0, 0)));\r
- }\r
- \r
- for (int i = 0; i < al.size(); i++) {\r
- String str = "\t" + getUuidCString(al.get(i));\r
-\r
- str += "/* " + alComments.get(i) + " */";\r
- if (i != (al.size() - 1)) {\r
- str += ",";\r
- }\r
- Output.add(str);\r
- bodyLineNum++;\r
-\r
- }\r
- Output.add("}");\r
-\r
- return Output;\r
- }\r
-\r
- public int add (UUID uuid, String name) {\r
- //\r
- // Check if GuidTable has this entry already.\r
- // If so, return the GuidTable index.\r
- //\r
- for (int i = 0; i < al.size(); i++) {\r
- if (al.get(i).compareTo(uuid) == 0) {\r
- return i;\r
- }\r
- }\r
- \r
- len++; \r
- al.add(uuid);\r
- alComments.add(name);\r
-\r
- //\r
- // Return the previous Table Index\r
- //\r
- return len - 1;\r
- }\r
-\r
-}\r
-\r
-/**\r
- SkuIdTable \r
- \r
- This class is used to store the SKU IDs in a PCD database.\r
-\r
-**/\r
-class SkuIdTable {\r
- private ArrayList<Integer[]> al;\r
- private ArrayList<String> alComment;\r
- private String phase;\r
- private int len;\r
-\r
- public SkuIdTable (String phase) {\r
- this.phase = phase;\r
- al = new ArrayList<Integer[]>();\r
- alComment = new ArrayList<String>();\r
- len = 0;\r
- }\r
-\r
- public String getSizeMacro () {\r
- return String.format(PcdDatabase.SkuIdTableSizeMacro, phase, getSize());\r
- }\r
-\r
- private int getSize () {\r
- return (len == 0)? 1 : len;\r
- }\r
-\r
- public String getExistanceMacro () {\r
- return String.format(PcdDatabase.SkuTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
- }\r
-\r
- public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
- final String name = "SkuIdTable";\r
- \r
- CStructTypeDeclaration decl;\r
- String cCode = "";\r
-\r
- cCode += String.format(PcdDatabase.SkuIdTableDeclaration, phase); \r
- decl = new CStructTypeDeclaration (\r
- name,\r
- 1,\r
- cCode,\r
- true\r
- ); \r
- declaList.add(decl);\r
-\r
-\r
- cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
- instTable.put(name, cCode);\r
-\r
- //\r
- // SystemSkuId is in PEI phase PCD Database\r
- //\r
- if (phase.equalsIgnoreCase("PEI")) {\r
- decl = new CStructTypeDeclaration (\r
- "SystemSkuId",\r
- 1,\r
- String.format("%-20sSystemSkuId;\r\n", "SKU_ID"),\r
- true\r
- );\r
- declaList.add(decl);\r
- \r
- instTable.put("SystemSkuId", "0");\r
- }\r
-\r
- }\r
-\r
- private ArrayList<String> getInstantiation () {\r
- ArrayList<String> Output = new ArrayList<String> ();\r
-\r
- Output.add("/* SkuIdTable */");\r
- Output.add("{");\r
-\r
- if (al.size() == 0) {\r
- Output.add("\t0");\r
- }\r
- \r
- for (int index = 0; index < al.size(); index++) {\r
- String str;\r
-\r
- str = "/* " + alComment.get(index) + "*/ ";\r
- str += "/* MaxSku */ ";\r
-\r
-\r
- Integer[] ia = al.get(index);\r
-\r
- str += "\t" + ia[0].toString() + ", ";\r
- for (int index2 = 1; index2 < ia.length; index2++) {\r
- str += ia[index2].toString();\r
- if (!((index2 == ia.length - 1) && (index == al.size() - 1))) {\r
- str += ", ";\r
- }\r
- }\r
-\r
- Output.add(str);\r
-\r
- }\r
-\r
- Output.add("}");\r
-\r
- return Output;\r
- }\r
-\r
- public int add (Token token) {\r
-\r
- int index;\r
- int pos;\r
- \r
- //\r
- // Check if this SKU_ID Array is already in the table\r
- //\r
- pos = 0;\r
- for (Object o: al) {\r
- Integer [] s = (Integer[]) o;\r
- boolean different = false;\r
- if (s[0] == token.getSkuIdCount()) {\r
- for (index = 1; index < s.length; index++) {\r
- if (s[index] != token.skuData.get(index-1).id) {\r
- different = true;\r
- break;\r
- }\r
- }\r
- } else {\r
- different = true;\r
- }\r
- if (different) {\r
- pos += s[0] + 1;\r
- } else {\r
- return pos;\r
- }\r
- }\r
-\r
- Integer [] skuIds = new Integer[token.skuData.size() + 1];\r
- skuIds[0] = new Integer(token.skuData.size());\r
- for (index = 1; index < skuIds.length; index++) {\r
- skuIds[index] = new Integer(token.skuData.get(index - 1).id);\r
- }\r
-\r
- index = len;\r
-\r
- len += skuIds.length; \r
- al.add(skuIds);\r
- alComment.add(token.getPrimaryKeyString());\r
-\r
- return index;\r
- }\r
-\r
-}\r
-\r
-class LocalTokenNumberTable {\r
- private ArrayList<String> al;\r
- private ArrayList<String> alComment;\r
- private String phase;\r
- private int len;\r
-\r
- public LocalTokenNumberTable (String phase) {\r
- this.phase = phase;\r
- al = new ArrayList<String>();\r
- alComment = new ArrayList<String>();\r
-\r
- len = 0;\r
- }\r
-\r
- public String getSizeMacro () {\r
- return String.format(PcdDatabase.LocalTokenNumberTableSizeMacro, phase, getSize())\r
- + String.format(PcdDatabase.LocalTokenNumberSizeMacro, phase, al.size());\r
- }\r
-\r
- public int getSize () {\r
- return (al.size() == 0)? 1 : al.size();\r
- }\r
-\r
- public String getExistanceMacro () {\r
- return String.format(PcdDatabase.DatabaseExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
- }\r
-\r
- public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
- final String name = "LocalTokenNumberTable";\r
- \r
- CStructTypeDeclaration decl;\r
- String cCode = "";\r
-\r
- cCode += String.format(PcdDatabase.LocalTokenNumberTableDeclaration, phase); \r
- decl = new CStructTypeDeclaration (\r
- name,\r
- 4,\r
- cCode,\r
- true\r
- ); \r
- declaList.add(decl);\r
-\r
- cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
- instTable.put(name, cCode);\r
- }\r
-\r
- private ArrayList<String> getInstantiation () {\r
- ArrayList<String> output = new ArrayList<String>();\r
-\r
- output.add("/* LocalTokenNumberTable */");\r
- output.add("{");\r
-\r
- if (al.size() == 0) {\r
- output.add("\t0");\r
- }\r
- \r
- for (int index = 0; index < al.size(); index++) {\r
- String str;\r
-\r
- str = "\t" + (String)al.get(index);\r
-\r
- str += " /* " + alComment.get(index) + " */ ";\r
-\r
-\r
- if (index != (al.size() - 1)) {\r
- str += ",";\r
- }\r
-\r
- output.add(str);\r
-\r
- }\r
-\r
- output.add("}");\r
-\r
- return output;\r
- }\r
-\r
- public int add (Token token) {\r
- int index = len;\r
- String str;\r
-\r
- len++; \r
-\r
- str = String.format(PcdDatabase.offsetOfStrTemplate, phase, token.hasDefaultValue() ? "Init" : "Uninit", token.getPrimaryKeyString());\r
-\r
- if (token.isUnicodeStringType()) {\r
- str += " | PCD_TYPE_STRING";\r
- }\r
-\r
- if (token.isSkuEnable()) {\r
- str += " | PCD_TYPE_SKU_ENABLED";\r
- }\r
-\r
- if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
- str += " | PCD_TYPE_HII";\r
- }\r
-\r
- if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
- str += " | PCD_TYPE_VPD";\r
- }\r
- \r
- switch (token.datumType) {\r
- case UINT8:\r
- case BOOLEAN:\r
- str += " | PCD_DATUM_TYPE_UINT8";\r
- break;\r
- case UINT16:\r
- str += " | PCD_DATUM_TYPE_UINT16";\r
- break;\r
- case UINT32:\r
- str += " | PCD_DATUM_TYPE_UINT32";\r
- break;\r
- case UINT64:\r
- str += " | PCD_DATUM_TYPE_UINT64";\r
- break;\r
- case POINTER:\r
- str += " | PCD_DATUM_TYPE_POINTER";\r
- break;\r
- }\r
- \r
- al.add(str);\r
- alComment.add(token.getPrimaryKeyString());\r
-\r
- return index;\r
- }\r
-}\r
-\r
-/**\r
- ExMapTable \r
- \r
- This class is used to store the table of mapping information\r
- between DynamicEX ID pair(Guid, TokenNumber) and\r
- the local token number assigned by PcdDatabase class.\r
-**/\r
-class ExMapTable {\r
-\r
- /**\r
- ExTriplet \r
- \r
- This class is used to store the mapping information\r
- between DynamicEX ID pair(Guid, TokenNumber) and\r
- the local token number assigned by PcdDatabase class.\r
- **/\r
- class ExTriplet {\r
- public Integer guidTableIdx;\r
- public Long exTokenNumber;\r
- public Long localTokenIdx;\r
- \r
- public ExTriplet (int guidTableIdx, long exTokenNumber, long localTokenIdx) {\r
- this.guidTableIdx = new Integer(guidTableIdx);\r
- this.exTokenNumber = new Long(exTokenNumber);\r
- this.localTokenIdx = new Long(localTokenIdx);\r
- }\r
- }\r
-\r
- private ArrayList<ExTriplet> al;\r
- private Map<ExTriplet, String> alComment;\r
- private String phase;\r
- private int len;\r
- private int bodyLineNum;\r
- \r
- public ExMapTable (String phase) {\r
- this.phase = phase;\r
- al = new ArrayList<ExTriplet>();\r
- alComment = new HashMap<ExTriplet, String>();\r
- bodyLineNum = 0;\r
- len = 0;\r
- }\r
-\r
- public String getSizeMacro () {\r
- return String.format(PcdDatabase.ExMapTableSizeMacro, phase, getTableLen())\r
- + String.format(PcdDatabase.ExTokenNumber, phase, al.size());\r
- }\r
-\r
- public String getExistanceMacro () {\r
- return String.format(PcdDatabase.ExMapTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
- }\r
-\r
- public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
- final String exMapTableName = "ExMapTable";\r
- \r
- sortTable();\r
- \r
- CStructTypeDeclaration decl;\r
- String cCode = "";\r
-\r
- cCode += String.format(PcdDatabase.ExMapTableDeclaration, phase); \r
- decl = new CStructTypeDeclaration (\r
- exMapTableName,\r
- 4,\r
- cCode,\r
- true\r
- ); \r
- declaList.add(decl);\r
-\r
-\r
- cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
- instTable.put(exMapTableName, cCode);\r
- }\r
- \r
- private ArrayList<String> getInstantiation () {\r
- ArrayList<String> Output = new ArrayList<String>();\r
-\r
- Output.add("/* ExMapTable */");\r
- Output.add("{");\r
- if (al.size() == 0) {\r
- Output.add("\t{0, 0, 0}");\r
- }\r
- \r
- int index;\r
- for (index = 0; index < al.size(); index++) {\r
- String str;\r
-\r
- ExTriplet e = (ExTriplet)al.get(index);\r
-\r
- str = "\t" + "{ " + String.format("0x%08X", e.exTokenNumber) + ", ";\r
- str += e.localTokenIdx.toString() + ", ";\r
- str += e.guidTableIdx.toString();\r
-\r
- str += "}" + " /* " + alComment.get(e) + " */" ;\r
-\r
- if (index != al.size() - 1) {\r
- str += ",";\r
- }\r
-\r
- Output.add(str);\r
- bodyLineNum++;\r
-\r
- }\r
-\r
- Output.add("}");\r
-\r
- return Output;\r
- }\r
-\r
- public int add (int localTokenIdx, long exTokenNum, int guidTableIdx, String name) {\r
- int index = len;\r
-\r
- len++;\r
- ExTriplet et = new ExTriplet(guidTableIdx, exTokenNum, localTokenIdx); \r
-\r
- al.add(et);\r
- alComment.put(et, name);\r
-\r
- return index;\r
- }\r
-\r
- private int getTableLen () {\r
- return al.size() == 0 ? 1 : al.size();\r
- }\r
-\r
- //\r
- // To simplify the algorithm for GetNextToken and GetNextTokenSpace in\r
- // PCD PEIM/Driver, we need to sort the ExMapTable according to the\r
- // following order:\r
- // 1) ExGuid\r
- // 2) ExTokenNumber\r
- // \r
- class ExTripletComp implements Comparator<ExTriplet> {\r
- public int compare (ExTriplet a, ExTriplet b) {\r
- if (a.guidTableIdx == b.guidTableIdx ) {\r
- //\r
- // exTokenNumber is long, we can't use simple substraction.\r
- //\r
- if (a.exTokenNumber > b.exTokenNumber) {\r
- return 1;\r
- } else if (a.exTokenNumber == b.exTokenNumber) {\r
- return 0;\r
- } else {\r
- return -1;\r
- }\r
- }\r
- \r
- return a.guidTableIdx - b.guidTableIdx;\r
- }\r
- }\r
-\r
- private void sortTable () {\r
- java.util.Comparator<ExTriplet> comparator = new ExTripletComp();\r
- java.util.Collections.sort(al, comparator);\r
- }\r
-}\r
-\r
-/**\r
- PcdDatabase \r
- \r
- This class is used to generate C code for Autogen.h and Autogen.c of\r
- a PCD service DXE driver and PCD service PEIM.\r
-**/\r
-class PcdDatabase {\r
-\r
- private final static int SkuHeadAlignmentSize = 4;\r
- private final String newLine = "\r\n";\r
- private final String commaNewLine = ",\r\n";\r
- private final String tab = "\t";\r
- public final static String ExMapTableDeclaration = "DYNAMICEX_MAPPING ExMapTable[%s_EXMAPPING_TABLE_SIZE];\r\n";\r
- public final static String GuidTableDeclaration = "EFI_GUID GuidTable[%s_GUID_TABLE_SIZE];\r\n";\r
- public final static String LocalTokenNumberTableDeclaration = "UINT32 LocalTokenNumberTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
- public final static String StringTableDeclaration = "UINT16 StringTable[%s_STRING_TABLE_SIZE];\r\n";\r
- public final static String SizeTableDeclaration = "SIZE_INFO SizeTable[%s_SIZE_TABLE_SIZE];\r\n";\r
- public final static String SkuIdTableDeclaration = "UINT8 SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";\r
-\r
-\r
- public final static String ExMapTableSizeMacro = "#define %s_EXMAPPING_TABLE_SIZE %d\r\n";\r
- public final static String ExTokenNumber = "#define %s_EX_TOKEN_NUMBER %d\r\n";\r
- public final static String GuidTableSizeMacro = "#define %s_GUID_TABLE_SIZE %d\r\n"; \r
- public final static String LocalTokenNumberTableSizeMacro = "#define %s_LOCAL_TOKEN_NUMBER_TABLE_SIZE %d\r\n";\r
- public final static String LocalTokenNumberSizeMacro = "#define %s_LOCAL_TOKEN_NUMBER %d\r\n";\r
- public final static String SizeTableSizeMacro = "#define %s_SIZE_TABLE_SIZE %d\r\n";\r
- public final static String StringTableSizeMacro = "#define %s_STRING_TABLE_SIZE %d\r\n";\r
- public final static String SkuIdTableSizeMacro = "#define %s_SKUID_TABLE_SIZE %d\r\n";\r
-\r
-\r
- public final static String ExMapTableExistenceMacro = "#define %s_EXMAP_TABLE_EMPTY %s\r\n"; \r
- public final static String GuidTableExistenceMacro = "#define %s_GUID_TABLE_EMPTY %s\r\n";\r
- public final static String DatabaseExistenceMacro = "#define %s_DATABASE_EMPTY %s\r\n";\r
- public final static String StringTableExistenceMacro = "#define %s_STRING_TABLE_EMPTY %s\r\n";\r
- public final static String SkuTableExistenceMacro = "#define %s_SKUID_TABLE_EMPTY %s\r\n";\r
-\r
- public final static String offsetOfSkuHeadStrTemplate = "offsetof(%s_PCD_DATABASE, %s.%s_SkuDataTable)";\r
- public final static String offsetOfVariableEnabledDefault = "offsetof(%s_PCD_DATABASE, %s.%s_VariableDefault_%d)";\r
- public final static String offsetOfStrTemplate = "offsetof(%s_PCD_DATABASE, %s.%s)";\r
- \r
- private final static String skuDataTableTemplate = "SkuDataTable";\r
-\r
-\r
- private StringTable stringTable;\r
- private GuidTable guidTable;\r
- private LocalTokenNumberTable localTokenNumberTable;\r
- private SkuIdTable skuIdTable;\r
- private SizeTable sizeTable;\r
- private ExMapTable exMapTable;\r
-\r
- private ArrayList<Token> alTokens;\r
- private String phase;\r
- private int assignedTokenNumber;\r
- \r
- //\r
- // Use two class global variable to store\r
- // temperary \r
- //\r
- private String privateGlobalName;\r
- private String privateGlobalCCode;\r
- //\r
- // After Major changes done to the PCD\r
- // database generation class PcdDatabase\r
- // Please increment the version and please\r
- // also update the version number in PCD\r
- // service PEIM and DXE driver accordingly.\r
- //\r
- private final int version = 2;\r
-\r
- private String hString;\r
- private String cString;\r
-\r
- /**\r
- Constructor for PcdDatabase class. \r
- \r
- <p>We have two PCD dynamic(ex) database for the Framework implementation. One\r
- for PEI phase and the other for DXE phase. </p>\r
- \r
- @param alTokens A ArrayList of Dynamic(EX) PCD entry.\r
- @param exePhase The phase to generate PCD database for: valid input\r
- is "PEI" or "DXE".\r
- @param startLen The starting Local Token Number for the PCD database. For\r
- PEI phase, the starting Local Token Number starts from 0.\r
- For DXE phase, the starting Local Token Number starts\r
- from the total number of PCD entry of PEI phase.\r
- @return void\r
- **/\r
- public PcdDatabase (ArrayList<Token> alTokens, String exePhase, int startLen) {\r
- phase = exePhase;\r
-\r
- stringTable = new StringTable(phase);\r
- guidTable = new GuidTable(phase);\r
- localTokenNumberTable = new LocalTokenNumberTable(phase);\r
- skuIdTable = new SkuIdTable(phase);\r
- sizeTable = new SizeTable(phase);\r
- exMapTable = new ExMapTable(phase); \r
-\r
- //\r
- // Local token number 0 is reserved for INVALID_TOKEN_NUMBER.\r
- // So we will increment 1 for the startLen passed from the \r
- // constructor.\r
- //\r
- assignedTokenNumber = startLen + 1;\r
- this.alTokens = alTokens;\r
- }\r
-\r
- private void getNonExAndExTokens (ArrayList<Token> alTokens, List<Token> nexTokens, List<Token> exTokens) {\r
- for (int i = 0; i < alTokens.size(); i++) {\r
- Token t = (Token)alTokens.get(i);\r
- if (t.isDynamicEx()) {\r
- exTokens.add(t);\r
- } else {\r
- nexTokens.add(t);\r
- }\r
- }\r
-\r
- return;\r
- }\r
-\r
- private int getDataTypeAlignmentSize (Token token) {\r
- switch (token.datumType) {\r
- case UINT8:\r
- return 1;\r
- case UINT16:\r
- return 2;\r
- case UINT32:\r
- return 4;\r
- case UINT64:\r
- return 8;\r
- case POINTER:\r
- return 1;\r
- case BOOLEAN:\r
- return 1;\r
- default:\r
- return 1;\r
- }\r
- }\r
- \r
- private int getHiiPtrTypeAlignmentSize(Token token) {\r
- switch (token.datumType) {\r
- case UINT8:\r
- return 1;\r
- case UINT16:\r
- return 2;\r
- case UINT32:\r
- return 4;\r
- case UINT64:\r
- return 8;\r
- case POINTER:\r
- if (token.isHiiEnable()) {\r
- if (token.isHiiDefaultValueUnicodeStringType()) {\r
- return 2;\r
- }\r
- }\r
- return 1;\r
- case BOOLEAN:\r
- return 1;\r
- default:\r
- return 1;\r
- }\r
- }\r
- \r
- private int getAlignmentSize (Token token) {\r
- if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
- return 2;\r
- }\r
-\r
- if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
- return 4;\r
- }\r
-\r
- if (token.isUnicodeStringType()) {\r
- return 2;\r
- }\r
- \r
- return getDataTypeAlignmentSize(token);\r
- }\r
-\r
- public String getCString () {\r
- return cString;\r
- }\r
-\r
- public String getHString () {\r
- return hString;\r
- }\r
- \r
- private void genCodeWorker(Token t,\r
- ArrayList<CStructTypeDeclaration> declaList,\r
- HashMap<String, String> instTable, String phase)\r
- throws EntityException {\r
-\r
- CStructTypeDeclaration decl;\r
-\r
- //\r
- // Insert SKU_HEAD if isSkuEnable is true\r
- //\r
- if (t.isSkuEnable()) {\r
- int tableIdx;\r
- tableIdx = skuIdTable.add(t);\r
- decl = new CStructTypeDeclaration(t.getPrimaryKeyString(),\r
- SkuHeadAlignmentSize, getSkuEnabledTypeDeclaration(t), true);\r
- declaList.add(decl);\r
- instTable.put(t.getPrimaryKeyString(),\r
- getSkuEnabledTypeInstantiaion(t, tableIdx));\r
- }\r
-\r
- //\r
- // Insert PCD_ENTRY declaration and instantiation\r
- //\r
- getCDeclarationString(t);\r
-\r
- decl = new CStructTypeDeclaration(privateGlobalName,\r
- getAlignmentSize(t), privateGlobalCCode, t.hasDefaultValue());\r
- declaList.add(decl);\r
-\r
- if (t.hasDefaultValue()) {\r
- instTable.put(privateGlobalName, \r
- getTypeInstantiation(t, declaList, instTable, phase)\r
- );\r
- }\r
-\r
- }\r
-\r
- private void ProcessTokens (List<Token> tokens, \r
- ArrayList<CStructTypeDeclaration> cStructDeclList,\r
- HashMap<String, String> cStructInstTable,\r
- String phase\r
- ) \r
- throws EntityException {\r
- \r
- for (int idx = 0; idx < tokens.size(); idx++) {\r
- Token t = tokens.get(idx);\r
- \r
- genCodeWorker (t, cStructDeclList, cStructInstTable, phase);\r
- \r
- sizeTable.add(t);\r
- localTokenNumberTable.add(t);\r
- t.tokenNumber = assignedTokenNumber++;\r
- \r
- //\r
- // Add a mapping if this dynamic PCD entry is a EX type\r
- //\r
- if (t.isDynamicEx()) {\r
- exMapTable.add((int)t.tokenNumber, \r
- t.dynamicExTokenNumber, \r
- guidTable.add(translateSchemaStringToUUID(t.tokenSpaceName), t.getPrimaryKeyString()), \r
- t.getPrimaryKeyString()\r
- );\r
- }\r
- }\r
-\r
- }\r
- \r
- public void genCode () throws EntityException {\r
- \r
- ArrayList<CStructTypeDeclaration> cStructDeclList = new ArrayList<CStructTypeDeclaration>();\r
- HashMap<String, String> cStructInstTable = new HashMap<String, String>();\r
- \r
- List<Token> nexTokens = new ArrayList<Token> ();\r
- List<Token> exTokens = new ArrayList<Token> ();\r
-\r
- getNonExAndExTokens (alTokens, nexTokens, exTokens);\r
-\r
- //\r
- // We have to process Non-Ex type PCD entry first. The reason is\r
- // that our optimization assumes that the Token Number of Non-Ex \r
- // PCD entry start from 1 (for PEI phase) and grows continously upwards.\r
- // \r
- // EX type token number starts from the last Non-EX PCD entry and\r
- // grows continously upwards.\r
- //\r
- ProcessTokens (nexTokens, cStructDeclList, cStructInstTable, phase);\r
- ProcessTokens (exTokens, cStructDeclList, cStructInstTable, phase);\r
- \r
- stringTable.genCode(cStructDeclList, cStructInstTable);\r
- skuIdTable.genCode(cStructDeclList, cStructInstTable, phase);\r
- exMapTable.genCode(cStructDeclList, cStructInstTable, phase);\r
- localTokenNumberTable.genCode(cStructDeclList, cStructInstTable, phase);\r
- sizeTable.genCode(cStructDeclList, cStructInstTable, phase);\r
- guidTable.genCode(cStructDeclList, cStructInstTable, phase);\r
- \r
- hString = genCMacroCode ();\r
- \r
- HashMap <String, String> result;\r
- \r
- result = genCStructCode(cStructDeclList, \r
- cStructInstTable, \r
- phase\r
- );\r
- \r
- hString += result.get("initDeclStr");\r
- hString += result.get("uninitDeclStr");\r
- \r
- hString += String.format("#define PCD_%s_SERVICE_DRIVER_VERSION %d", phase, version);\r
- \r
- cString = newLine + newLine + result.get("initInstStr");\r
- \r
- }\r
- \r
- private String genCMacroCode () {\r
- String macroStr = "";\r
-\r
- //\r
- // Generate size info Macro for all Tables\r
- //\r
- macroStr += guidTable.getSizeMacro();\r
- macroStr += stringTable.getSizeMacro();\r
- macroStr += skuIdTable.getSizeMacro();\r
- macroStr += localTokenNumberTable.getSizeMacro();\r
- macroStr += exMapTable.getSizeMacro();\r
- macroStr += sizeTable.getSizeMacro();\r
-\r
- //\r
- // Generate existance info Macro for all Tables\r
- //\r
- macroStr += guidTable.getExistanceMacro();\r
- macroStr += stringTable.getExistanceMacro();\r
- macroStr += skuIdTable.getExistanceMacro();\r
- macroStr += localTokenNumberTable.getExistanceMacro();\r
- macroStr += exMapTable.getExistanceMacro();\r
-\r
- macroStr += newLine;\r
- \r
- return macroStr;\r
- }\r
- \r
- private HashMap <String, String> genCStructCode(\r
- ArrayList<CStructTypeDeclaration> declaList, \r
- HashMap<String, String> instTable, \r
- String phase\r
- ) {\r
- \r
- int i;\r
- HashMap <String, String> result = new HashMap<String, String>();\r
- HashMap <Integer, ArrayList<String>> alignmentInitDecl = new HashMap<Integer, ArrayList<String>>();\r
- HashMap <Integer, ArrayList<String>> alignmentUninitDecl = new HashMap<Integer, ArrayList<String>>();\r
- HashMap <Integer, ArrayList<String>> alignmentInitInst = new HashMap<Integer, ArrayList<String>>();\r
- \r
- //\r
- // Initialize the storage for each alignment\r
- //\r
- for (i = 8; i > 0; i>>=1) {\r
- alignmentInitDecl.put(new Integer(i), new ArrayList<String>());\r
- alignmentInitInst.put(new Integer(i), new ArrayList<String>());\r
- alignmentUninitDecl.put(new Integer(i), new ArrayList<String>());\r
- }\r
- \r
- String initDeclStr = "typedef struct {" + newLine;\r
- String initInstStr = String.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase.toUpperCase(), phase.toUpperCase()) + newLine;\r
- String uninitDeclStr = "typedef struct {" + newLine;\r
-\r
- //\r
- // Sort all C declaration and instantiation base on Alignment Size \r
- //\r
- for (Object d : declaList) {\r
- CStructTypeDeclaration decl = (CStructTypeDeclaration) d;\r
- \r
- if (decl.initTable) {\r
- alignmentInitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
- alignmentInitInst.get(new Integer(decl.alignmentSize)).add(instTable.get(decl.key));\r
- } else {\r
- alignmentUninitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
- }\r
- }\r
-\r
- //\r
- // Generate code for every alignment size\r
- //\r
- boolean uinitDatabaseEmpty = true;\r
- for (int align = 8; align > 0; align >>= 1) {\r
- ArrayList<String> declaListBasedOnAlignment = alignmentInitDecl.get(new Integer(align));\r
- ArrayList<String> instListBasedOnAlignment = alignmentInitInst.get(new Integer(align));\r
- for (i = 0; i < declaListBasedOnAlignment.size(); i++) {\r
- initDeclStr += tab + declaListBasedOnAlignment.get(i);\r
- initInstStr += tab + instListBasedOnAlignment.get(i);\r
- \r
- //\r
- // We made a assumption that both PEI_PCD_DATABASE and DXE_PCD_DATABASE\r
- // has a least one data memember with alignment size of 1. So we can\r
- // remove the last "," in the C structure instantiation string. Luckily,\r
- // this is true as both data structure has SKUID_TABLE anyway.\r
- //\r
- if ((align == 1) && (i == declaListBasedOnAlignment.size() - 1)) {\r
- initInstStr += newLine;\r
- } else {\r
- initInstStr += commaNewLine;\r
- }\r
- }\r
- \r
- declaListBasedOnAlignment = alignmentUninitDecl.get(new Integer(align));\r
- \r
- if (declaListBasedOnAlignment.size() != 0) {\r
- uinitDatabaseEmpty = false;\r
- }\r
- \r
- for (Object d : declaListBasedOnAlignment) {\r
- String s = (String)d;\r
- uninitDeclStr += tab + s;\r
- }\r
- }\r
- \r
- if (uinitDatabaseEmpty) {\r
- uninitDeclStr += tab + String.format("%-20sdummy; /* PCD_DATABASE_UNINIT is emptry */\r\n", "UINT8");\r
- }\r
- \r
- initDeclStr += String.format("} %s_PCD_DATABASE_INIT;", phase) + newLine + newLine;\r
- initInstStr += "};" + newLine;\r
- uninitDeclStr += String.format("} %s_PCD_DATABASE_UNINIT;", phase) + newLine + newLine;\r
- \r
- result.put("initDeclStr", initDeclStr);\r
- result.put("initInstStr", initInstStr);\r
- result.put("uninitDeclStr", uninitDeclStr);\r
-\r
- return result;\r
- }\r
-\r
- public static String genInstantiationStr (ArrayList<String> alStr) {\r
- String str = "";\r
- for (int i = 0; i< alStr.size(); i++) {\r
- if (i != 0) {\r
- str += "\t";\r
- }\r
- str += alStr.get(i);\r
- if (i != alStr.size() - 1) {\r
- str += "\r\n";\r
- }\r
- }\r
-\r
- return str;\r
- }\r
-\r
- private String getSkuEnabledTypeDeclaration (Token token) {\r
- return String.format("%-20s%s;\r\n", "SKU_HEAD", token.getPrimaryKeyString());\r
- }\r
-\r
- private String getSkuEnabledTypeInstantiaion (Token token, int SkuTableIdx) {\r
-\r
- String offsetof = String.format(PcdDatabase.offsetOfSkuHeadStrTemplate, phase, token.hasDefaultValue()? "Init" : "Uninit", token.getPrimaryKeyString());\r
- return String.format("{ %s, %d } /* SKU_ENABLED: %s */", offsetof, SkuTableIdx, token.getPrimaryKeyString());\r
- }\r
-\r
- private String getDataTypeInstantiationForVariableDefault (Token token, String cName, int skuId) {\r
- return String.format("%s /* %s */", token.skuData.get(skuId).value.hiiDefaultValue, cName);\r
- }\r
-\r
- private String getCType (Token t) \r
- throws EntityException {\r
- \r
- if (t.isHiiEnable()) {\r
- return "VARIABLE_HEAD";\r
- }\r
- \r
- if (t.isVpdEnable()) {\r
- return "VPD_HEAD";\r
- }\r
- \r
- if (t.isUnicodeStringType()) {\r
- return "STRING_HEAD";\r
- }\r
- \r
- switch (t.datumType) {\r
- case UINT64:\r
- return "UINT64";\r
- case UINT32:\r
- return "UINT32";\r
- case UINT16:\r
- return "UINT16";\r
- case UINT8:\r
- return "UINT8";\r
- case BOOLEAN:\r
- return "BOOLEAN";\r
- case POINTER:\r
- return "UINT8";\r
- default:\r
- throw new EntityException("Unknown type in getDataTypeCDeclaration");\r
- }\r
- }\r
- \r
- //\r
- // privateGlobalName and privateGlobalCCode is used to pass output to caller of getCDeclarationString\r
- //\r
- private void getCDeclarationString(Token t) \r
- throws EntityException {\r
- \r
- if (t.isSkuEnable()) {\r
- privateGlobalName = String.format("%s_%s", t.getPrimaryKeyString(), skuDataTableTemplate);\r
- } else {\r
- privateGlobalName = t.getPrimaryKeyString();\r
- }\r
-\r
- String type = getCType(t);\r
- if ((t.datumType == Token.DATUM_TYPE.POINTER) && (!t.isHiiEnable()) && (!t.isUnicodeStringType())) {\r
- int bufferSize;\r
- if (t.isASCIIStringType()) {\r
- //\r
- // Build tool will add a NULL string at the end of the ASCII string\r
- //\r
- bufferSize = t.datumSize + 1;\r
- } else {\r
- bufferSize = t.datumSize;\r
- }\r
- privateGlobalCCode = String.format("%-20s%s[%d][%d];\r\n", type, privateGlobalName, t.getSkuIdCount(), bufferSize);\r
- } else {\r
- privateGlobalCCode = String.format("%-20s%s[%d];\r\n", type, privateGlobalName, t.getSkuIdCount());\r
- }\r
- }\r
- \r
- private String getDataTypeDeclarationForVariableDefault (Token token, String cName, int skuId) \r
- throws EntityException {\r
-\r
- String typeStr;\r
-\r
- if (token.datumType == Token.DATUM_TYPE.UINT8) {\r
- typeStr = "UINT8";\r
- } else if (token.datumType == Token.DATUM_TYPE.UINT16) {\r
- typeStr = "UINT16";\r
- } else if (token.datumType == Token.DATUM_TYPE.UINT32) {\r
- typeStr = "UINT32";\r
- } else if (token.datumType == Token.DATUM_TYPE.UINT64) {\r
- typeStr = "UINT64";\r
- } else if (token.datumType == Token.DATUM_TYPE.BOOLEAN) {\r
- typeStr = "BOOLEAN";\r
- } else if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
- int size;\r
- if (token.isHiiDefaultValueUnicodeStringType()) {\r
- typeStr = "UINT16";\r
- //\r
- // Include the NULL charactor\r
- //\r
- size = token.datumSize / 2 + 1;\r
- } else {\r
- typeStr = "UINT8";\r
- if (token.isHiiDefaultValueASCIIStringType()) {\r
- //\r
- // Include the NULL charactor\r
- //\r
- size = token.datumSize + 1;\r
- } else {\r
- size = token.datumSize;\r
- }\r
- }\r
- return String.format("%-20s%s[%d];\r\n", typeStr, cName, size);\r
- } else {\r
- throw new EntityException("Unknown DATUM_TYPE type in when generating code for VARIABLE_ENABLED PCD entry");\r
- }\r
-\r
- return String.format("%-20s%s;\r\n", typeStr, cName);\r
- }\r
- \r
- private String getTypeInstantiation (Token t, ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) throws EntityException {\r
- \r
- int i;\r
-\r
- String s;\r
- s = String.format("/* %s */", t.getPrimaryKeyString()) + newLine;\r
- s += tab + "{" + newLine;\r
-\r
- for (i = 0; i < t.skuData.size(); i++) {\r
- if (t.isUnicodeStringType()) {\r
- s += tab + tab + String.format("{ %d }", stringTable.add(t.skuData.get(i).value.value, t));\r
- } else if (t.isHiiEnable()) {\r
- /* VPD_HEAD definition\r
- typedef struct {\r
- UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.\r
- UINT16 StringIndex; // Offset in String Table in units of UINT16.\r
- UINT16 Offset; // Offset in Variable\r
- UINT16 DefaultValueOffset; // Offset of the Default Value\r
- } VARIABLE_HEAD ;\r
- */\r
- String variableDefaultName = String.format("%s_VariableDefault_%d", t.getPrimaryKeyString(), i); \r
- \r
- s += tab + tab + String.format("{ %d, %d, %s, %s }", guidTable.add(t.skuData.get(i).value.variableGuid, t.getPrimaryKeyString()),\r
- stringTable.add(t.skuData.get(i).value.getStringOfVariableName(), t),\r
- t.skuData.get(i).value.variableOffset,\r
- String.format("offsetof(%s_PCD_DATABASE, Init.%s)", phase, variableDefaultName)\r
- );\r
- //\r
- // We need to support the default value, so we add the declaration and\r
- // the instantiation for the default value.\r
- //\r
- CStructTypeDeclaration decl = new CStructTypeDeclaration (variableDefaultName,\r
- getHiiPtrTypeAlignmentSize(t),\r
- getDataTypeDeclarationForVariableDefault(t, variableDefaultName, i),\r
- true\r
- ); \r
- declaList.add(decl);\r
- instTable.put(variableDefaultName, getDataTypeInstantiationForVariableDefault (t, variableDefaultName, i));\r
- } else if (t.isVpdEnable()) {\r
- /* typedef struct {\r
- UINT32 Offset;\r
- } VPD_HEAD;\r
- */\r
- s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.vpdOffset);\r
- } else {\r
- if (t.isByteStreamType()) {\r
- //\r
- // Byte stream type input has their own "{" "}", so we won't help to insert.\r
- //\r
- s += tab + tab + String.format(" %s ", t.skuData.get(i).value.value);\r
- } else {\r
- s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.value);\r
- }\r
- }\r
- \r
- if (i != t.skuData.size() - 1) {\r
- s += commaNewLine;\r
- } else {\r
- s += newLine;\r
- }\r
-\r
- }\r
- \r
- s += tab + "}";\r
- \r
- return s;\r
- }\r
- \r
- public static String getPcdDatabaseCommonDefinitions () \r
- throws EntityException {\r
-\r
- String retStr = "";\r
- try {\r
- File file = new File(GlobalData.getWorkspacePath() + File.separator + \r
- "Tools" + File.separator + \r
- "Conf" + File.separator +\r
- "Pcd" + File.separator +\r
- "PcdDatabaseCommonDefinitions.sample");\r
- FileReader reader = new FileReader(file);\r
- BufferedReader in = new BufferedReader(reader);\r
- String str;\r
- while ((str = in.readLine()) != null) {\r
- retStr = retStr +"\r\n" + str;\r
- }\r
- } catch (Exception ex) {\r
- throw new EntityException("Fatal error when generating PcdDatabase Common Definitions");\r
- }\r
-\r
- return retStr;\r
- }\r
-\r
- public static String getPcdDxeDatabaseDefinitions () \r
- throws EntityException {\r
-\r
- String retStr = "";\r
- try {\r
- File file = new File(GlobalData.getWorkspacePath() + File.separator + \r
- "Tools" + File.separator + \r
- "Conf" + File.separator +\r
- "Pcd" + File.separator +\r
- "PcdDatabaseDxeDefinitions.sample");\r
- FileReader reader = new FileReader(file);\r
- BufferedReader in = new BufferedReader(reader);\r
- String str;\r
- while ((str = in.readLine()) != null) {\r
- retStr = retStr +"\r\n" + str;\r
- }\r
- } catch (Exception ex) {\r
- throw new EntityException("Fatal error when generating PcdDatabase Dxe Definitions");\r
- }\r
-\r
- return retStr;\r
- }\r
-\r
- public static String getPcdPeiDatabaseDefinitions () \r
- throws EntityException {\r
-\r
- String retStr = "";\r
- try {\r
- File file = new File(GlobalData.getWorkspacePath() + File.separator + \r
- "Tools" + File.separator + \r
- "Conf" + File.separator +\r
- "Pcd" + File.separator +\r
- "PcdDatabasePeiDefinitions.sample");\r
- FileReader reader = new FileReader(file);\r
- BufferedReader in = new BufferedReader(reader);\r
- String str;\r
- while ((str = in.readLine()) != null) {\r
- retStr = retStr +"\r\n" + str;\r
- }\r
- } catch (Exception ex) {\r
- throw new EntityException("Fatal error when generating PcdDatabase Pei Definitions");\r
- }\r
-\r
- return retStr;\r
- }\r
-\r
- /**\r
- Translate the schema string to UUID instance.\r
- \r
- In schema, the string of UUID is defined as following two types string:\r
- 1) GuidArrayType: pattern = 0x[a-fA-F0-9]{1,8},( )*0x[a-fA-F0-9]{1,4},(\r
- )*0x[a-fA-F0-9]{1,4}(,( )*\{)?(,?( )*0x[a-fA-F0-9]{1,2}){8}( )*(\})?\r
- \r
- 2) GuidNamingConvention: pattern =\r
- [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\r
- \r
- This function will convert string and create uuid instance.\r
- \r
- @param uuidString UUID string in XML file\r
- \r
- @return UUID UUID instance\r
- **/\r
- private UUID translateSchemaStringToUUID(String uuidString) \r
- throws EntityException {\r
- String temp;\r
- String[] splitStringArray;\r
- int index;\r
- int chIndex;\r
- int chLen;\r
-\r
- if (uuidString == null) {\r
- return null;\r
- }\r
-\r
- if (uuidString.length() == 0) {\r
- return null;\r
- }\r
-\r
- if (uuidString.equals("0") ||\r
- uuidString.equalsIgnoreCase("0x0")) {\r
- return new UUID(0, 0);\r
- }\r
-\r
- uuidString = uuidString.replaceAll("\\{", "");\r
- uuidString = uuidString.replaceAll("\\}", "");\r
-\r
- //\r
- // If the UUID schema string is GuidArrayType type then need translate \r
- // to GuidNamingConvention type at first.\r
- // \r
- if ((uuidString.charAt(0) == '0') && ((uuidString.charAt(1) == 'x') || (uuidString.charAt(1) == 'X'))) {\r
- splitStringArray = uuidString.split("," );\r
- if (splitStringArray.length != 11) {\r
- throw new EntityException ("[FPD file error] Wrong format for UUID string: " + uuidString);\r
- }\r
-\r
- //\r
- // Remove blank space from these string and remove header string "0x"\r
- // \r
- for (index = 0; index < 11; index ++) {\r
- splitStringArray[index] = splitStringArray[index].trim();\r
- splitStringArray[index] = splitStringArray[index].substring(2, splitStringArray[index].length());\r
- }\r
-\r
- //\r
- // Add heading '0' to normalize the string length\r
- // \r
- for (index = 3; index < 11; index ++) {\r
- chLen = splitStringArray[index].length();\r
- for (chIndex = 0; chIndex < 2 - chLen; chIndex ++) {\r
- splitStringArray[index] = "0" + splitStringArray[index];\r
- }\r
- }\r
-\r
- //\r
- // construct the final GuidNamingConvention string\r
- // \r
- temp = String.format("%s-%s-%s-%s%s-%s%s%s%s%s%s",\r
- splitStringArray[0],\r
- splitStringArray[1],\r
- splitStringArray[2],\r
- splitStringArray[3],\r
- splitStringArray[4],\r
- splitStringArray[5],\r
- splitStringArray[6],\r
- splitStringArray[7],\r
- splitStringArray[8],\r
- splitStringArray[9],\r
- splitStringArray[10]);\r
- uuidString = temp;\r
- }\r
-\r
- return UUID.fromString(uuidString);\r
- }\r
-}\r
-\r
/** Module Info class is the data structure to hold information got from GlobalData.\r
*/\r
class ModuleInfo {\r