+\r
+ private static String workspacePath;\r
+ private static HashMap<String, String> hashDbGuids = new HashMap<String, String>();\r
+ private static HashMap<String, String> hashDbPpis = new HashMap<String, String>();\r
+ private static HashMap<String, String> hashDbProtocols = new HashMap<String, String>();\r
+ private static HashMap<String, String> hashDbLibSymbols = new HashMap<String, String>();\r
+ private static HashMap<String, String> hashDbLibFunctions = new HashMap<String, String>();\r
+ private static HashMap<String, String> hashDbLibExterns = new HashMap<String, String>();\r
+\r
+ private static final String regLibClassName = ".*\\W(\\w[\\w\\d]*)\\.h";\r
+ private static final Pattern ptnLibClassName = Pattern.compile(regLibClassName);\r
+\r
+ private static final String regLibSymbol = "#define\\s+(\\w[\\w\\d]*)";\r
+ private static final Pattern ptnLibSymbol = Pattern.compile(regLibSymbol);\r
+\r
+ private static final String regLibDataType = "[A-Z][A-Z0-9_]*\\s*\\**";\r
+ private static final String regLibFunction = regLibDataType + "\\s*(?:EFIAPI)?\\s+" + \r
+ "(\\w[\\w\\d]*)\\s*\\([^)]*\\)\\s*;";\r
+ private static final Pattern ptnLibFunction = Pattern.compile(regLibFunction);\r
+\r
+ private static final String regLibExtern = "extern\\s+" + regLibDataType + "\\s*(\\w[\\w\\d]*)";\r
+ private static final Pattern ptnLibExtern = Pattern.compile(regLibExtern);\r
+\r
+ private static final String convertToOsFilePath(String filePath) {\r
+ return filePath.replace("/", File.separator).replace("\\", File.separator);\r
+ }\r
+ private static final void collectLibHeaderFileInfo(String libHeaderFile, String pkgGuid) throws Exception {\r
+ String fileContents;\r
+ String libClassName;\r
+ String libContainer;\r
+ Matcher mtrLibClass;\r
+ Matcher mtrLibSymbol;\r
+ Matcher mtrLibFunction;\r
+ Matcher mtrLibExtern;\r
+\r
+ System.out.println ("Parsing: " + libHeaderFile);\r
+ mtrLibClass = ptnLibClassName.matcher(libHeaderFile);\r
+ if (!mtrLibClass.matches()) {\r
+ throw new Exception("Illegal libary header file");\r
+ }\r
+ libClassName = mtrLibClass.group(1);\r
+ libContainer = libClassName + "@" + pkgGuid;\r
+\r
+ fileContents = Common.file2string(libHeaderFile);\r
+ mtrLibSymbol = ptnLibSymbol.matcher(fileContents);\r
+ while (mtrLibSymbol.find()) {\r
+ String libSymbol;\r
+ String oldLibContainer;\r
+\r
+ libSymbol = mtrLibSymbol.group(1);\r
+ oldLibContainer = hashDbLibSymbols.put(libSymbol, libContainer);\r
+ if (oldLibContainer != null) {\r
+ String warnMessage;\r
+\r
+ warnMessage = "Duplicated Lib Symbol:" + libSymbol + " Found. " +\r
+ "Later package will overide the previous one"; \r
+ System.out.println(warnMessage);\r
+ }\r
+ }\r
+\r
+ mtrLibFunction = ptnLibFunction.matcher(fileContents);\r
+ while (mtrLibFunction.find()) {\r
+ String libFunction;\r
+ String oldLibContainer;\r
+\r
+ libFunction = mtrLibFunction.group(1);\r
+ oldLibContainer = hashDbLibFunctions.put(libFunction, libContainer);\r
+ if (oldLibContainer != null) {\r
+ String warnMessage;\r
+\r
+ warnMessage = "Duplicated Lib Function:" + libFunction + " Found. " +\r
+ "Later package will overide the previous one"; \r
+ System.out.println(warnMessage);\r
+ }\r
+ }\r
+\r
+ mtrLibExtern = ptnLibExtern.matcher(fileContents);\r
+ while (mtrLibExtern.find()) {\r
+ String libExtern;\r
+ String oldLibContainer;\r
+\r
+ libExtern = mtrLibExtern.group(1);\r
+ oldLibContainer = hashDbLibExterns.put(libExtern, libContainer);\r
+ if (oldLibContainer != null) {\r
+ String warnMessage;\r
+\r
+ warnMessage = "Duplicated Lib Extern:" + libExtern + " Found. " +\r
+ "Later package will overide the previous one"; \r
+ System.out.println(warnMessage);\r
+ }\r
+ }\r
+ }\r
+ private static final void collectLibDataBase(PackageSurfaceArea spdDatabase, String pkgDirectory) throws Exception {\r
+ String pkgGuid;\r
+ LibraryClassDeclarations libClassDeclarations;\r
+\r
+ pkgGuid = spdDatabase.getSpdHeader().getGuidValue();\r
+ libClassDeclarations = spdDatabase.getLibraryClassDeclarations();\r
+ if (libClassDeclarations != null) {\r
+ Iterator<LibraryClass> itLibClass;\r
+\r
+ itLibClass = libClassDeclarations.getLibraryClassList().iterator();\r
+ while (itLibClass.hasNext()) {\r
+ String libHeaderFile;\r
+\r
+ libHeaderFile = pkgDirectory + File.separator +\r
+ itLibClass.next().getIncludeHeader(); \r
+ libHeaderFile = convertToOsFilePath (libHeaderFile);\r
+ try {\r
+ collectLibHeaderFileInfo(libHeaderFile, pkgGuid);\r
+ } catch (Exception e) {\r
+ String errorMessage;\r
+\r
+ errorMessage = "Error (" + e.getMessage() + ")occurs when parsing " +\r
+ libHeaderFile;\r
+ System.out.println(errorMessage);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ private static final void collectGuidDatabase(PackageSurfaceArea spdDatabase) throws Exception {\r