+class StringTable {\r
+ private ArrayList<String> al; \r
+ private ArrayList<String> alComments;\r
+ private String phase;\r
+ int len; \r
+ int bodyStart;\r
+ int bodyLineNum;\r
+\r
+ public StringTable (String phase) {\r
+ this.phase = phase;\r
+ al = new ArrayList<String>();\r
+ alComments = new ArrayList<String>();\r
+ len = 0;\r
+ bodyStart = 0;\r
+ bodyLineNum = 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 int getTableLen () {\r
+ return al.size() == 0 ? 1 : al.size();\r
+ }\r
+\r
+ public String getExistanceMacro () {\r
+ return String.format(PcdDatabase.StringTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
+ }\r
+\r
+ public String getTypeDeclaration () {\r
+\r
+ String output;\r
+\r
+ final String stringTable = "StringTable";\r
+ final String tab = "\t";\r
+ final String newLine = ";\r\n";\r
+\r
+ output = "/* StringTable */\r\n";\r
+\r
+ if (al.size() == 0) {\r
+ output += tab + String.format("UINT16 %s[1] /* StringTable is Empty */", stringTable) + newLine;\r
+ }\r
+\r
+ for (int i = 0; i < al.size(); i++) {\r
+ String str = al.get(i);\r
+\r
+ if (i == 0) {\r
+ //\r
+ // StringTable is a well-known name in the PCD DXE driver\r
+ //\r
+ output += tab + String.format("UINT16 %s[%d] /* %s */", stringTable, str.length() + 1, alComments.get(i)) + newLine;\r
+ } else {\r
+ output += tab + String.format("UINT16 %s_%d[%d] /* %s */", stringTable, i, str.length() + 1, alComments.get(i)) + newLine;\r
+ }\r
+ }\r
+\r
+ return output;\r
+\r
+ }\r
+\r
+ public ArrayList<String> getInstantiation () {\r
+ ArrayList<String> output = new ArrayList<String>();\r
+\r
+ output.add("/* StringTable */"); \r
+\r
+ if (al.size() == 0) {\r
+ output.add("{ 0 }");\r
+ } else {\r
+ String str;\r
+\r
+ for (int i = 0; i < al.size(); i++) {\r
+ str = String.format("L\"%s\" /* %s */", al.get(i), alComments.get(i));\r
+ if (i != al.size() - 1) {\r
+ str += ",";\r
+ }\r
+ output.add(str);\r
+ }\r
+ }\r
+\r
+ return output;\r
+ }\r
+\r
+ public int add (String str, Token token) {\r
+ int i;\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
+class SizeTable {\r
+ private ArrayList<Integer> al;\r
+ private ArrayList<String> alComments;\r
+ private String phase;\r
+ private int len;\r
+ private int bodyStart;\r
+ private int bodyLineNum;\r
+\r
+ public SizeTable (String phase) {\r
+ this.phase = phase;\r
+ al = new ArrayList<Integer>();\r
+ alComments = new ArrayList<String>();\r
+ len = 0;\r
+ bodyStart = 0;\r
+ bodyLineNum = 0;\r
+ }\r
+\r
+ public String getTypeDeclaration () {\r
+ return String.format(PcdDatabase.SizeTableDeclaration, phase);\r
+ }\r
+\r
+ public ArrayList<String> getInstantiation () {\r
+ ArrayList<String> Output = new ArrayList<String>();\r
+\r
+ Output.add("/* SizeTable */");\r
+ Output.add("{");\r
+ bodyStart = 2;\r
+\r
+ if (al.size() == 0) {\r
+ Output.add("0");\r
+ } else {\r
+ for (int index = 0; index < al.size(); index++) {\r
+ Integer n = al.get(index);\r
+ String str = n.toString();\r
+\r
+ if (index != (al.size() - 1)) {\r
+ str += ",";\r
+ }\r
+\r
+ str += " /* " + alComments.get(index) + " */"; \r
+ Output.add(str);\r
+ bodyLineNum++;\r
+ \r
+ }\r
+ }\r
+ Output.add("}");\r
+\r
+ return Output;\r
+ }\r
+\r
+ public int getBodyStart() {\r
+ return bodyStart;\r
+ }\r
+\r
+ public int getBodyLineNum () {\r
+ return bodyLineNum;\r
+ }\r
+\r
+ public int add (Token token) {\r
+ int index = len;\r
+\r
+ len++; \r
+ al.add(token.datumSize);\r
+ alComments.add(token.getPrimaryKeyString());\r
+\r
+ return index;\r
+ }\r
+\r
+ private int getDatumSize(Token token) {\r
+ /*\r
+ switch (token.datumType) {\r
+ case Token.DATUM_TYPE.UINT8:\r
+ return 1;\r
+ default:\r
+ return 0;\r
+ }\r
+ */\r
+ return 0;\r
+ }\r
+\r
+ public int getTableLen () {\r
+ return al.size() == 0 ? 1 : al.size();\r
+ }\r
+\r
+}\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 bodyStart;\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
+ bodyStart = 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 String getTypeDeclaration () {\r
+ return String.format(PcdDatabase.GuidTableDeclaration, phase);\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
+ public ArrayList<String> getInstantiation () {\r
+ ArrayList<String> Output = new ArrayList<String>();\r
+\r
+ Output.add("/* GuidTable */");\r
+ Output.add("{");\r
+ bodyStart = 2;\r
+\r
+ if (al.size() == 0) {\r
+ Output.add(getUuidCString(new UUID(0, 0)));\r
+ }\r
+ \r
+ for (Object u : al) {\r
+ UUID uuid = (UUID)u;\r
+ String str = getUuidCString(uuid);\r
+\r
+ if (al.indexOf(u) != (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 getBodyStart() {\r
+ return bodyStart;\r
+ }\r
+\r
+ public int getBodyLineNum () {\r
+ return bodyLineNum;\r
+ }\r
+\r
+ public int add (UUID uuid, String name) {\r
+ int index = len;\r
+ //\r
+ // Include the NULL character at the end of String\r
+ //\r
+ len++; \r
+ al.add(uuid);\r
+\r
+ return index;\r
+ }\r
+\r
+ public int getTableLen () {\r
+ return al.size() == 0 ? 0 : al.size();\r
+ }\r
+\r
+}\r
+\r
+class SkuIdTable {\r
+ private ArrayList<Integer[]> al;\r
+ private ArrayList<String> alComment;\r
+ private String phase;\r
+ private int len;\r
+ private int bodyStart;\r
+ private int bodyLineNum;\r
+\r
+ public SkuIdTable (String phase) {\r
+ this.phase = phase;\r
+ al = new ArrayList<Integer[]>();\r
+ alComment = new ArrayList<String>();\r
+ bodyStart = 0;\r
+ bodyLineNum = 0;\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 (al.size() == 0)? 1 : al.size();\r
+ }\r
+\r
+ public String getExistanceMacro () {\r
+ return String.format(PcdDatabase.SkuTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
+ }\r
+\r
+ public String getTypeDeclaration () {\r
+ return String.format(PcdDatabase.SkuIdTableDeclaration, phase);\r
+ }\r
+\r
+ public ArrayList<String> getInstantiation () {\r
+ ArrayList<String> Output = new ArrayList<String> ();\r
+\r
+ Output.add("/* SkuIdTable */");\r
+ Output.add("{");\r
+ bodyStart = 2;\r
+\r
+ if (al.size() == 0) {\r
+ Output.add("0");\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 += ia[0].toString() + ", ";\r
+ for (int index2 = 1; index2 < ia.length; index2++) {\r
+ str += ia[index2].toString();\r
+ if (index != al.size() - 1) {\r
+ str += ", ";\r
+ }\r
+ }\r
+\r
+ Output.add(str);\r
+ bodyLineNum++;\r
+\r
+ }\r
+\r
+ Output.add("}");\r
+\r
+ return Output;\r
+ }\r
+\r
+ public int add (Token token) {\r
+\r
+ int index;\r
+\r
+ Integer [] skuIds = new Integer[token.maxSkuCount + 1];\r
+ skuIds[0] = new Integer(token.maxSkuCount);\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
+ public int getTableLen () {\r
+ return al.size() == 0 ? 1 : al.size();\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
+ private int bodyStart;\r
+ private int bodyLineNum;\r
+\r
+ public LocalTokenNumberTable (String phase) {\r
+ this.phase = phase;\r
+ al = new ArrayList<String>();\r
+ alComment = new ArrayList<String>();\r
+ bodyStart = 0;\r
+ bodyLineNum = 0;\r
+\r
+ len = 0;\r
+ }\r
+\r
+ public String getSizeMacro () {\r
+ return String.format(PcdDatabase.LocalTokenNumberTableSizeMacro, phase, getSize());\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 String getTypeDeclaration () {\r
+ return String.format(PcdDatabase.LocalTokenNumberTableDeclaration, phase);\r
+ }\r
+\r
+ public ArrayList<String> getInstantiation () {\r
+ ArrayList<String> output = new ArrayList<String>();\r
+\r
+ output.add("/* LocalTokenNumberTable */");\r
+ output.add("{");\r
+ bodyStart = 2;\r
+\r
+ if (al.size() == 0) {\r
+ output.add("0");\r
+ }\r
+ \r
+ for (int index = 0; index < al.size(); index++) {\r
+ String str;\r
+\r
+ str = (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
+ bodyLineNum = al.size();\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.isStringType()) {\r
+ str += " | PCD_TYPE_STRING";\r
+ }\r
+\r
+ if (token.skuEnabled) {\r
+ str += " | PCD_TYPE_SKU_ENABLED";\r
+ }\r
+\r
+ if (token.hiiEnabled) {\r
+ str += " | PCD_TYPE_HII";\r
+ }\r
+\r
+ if (token.vpdEnabled) {\r
+ str += " | PCD_TYPE_VPD";\r
+ }\r
+ \r
+ al.add(str);\r
+ alComment.add(token.getPrimaryKeyString());\r
+\r
+ return index;\r
+ }\r
+}\r
+\r
+class ExMapTable {\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 ArrayList<String> alComment;\r
+ private String phase;\r
+ private int len;\r
+ private int bodyStart;\r
+ private int bodyLineNum;\r
+ private int base;\r
+\r
+ public ExMapTable (String phase) {\r
+ this.phase = phase;\r
+ al = new ArrayList<ExTriplet>();\r
+ alComment = new ArrayList<String>();\r
+ bodyStart = 0;\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
+ private int getSize () {\r
+ return (al.size() == 0)? 1 : al.size();\r
+ }\r
+\r
+ public String getExistanceMacro () {\r
+ return String.format(PcdDatabase.ExMapTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
+ }\r
+\r
+ public String getTypeDeclaration () {\r
+ return String.format(PcdDatabase.ExMapTableDeclaration, phase);\r
+ }\r
+\r
+ public ArrayList<String> getInstantiation () {\r
+ ArrayList<String> Output = new ArrayList<String>();\r
+\r
+ Output.add("/* ExMapTable */");\r
+ Output.add("{");\r
+ bodyStart = 2;\r
+\r
+ if (al.size() == 0) {\r
+ Output.add("{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 = "{ " + e.exTokenNumber.toString() + ", ";\r
+ str += e.localTokenIdx.toString() + ", ";\r
+ str += e.guidTableIdx.toString();\r
+\r
+ str += " /* " + alComment.get(index) + " */";\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
+ al.add(new ExTriplet(guidTableIdx, exTokenNum, localTokenIdx));\r
+ alComment.add(name);\r
+\r
+ return index;\r
+ }\r
+\r
+ public int getTableLen () {\r
+ return al.size() == 0 ? 1 : al.size();\r
+ }\r
+\r
+}\r
+\r
+class PcdDatabase {\r
+\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];\r\n";\r
+ public final static String StringTableDeclaration = "UINT16 StringTable[%s_STRING_TABLE_SIZE];\r\n";\r
+ public final static String SizeTableDeclaration = "UINT16 SizeTable[%s_LOCAL_TOKEN_NUMBER];\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 %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 offsetOfStrTemplate = "offsetof(%s_PCD_DATABASE, %s.%s)";\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
+ private String hString;\r
+ private String cString;\r
+\r
+\r
+ class AlignmentSizeComp implements Comparator<Token> {\r
+ public int compare (Token a, Token b) {\r
+ return getAlignmentSize(b) \r
+ - getAlignmentSize(a);\r
+ }\r
+ }\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
+ assignedTokenNumber = startLen;\r
+ this.alTokens = alTokens;\r
+ }\r
+\r
+ private void getTwoGroupsOfTokens (ArrayList<Token> alTokens, List<Token> initTokens, List<Token> uninitTokens) {\r
+ for (int i = 0; i < alTokens.size(); i++) {\r
+ Token t = (Token)alTokens.get(i);\r
+ if (t.hasDefaultValue()) {\r
+ initTokens.add(t);\r
+ } else {\r
+ uninitTokens.add(t);\r
+ }\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ private int getAlignmentSize (Token token) {\r
+ if (token.hiiEnabled) {\r
+ return 2;\r
+ }\r
+\r
+ if (token.vpdEnabled) {\r
+ return 4;\r
+ }\r
+\r
+ if (token.isStringType()) {\r
+ return 2;\r
+ }\r
+\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
+ }\r
+ return 1;\r
+ }\r
+\r
+ public String getCString () {\r
+ return cString;\r
+ }\r
+\r
+ public String getHString () {\r
+ return hString;\r
+ }\r
+\r
+ public void genCode () {\r
+\r
+ final String newLine = "\r\n";\r
+ final String instNewLine = "\\\r\n";\r
+ final String declNewLine = ";\r\n";\r
+ final String tab = "\t";\r
+ final String commaInstNewLine = "\t,\\\r\n";\r
+ final String commaNewLine = ", \r\n";\r
+\r
+ int i;\r
+ ArrayList<String> decla;\r
+ ArrayList<String> inst;\r
+\r
+ String macroStr = "";\r
+ String initDeclStr = "";\r
+ String initInstStr = "";\r
+ String uninitDeclStr = "";\r
+\r
+ List<Token> initTokens = new ArrayList<Token> ();\r
+ List<Token> uninitTokens = new ArrayList<Token> ();\r
+ \r
+ HashMap <String, ArrayList<String>> initCode = new HashMap<String, ArrayList<String>> ();\r
+ HashMap <String, ArrayList<String>> uninitCode = new HashMap<String, ArrayList<String>> ();\r
+\r
+ getTwoGroupsOfTokens (alTokens, initTokens, uninitTokens);\r
+\r
+ //\r
+ // Generate Structure Declaration for PcdTokens without Default Value\r
+ // PEI_PCD_DATABASE_INIT\r
+ //\r
+ java.util.Comparator comparator = new AlignmentSizeComp();\r
+ List<Token> list = initTokens;\r
+ java.util.Collections.sort(list, comparator);\r
+ initCode = processTokens(initTokens);\r
+\r
+ //\r
+ // Generate Structure Declaration for PcdTokens without Default Value\r
+ // PEI_PCD_DATABASE_UNINIT\r
+ //\r
+ java.util.Collections.sort(uninitTokens, comparator);\r
+ uninitCode = processTokens(uninitTokens);\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
+\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
+ //\r
+ // Generate Structure Declaration for PcdTokens with Default Value\r
+ // for example PEI_PCD_DATABASE_INIT\r
+ //\r
+ initDeclStr += "typedef struct {" + newLine;\r
+ {\r
+ initDeclStr += tab + exMapTable.getTypeDeclaration();\r
+ initDeclStr += tab + guidTable.getTypeDeclaration();\r
+ initDeclStr += tab + localTokenNumberTable.getTypeDeclaration();\r
+ initDeclStr += tab + stringTable.getTypeDeclaration();\r
+ initDeclStr += tab + sizeTable.getTypeDeclaration();\r
+ initDeclStr += tab + skuIdTable.getTypeDeclaration();\r
+ if (phase.equalsIgnoreCase("PEI")) {\r
+ initDeclStr += tab + "SKU_ID SystemSkuId;" + newLine;\r
+ }\r
+\r
+ decla = initCode.get(new String("Declaration"));\r
+ for (i = 0; i < decla.size(); i++) {\r
+ initDeclStr += tab + decla.get(i) + declNewLine;\r
+ }\r
+\r
+ //\r
+ // Generate Structure Declaration for PcdToken with SkuEnabled\r
+ //\r
+ decla = initCode.get("DeclarationForSku");\r
+\r
+ for (i = 0; i < decla.size(); i++) {\r
+ initDeclStr += tab + decla.get(i) + declNewLine;\r
+ }\r
+ }\r
+ initDeclStr += String.format("} %s_PCD_DATABASE_INIT;\r\n\r\n", phase);\r
+\r
+ //\r
+ // Generate MACRO for structure intialization of PCDTokens with Default Value\r
+ // The sequence must match the sequence of declaration of the memembers in the structure\r
+ String tmp = String.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase.toUpperCase(), phase.toUpperCase());\r
+ initInstStr += tmp + newLine;\r
+ initInstStr += tab + genInstantiationStr(exMapTable.getInstantiation()) + commaNewLine;\r
+ initInstStr += tab + genInstantiationStr(guidTable.getInstantiation()) + commaNewLine;\r
+ initInstStr += tab + genInstantiationStr(localTokenNumberTable.getInstantiation()) + commaNewLine; \r
+ /*\r
+ inst = stringTable.getInstantiation();\r
+ for (i = 0; i < inst.size(); i++ ) {\r
+ initInstStr += tab + inst.get(i) + commaNewLine; \r
+ }\r
+ */\r
+ initInstStr += tab + genInstantiationStr(stringTable.getInstantiation()) + commaNewLine;\r
+ initInstStr += tab + genInstantiationStr(sizeTable.getInstantiation()) + commaNewLine;\r
+ initInstStr += tab + genInstantiationStr(skuIdTable.getInstantiation()) + commaNewLine;\r
+ //\r
+ // For SystemSkuId\r
+ //\r
+ if (phase.equalsIgnoreCase("PEI")) {\r
+ initInstStr += tab + "0" + tab + "/* SystemSkuId */" + commaNewLine;\r
+ }\r
+\r
+ inst = initCode.get("Instantiation");\r
+ for (i = 0; i < inst.size(); i++) {\r
+ initInstStr += tab + inst.get(i) + commaNewLine;\r
+ }\r
+\r
+ inst = initCode.get("InstantiationForSku");\r
+ for (i = 0; i < inst.size(); i++) {\r
+ initInstStr += tab + inst.get(i);\r
+ if (i != inst.size() - 1) {\r
+ initInstStr += commaNewLine;\r
+ }\r
+ }\r
+\r
+ initInstStr += "};";\r
+\r
+ uninitDeclStr += "typedef struct {" + newLine;\r
+ {\r
+ decla = uninitCode.get("Declaration");\r
+ if (decla.size() == 0) {\r
+ uninitDeclStr += "UINT8 dummy /* The UINT struct is empty */" + declNewLine;\r
+ } else {\r
+ \r
+ for (i = 0; i < decla.size(); i++) {\r
+ uninitDeclStr += tab + decla.get(i) + declNewLine;\r
+ }\r
+ \r
+ decla = uninitCode.get("DeclarationForSku");\r
+ \r
+ for (i = 0; i < decla.size(); i++) {\r
+ uninitDeclStr += tab + decla.get(i) + declNewLine;\r
+ }\r
+ }\r
+ }\r
+ uninitDeclStr += String.format("} %s_PCD_DATABASE_UNINIT;\r\n\r\n", phase);\r
+\r
+ cString = initInstStr + newLine;\r
+ hString = macroStr + newLine \r
+ + initDeclStr + newLine\r
+ + uninitDeclStr + newLine\r
+ + newLine;\r
+\r
+ }\r
+\r
+ private String genInstantiationStr (ArrayList<String> alStr) {\r
+ String str = "";\r
+ for (int i = 0; i< alStr.size(); i++) {\r
+ str += "\t" + alStr.get(i);\r
+ if (i != alStr.size() - 1) {\r
+ str += "\r\n";\r
+ }\r
+ }\r
+\r
+ return str;\r
+ }\r
+\r
+ private HashMap<String, ArrayList<String>> processTokens (List<Token> alToken) {\r
+\r
+ ArrayList[] output = new ArrayList[4];\r
+ HashMap <String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();\r
+\r
+ ArrayList<String> decl = new ArrayList<String>();\r
+ ArrayList<String> declForSkuEnableType = new ArrayList<String>();\r
+ ArrayList<String> inst = new ArrayList<String>();\r
+ ArrayList<String> instForSkuEnableType = new ArrayList<String>();\r
+\r
+ for (int index = 0; index < alToken.size(); index++) {\r
+ Token token = alToken.get(index);\r
+\r
+ if (token.skuEnabled) {\r
+ //\r
+ // BugBug: Schema only support Data type now\r
+ //\r
+ int tableIdx;\r
+\r
+ tableIdx = skuIdTable.add(token);\r
+\r
+ decl.add(getSkuEnabledTypeDeclaration(token));\r
+ if (token.hasDefaultValue()) {\r
+ inst.add(getSkuEnabledTypeInstantiaion(token, tableIdx)); \r
+ }\r
+\r
+ declForSkuEnableType.add(getDataTypeDeclarationForSkuEnabled(token));\r
+ if (token.hasDefaultValue()) {\r
+ instForSkuEnableType.add(getDataTypeInstantiationForSkuEnabled(token));\r
+ }\r
+\r
+ } else {\r
+ if (token.hiiEnabled) {\r
+ decl.add(getVariableEnableTypeDeclaration(token));\r
+ inst.add(getVariableEnableInstantiation(token));\r
+ } else if (token.vpdEnabled) {\r
+ decl.add(getVpdEnableTypeDeclaration(token));\r
+ inst.add(getVpdEnableTypeInstantiation(token));\r
+ } else if (token.isStringType()) {\r
+ decl.add(getStringTypeDeclaration(token));\r
+ inst.add(getStringTypeInstantiation(stringTable.add(token.getStringTypeString(), token), token));\r
+ }\r
+ else {\r
+ decl.add(getDataTypeDeclaration(token));\r
+ if (token.hasDefaultValue()) {\r
+ inst.add(getDataTypeInstantiation(token));\r
+ }\r
+ }\r
+ }\r
+\r
+ sizeTable.add(token);\r
+ localTokenNumberTable.add(token);\r
+ token.assignedtokenNumber = assignedTokenNumber++;\r
+\r
+ }\r
+\r
+ map.put("Declaration", decl);\r
+ map.put("DeclarationForSku", declForSkuEnableType);\r
+ map.put("Instantiation", inst);\r
+ map.put("InstantiationForSku", instForSkuEnableType);\r
+\r
+ return map;\r
+ }\r
+\r
+ private String getSkuEnabledTypeDeclaration (Token token) {\r
+ return String.format("SKU_HEAD %s;\r\n", 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 }", offsetof, SkuTableIdx);\r
+ }\r
+\r
+ private String getDataTypeDeclarationForSkuEnabled (Token token) {\r
+ String typeStr = "";\r
+\r
+ if (token.datumType == Token.DATUM_TYPE.UINT8) {\r
+ typeStr = "UINT8 %s_%s[%d];\r\n";\r
+ } else if (token.datumType == Token.DATUM_TYPE.UINT16) {\r
+ typeStr = "UINT16 %s_%s[%d];\r\n";\r
+ } else if (token.datumType == Token.DATUM_TYPE.UINT32) {\r
+ typeStr = "UINT32 %s_%s[%d];\r\n";\r
+ } else if (token.datumType == Token.DATUM_TYPE.UINT64) {\r
+ typeStr = "UINT64 %s_%s[%d];\r\n";\r
+ } else if (token.datumType == Token.DATUM_TYPE.BOOLEAN) {\r
+ typeStr = "BOOLEAN %s_%s[%d];\r\n";\r
+ } else if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
+ return String.format("UINT8 %s_s[%d];\r\n", token.getPrimaryKeyString(), "SkuDataTable", token.datumSize * token.maxSkuCount);\r
+ } \r
+\r
+ return String.format(typeStr, token.getPrimaryKeyString(), "SkuDataTable", token.maxSkuCount);\r
+\r
+ }\r
+\r
+ private String getDataTypeInstantiationForSkuEnabled (Token token) {\r
+ String str = "";\r
+\r
+ if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
+ return String.format("UINT8 %s_s[%d]", token.getPrimaryKeyString(), "SkuDataTable", token.datumSize * token.maxSkuCount);\r
+ } else {\r
+ str = "{ ";\r
+ for (int idx = 0; idx < token.maxSkuCount; idx++) {\r
+ str += token.skuData.get(idx).toString();\r
+ if (idx != token.maxSkuCount - 1) {\r
+ str += ", ";\r
+ }\r
+ }\r
+ str += "}";\r
+\r
+ return str;\r
+ }\r
+\r
+ }\r
+\r
+ private String getDataTypeInstantiation (Token token) {\r
+\r
+ String typeStr = "";\r
+\r
+ if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
+ return String.format("%s /* %s */", token.datum.toString(), token.getPrimaryKeyString());\r
+ } else {\r
+ return String.format("%s /* %s */", token.datum.toString(), token.getPrimaryKeyString());\r
+ }\r
+ }\r
+\r
+\r
+ private String getDataTypeDeclaration (Token token) {\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
+ return String.format("UINT8 %s[%d]", token.getPrimaryKeyString(), token.datumSize);\r
+ } else {\r
+ }\r
+\r
+ return String.format("%s %s", typeStr, token.getPrimaryKeyString());\r
+ }\r
+\r
+ private String getVpdEnableTypeDeclaration (Token token) {\r
+ return String.format("VPD_HEAD %s", token.getPrimaryKeyString());\r
+ }\r
+\r
+ private String getVpdEnableTypeInstantiation (Token token) {\r
+ return String.format("{ %d } /* %s */", token.vpdOffset,\r
+ token.getPrimaryKeyString());\r
+ }\r
+\r
+ private String getStringTypeDeclaration (Token token) {\r
+ return String.format("UINT16 %s", token.getPrimaryKeyString());\r
+ }\r
+\r
+ private String getStringTypeInstantiation (int StringTableIdx, Token token) {\r
+ return String.format ("%d /* %s */", StringTableIdx,\r
+ token.getPrimaryKeyString()); \r
+ }\r
+\r
+\r
+ private String getVariableEnableTypeDeclaration (Token token) {\r
+ return String.format("VARIABLE_HEAD %s", token.getPrimaryKeyString());\r
+ }\r
+\r
+ private String getVariableEnableInstantiation (Token token) {\r
+ return String.format("{ %d, %d, %d } /* %s */", guidTable.add(token.variableGuid, token.getPrimaryKeyString()),\r
+ stringTable.add(token.variableName, token),\r
+ token.variableOffset, \r
+ token.getPrimaryKeyString());\r
+ }\r
+\r
+ public int getTotalTokenNumber () {\r
+ return sizeTable.getTableLen();\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
+ System.out.println(GlobalData.getWorkspacePath());\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
+\r