From 0dc8c5893276cf6638727060d31bca322eba2805 Mon Sep 17 00:00:00 2001 From: alfred Date: Thu, 10 Aug 2006 09:27:16 +0000 Subject: [PATCH] Add MigrationTools git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1232 6f19259b-4bc3-4df7-8a09-765794883524 --- Tools/Source/MigrationTools/MANIFEST.MF | 2 + .../Source/MigrationTools/MigrationTools.msa | 45 +++ Tools/Source/MigrationTools/build.xml | 52 +++ .../org/tianocore/migration/Database.java | 135 +++++++ .../org/tianocore/migration/FirstPanel.java | 139 +++++++ .../org/tianocore/migration/Func.java | 51 +++ .../org/tianocore/migration/Guid.java | 49 +++ .../org/tianocore/migration/Macro.java | 34 ++ .../org/tianocore/migration/ModuleInfo.java | 280 +++++++++++++++ .../org/tianocore/migration/ModuleReader.java | 83 +++++ .../org/tianocore/migration/MsaWriter.java | 145 ++++++++ .../migration/SourceFileReplacer.java | 338 ++++++++++++++++++ .../org/tianocore/migration/UI.java | 14 + 13 files changed, 1367 insertions(+) create mode 100644 Tools/Source/MigrationTools/MANIFEST.MF create mode 100644 Tools/Source/MigrationTools/MigrationTools.msa create mode 100644 Tools/Source/MigrationTools/build.xml create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/Database.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/FirstPanel.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/Func.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/Guid.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/Macro.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/ModuleInfo.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/ModuleReader.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/MsaWriter.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/SourceFileReplacer.java create mode 100644 Tools/Source/MigrationTools/org/tianocore/migration/UI.java diff --git a/Tools/Source/MigrationTools/MANIFEST.MF b/Tools/Source/MigrationTools/MANIFEST.MF new file mode 100644 index 0000000000..2786db510b --- /dev/null +++ b/Tools/Source/MigrationTools/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Main-Class: org.tianocore.migration.ModuleInfo diff --git a/Tools/Source/MigrationTools/MigrationTools.msa b/Tools/Source/MigrationTools/MigrationTools.msa new file mode 100644 index 0000000000..0a4ed2e366 --- /dev/null +++ b/Tools/Source/MigrationTools/MigrationTools.msa @@ -0,0 +1,45 @@ + + + + MigrationTools + TOOL + 09C77FAE-6374-408e-AB88-32822B92096E + 1.0 + This is the EFI/Tiano Migration Tool Resources Module + + This Module provdes the entity, action and exception package for Migration + tools, This package will be shared for building tools or wizard tools. + + Copyright 2005-2006, Intel Corporation + +All rights reserved. +This program and the accompanying materials +are licensed and made available under the terms and conditions of the +BSD License which accompanies this distribution. The full text of the +license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052 + + + IA32 X64 IPF EBC + false + NULL + + + build.xml + org/tianocore/migration/Database.java + org/tianocore/migration/FirstPanel.java + org/tianocore/migration/Func.java + org/tianocore/migration/Guid.java + org/tianocore/migration/Macro.java + org/tianocore/migration/ModuleInfo.java + org/tianocore/migration/ModuleReader.java + org/tianocore/migration/MsaWriter.java + org/tianocore/migration/SourceFileReplacer.java + org/tianocore/migration/UI.java + + \ No newline at end of file diff --git a/Tools/Source/MigrationTools/build.xml b/Tools/Source/MigrationTools/build.xml new file mode 100644 index 0000000000..2406c0350f --- /dev/null +++ b/Tools/Source/MigrationTools/build.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/Database.java b/Tools/Source/MigrationTools/org/tianocore/migration/Database.java new file mode 100644 index 0000000000..a07fe16f03 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/Database.java @@ -0,0 +1,135 @@ +package org.tianocore.migration; + +import java.io.*; +import java.util.*; + +public class Database { + Database() throws Exception { + if (System.getenv("WORKSPACE") == null) { + DatabasePath = "C:" + File.separator + "tianocore" + File.separator + "edk2" + File.separator + "Tools" + File.separator + "Conf" + File.separator + "Migration"; + } else { + DatabasePath = System.getenv("WORKSPACE") + File.separator + "Tools" + File.separator + "Conf" + File.separator + "Migration"; + } + + importDBLib("Library.csv"); + importDBGuid("Guid.csv", "Guid"); + importDBGuid("Ppi.csv", "Ppi"); + importDBGuid("Protocol.csv", "Protocol"); + importDBMacro("Macro.csv"); + } + + public static String defaultpath = "C:" + File.separator + "tianocore" + File.separator + "edk2" + File.separator + "Tools" + File.separator + "Conf" + File.separator + "Migration"; + + public String DatabasePath; + public Set error = new HashSet(); + + private Map hashguid = new HashMap(); + private Map hashfunc = new HashMap(); + private Map hashmacro = new HashMap(); + + private void importDBLib(String filename) throws Exception { + BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename)); + String line; + String[] linecontext; + Func lf; + + if (rd.ready()) { + System.out.println("Found " + filename + " , Importing Library Database"); + while ((line = rd.readLine()) != null) { + if (line.length() != 0) { + linecontext = line.split(","); + lf = new Func(linecontext); + hashfunc.put(lf.r8funcname,lf); + } + } + } + } + + private void importDBGuid(String filename, String type) throws Exception { + BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename)); + String line; + String[] linecontext; + Guid gu; + + if (rd.ready()) { + System.out.println("Found " + filename + " , Importing " + type + " Database"); + while ((line = rd.readLine()) != null) { + if (line.length() != 0) { + linecontext = line.split(","); + gu = new Guid(linecontext, type); + hashguid.put(gu.r8name,gu); + } + } + } + } + + private void importDBMacro(String filename) throws Exception { + BufferedReader rd = new BufferedReader(new FileReader(DatabasePath + File.separator + filename)); + String line; + String[] linecontext; + Macro mc; + + if (rd.ready()) { + System.out.println("Found " + filename + " , Importing Macro Database"); + while ((line = rd.readLine()) != null) { + if (line.length() != 0) { + linecontext = line.split(","); + mc = new Macro(linecontext); + hashmacro.put(mc.r8name,mc); + } + } + } + } + + public String getR9Lib(String r8funcname) { + String temp = null; + if (hashfunc.containsKey(r8funcname)) { + temp = hashfunc.get(r8funcname).r9libname; + } + return temp; + } + + public String getR9Func(String r8funcname) { + String temp = null; + if (hashfunc.containsKey(r8funcname)) { + temp = hashfunc.get(r8funcname).r9funcname; + } + return temp; + } + + public boolean hasFunc(String r8lib) { + return hashfunc.containsKey(r8lib); + } + + public boolean hasGuid(String r8guid) { + return hashguid.containsKey(r8guid); + } + + public boolean hasMacro(String r8macro) { + return hashmacro.containsKey(r8macro); + } + + public String getR9Macro(String r8macro) { + return hashmacro.get(r8macro).r9name; // the verification job of if the macro exists in the database is done when registering it + } + + public String getR9Guidname(String r8Guid) { + String temp = null; + try { + temp = hashguid.get(r8Guid).r9name; + } catch (NullPointerException e) { + error.add("getR9Guidname :" + r8Guid); + } + return temp; + } + + public String getGuidType(String r8Guid) { + String temp = null; + try { + temp = hashguid.get(r8Guid).type; + } catch (NullPointerException e) { + error.add("getR9Guidname :" + r8Guid); + } + return temp; + } +} diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/FirstPanel.java b/Tools/Source/MigrationTools/org/tianocore/migration/FirstPanel.java new file mode 100644 index 0000000000..342c01c443 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/FirstPanel.java @@ -0,0 +1,139 @@ +package org.tianocore.migration; + +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.util.*; +import javax.swing.*; + +public class FirstPanel extends JPanel implements ActionListener, UI { + /** + * Define class Serial Version UID + */ + private static final long serialVersionUID = 207759413522910399L; + + private String modulepath; + + private JButton moduleButton , goButton; + private JTextField moduletext; + private JTextArea log; + private JFileChooser fc; + private JCheckBox filebox, screenbox; + + private boolean tofile = true, toscreen = true; + private PrintWriter logfile; + + FirstPanel() throws Exception { + goButton = new JButton("Go"); + goButton.addActionListener(this); + goButton.setActionCommand("go"); + + moduleButton = new JButton("Choose ModulePath"); + moduleButton.addActionListener(this); + + moduletext = new JTextField(30); + + filebox = new JCheckBox("Output to logfile", true); + screenbox = new JCheckBox("Specify logfile", false); + + JPanel modulePanel = new JPanel(); + modulePanel.add(moduleButton); + modulePanel.add(moduletext); + modulePanel.add(filebox); + modulePanel.add(screenbox); + modulePanel.add(goButton); + add(modulePanel); + + log = new JTextArea(50,25); + log.setMargin(new Insets(5,5,5,5)); + log.setEditable(false); + JScrollPane logScrollPane = new JScrollPane(log); + add(logScrollPane); + + fc = new JFileChooser(); + fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + } + + //---------------------------------------------------------------------------------------// + + public boolean yesOrNo(String question) { + return JOptionPane.showConfirmDialog(this, question, "Yes or No", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; + } + + public void print(String message) { + if (toscreen == true) { + log.append(message); + System.out.print(message); + } + if (tofile == true) { + logfile.append(message); + } + } + + public void println(String message) { + print(message + "\n"); + } + + public void println(Set hash) { + if (toscreen == true) { + log.append(hash + "\n"); + System.out.println(hash); + } + if (tofile == true) { + logfile.append(hash + "\n"); + } + } + + //---------------------------------------------------------------------------------------// + + /* + public boolean getOption(String item) { + if (item.matches("file")) { + } + } + */ + + public void actionPerformed(ActionEvent e) { + if ( e.getSource() == moduleButton ) { + int ret = fc.showOpenDialog(this); + if (ret == JFileChooser.APPROVE_OPTION) { + modulepath = fc.getSelectedFile().getAbsolutePath(); + moduletext.setText(modulepath); + log.append("ModulePath: " + modulepath + "\n"); + } + } + if ( e.getSource() == goButton ) { + try { + logfile = new PrintWriter(new BufferedWriter(new FileWriter(modulepath + File.separator + "migration.log"))); + println("Project MsaGen"); + println("Copyright (c) 2006, Intel Corporation"); + new ModuleInfo(modulepath, this, new Database()); + logfile.flush(); + } catch (Exception en) { + println(en.getMessage()); + } + } + } + + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.DESELECTED) { + System.out.println("changed"); + } + } + + //---------------------------------------------------------------------------------------// + + public static void init() throws Exception { + JFrame.setDefaultLookAndFeelDecorated(true); + JFrame frame = new JFrame("FrameDemo"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + FirstPanel fp = new FirstPanel(); + fp.setLayout(new BoxLayout(fp, BoxLayout.Y_AXIS)); + fp.setOpaque(true); + frame.setContentPane(fp); + + frame.setSize(800,600); + frame.setVisible(true); + } +} \ No newline at end of file diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/Func.java b/Tools/Source/MigrationTools/org/tianocore/migration/Func.java new file mode 100644 index 0000000000..843995a708 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/Func.java @@ -0,0 +1,51 @@ +package org.tianocore.migration; + +import java.util.regex.*; + +public class Func { + Func(String r8func,String r8lib,String r9func,String r9lib) { + r8funcname = r8func; + r8libname = r8lib; + r9funcname = r9func; + r9libname = r9lib; + } + Func(String[] linecontext) { + r8funcname = linecontext[1]; + r8libname = linecontext[0]; + r9funcname = linecontext[2]; + r9libname = linecontext[3]; + } + public String r8funcname; + public String r8libname; + public String r9funcname; + public String r9libname; + + public static Pattern ptnbrace = Pattern.compile("\\{[^\\{\\}]*\\}",Pattern.MULTILINE); + public static Pattern ptnfuncc = Pattern.compile("([a-zA-Z_]\\w*)\\s*\\([^\\)\\(]*\\)",Pattern.MULTILINE); + public static Pattern ptnfuncd = Pattern.compile("([a-zA-Z_]\\w*)\\s*\\([^\\)\\(]*\\)\\s*@",Pattern.MULTILINE); + public static Pattern ptnlowcase = Pattern.compile("[a-z]"); // must be removed + + private static String reservedwords = "if for pack while switch return sizeof"; + + public static String register(Matcher mtr, ModuleInfo mi, Database db) { + String temp = null; + + temp = mtr.group(1); // both changed and not changed funcc are registered , for finding all the non-local function calls + Matcher mtrlowcase = ptnlowcase.matcher(temp); // must be removed , so the two funcs can be merged + if (!reservedwords.contains(temp) && mtrlowcase.find()) { + mi.hashfuncc.add(temp); + } + return temp; + } + /* + public static String registerFuncD(Matcher mtr, ModuleInfo mi, Database db) { + String temp = null; + + temp = mtr.group(1); // both changed and not changed funcd are registered , for finding all the non-local function calls + if (!reservedwords.contains(temp)) { + mi.hashfuncd.add(temp); + } + return temp; + } + */ +} diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/Guid.java b/Tools/Source/MigrationTools/org/tianocore/migration/Guid.java new file mode 100644 index 0000000000..5cdaf44781 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/Guid.java @@ -0,0 +1,49 @@ +package org.tianocore.migration; + +import java.util.regex.*; + +public class Guid { + Guid (String r8, String t, String n, String r9, String gv, String p) { + r8name = r8; + type = t; + name = n; + r9name = r9; + guidvalue = gv; + pack = p; + } + Guid (String[] linecontext, String t) { + r8name = linecontext[1]; + type = t; + name = linecontext[0]; + r9name = linecontext[2]; + guidvalue = linecontext[3]; + pack = linecontext[4]; + } + public String r8name; + public String type; + public String name; + public String r9name; + public String guidvalue; + public String pack; + + public static Pattern ptnguid = Pattern.compile("g\\w*Guid"); + + public static String register(Matcher mtr, ModuleInfo mi, Database db) { + String type = null; + String temp = null; + + temp = mtr.group(); + if (db.hasGuid(temp)) { // only changed guids registered, because both changed and not changed guids are included in database + type = db.getGuidType(temp); + if (type.matches("Protocol")) { + mi.protocol.add(temp); + } else if (type.matches("Ppi")) { + mi.ppi.add(temp); + } else if (type.matches("Guid")) { + mi.guid.add(temp); + } + return temp; + } + return null; + } +} \ No newline at end of file diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/Macro.java b/Tools/Source/MigrationTools/org/tianocore/migration/Macro.java new file mode 100644 index 0000000000..2e8356e4d1 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/Macro.java @@ -0,0 +1,34 @@ +package org.tianocore.migration; + +import java.util.regex.*; + +public class Macro { + Macro(String r8, String r9) { + r8name = r8; + r9name = r9; + } + Macro(String[] linecontext) { + r8name = linecontext[0]; + r9name = linecontext[1]; + } + + public String r8name; + public String r9name; + + public static Pattern ptntmacro = Pattern.compile("\\b[A-Z_]+\\s*?\\(?\\b",Pattern.MULTILINE); + + private static String unmacro = "VOID UINTN BOOLEAN ASSERT OPTIONAL STATIC NULL TRUE IN OUT FALSE"; + + public static String register(Matcher mtr, ModuleInfo mi, Database db) { + String temp = null; + + temp = mtr.group(); + if (db.hasMacro(temp)) { // only changed macros registered, because the database of macro has only changed ones + if (!unmacro.contains(temp)) { + mi.hashnonlocalmacro.add(temp); + } + return temp; + } + return null; + } +} \ No newline at end of file diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/ModuleInfo.java b/Tools/Source/MigrationTools/org/tianocore/migration/ModuleInfo.java new file mode 100644 index 0000000000..90585aeb60 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/ModuleInfo.java @@ -0,0 +1,280 @@ +package org.tianocore.migration; + +import java.io.*; +import java.util.*; +import java.util.regex.*; + +/* + Class ModuleInfo is built for scanning the source files, it contains all the needed +information and all the temporary data. +*/ +public class ModuleInfo { + ModuleInfo(String modulepath, UI ui, Database db) throws Exception { + this.modulepath = modulepath; + this.ui = ui; + this.db = db; + moduleScan(); + } + + private String modulepath = null; + private Database db = null; + private UI ui = null; + + public String modulename = null; + public String guidvalue = null; + public String moduletype = null; + public String entrypoint = null; + + public Set localmodulesources = new HashSet(); //contains both .c and .h + public Set localmoduleheaders = new HashSet(); + public Set preprocessedccodes = new HashSet(); + + public Set hashfuncc = new HashSet(); + public Set hashfuncd = new HashSet(); + public Set hashnonlocalfunc = new HashSet(); + public Set hashnonlocalmacro = new HashSet(); + public Set hashEFIcall = new HashSet(); + public Set hashr8only = new HashSet(); + + public Set hashrequiredr9libs = new HashSet(); // hashrequiredr9libs is now all added in SourceFileReplacer + public Set guid = new HashSet(); + public Set protocol = new HashSet(); + public Set ppi = new HashSet(); + + private static String migrationcomment = "//%$//"; + + private void moduleScan() throws Exception { + String[] list = new File(modulepath).list(); + boolean hasInf = false; + String infname = null; + boolean hasMsa = false; + String msaname = null; + + for (int i = 0 ; i < list.length ; i++) { + if (new File(list[i]).isDirectory()) { + ; + } else { + if (list[i].contains(".c") || list[i].contains(".C")) { + localmodulesources.add(list[i]); + } else if (list[i].contains(".h") || list[i].contains(".H")) { + localmodulesources.add(list[i]); + localmoduleheaders.add(list[i]); //the case that several .inf or .msa found is not concerned + } else if (list[i].contains(".inf")) { + if (ui.yesOrNo("Found .inf file : " + list[i] + "\nUse this file as this module's .inf ?")) { + hasInf = true; + infname = list[i]; + } else { + continue; + } + } else if (list[i].contains(".msa")) { + if (ui.yesOrNo("Found .msa file : " + list[i] + "\nUse this file as this module's .msa ?")) { + hasMsa = true; + msaname = list[i]; + } else { + continue; + } + } + } + } + + ModuleReader mr = new ModuleReader(modulepath, this, db); + if (hasInf) { // this sequence shows using .inf as default + mr.readInf(infname); + } else if (hasMsa) { + mr.readMsa(msaname); + } else { + ui.println("No Inf Nor Msa Found"); + } + + CommentOutNonLocalHFile(); + parsePreProcessedSourceCode(); + + new SourceFileReplacer(modulepath, this, db, ui).flush(); // some adding library actions are taken here,so it must be put before "MsaWriter" + + // show result + if (ui.yesOrNo("Parse Module Information Complete . See details ?")) { + ui.println("\nModule Information : "); + ui.println("Entrypoint : " + entrypoint); + show(protocol, "Protocol : "); + show(ppi, "Ppi : "); + show(guid, "Guid : "); + show(hashfuncc, "call : "); + show(hashfuncd, "def : "); + show(hashEFIcall, "EFIcall : "); + show(hashnonlocalmacro, "macro : "); + show(hashnonlocalfunc, "nonlocal : "); + show(hashr8only, "hashr8only : "); + } + + new MsaWriter(modulepath, this, db).flush(); + + // remove temp directory + //File tempdir = new File(modulepath + File.separator + "temp"); + //System.out.println("Deleting Dir"); + //if (tempdir.exists()) tempdir.d; + + ui.println("Errors Left : " + db.error); + ui.println("Complete!"); + ui.println("Your R9 module is placed at " + modulepath + File.separator + "result"); + ui.println("Your logfile is placed at " + modulepath); + } + + private void show(Set hash, String show) { + ui.println(show + hash.size()); + ui.println(hash); + } + + // add '//' to all non-local include lines + private void CommentOutNonLocalHFile() throws IOException { + BufferedReader rd; + String line; + String curFile; + PrintWriter outfile; + + Pattern ptninclude = Pattern.compile("[\"<](.*[.]h)[\">]"); + Matcher mtcinclude; + + File tempdir = new File(modulepath + File.separator + "temp" + File.separator); + if (!tempdir.exists()) tempdir.mkdir(); + + Iterator ii = localmodulesources.iterator(); + while ( ii.hasNext() ) { + curFile = ii.next(); + rd = new BufferedReader(new FileReader(modulepath + File.separator + curFile)); + outfile = new PrintWriter(new BufferedWriter(new FileWriter(modulepath + File.separator + "temp" + File.separator + curFile))); + while ((line = rd.readLine()) != null) { + if (line.contains("#include")) { + mtcinclude = ptninclude.matcher(line); + if (mtcinclude.find() && localmoduleheaders.contains(mtcinclude.group(1))) { + } else { + line = migrationcomment + line; + } + } + outfile.append(line + '\n'); + } + outfile.flush(); + outfile.close(); + } + } + /* + private void search(String line, Pattern ptn, Method md) { + matmacro = Func.ptntmacro.matcher(line); + while (matmacro.find()) { + if ((temp = Func.registerMacro(matmacro, this, db)) != null) { + } + } + } + */ + private void parsePreProcessedSourceCode() throws Exception { + //Cl cl = new Cl(modulepath); + //cl.execute("Fat.c"); + //cl.generateAll(preprocessedccodes); + // + //System.out.println("Note!!!! The CL is not implemented now , pls do it manually!!! RUN :"); + //System.out.println("cl " + modulepath + "\\temp\\*.c" + " -P"); + //String[] list = new File(modulepath + File.separator + "temp").list(); // without CL , add + String[] list = new File(modulepath).list(); + for (int i = 0 ; i < list.length ; i++) { + if (list[i].contains(".c")) { // without CL , change to .i + preprocessedccodes.add(list[i]); + } + } + // + Iterator ii = preprocessedccodes.iterator(); + BufferedReader rd = null; + String ifile = null; + String line = null; + String temp = null; + //StringBuffer result = new StringBuffer(); + + Pattern patefifuncc = Pattern.compile("g?(BS|RT)\\s*->\\s*([a-zA-Z_]\\w*)",Pattern.MULTILINE); + Pattern patentrypoint = Pattern.compile("EFI_([A-Z]*)_ENTRY_POINT\\s*\\(([^\\(\\)]*)\\)",Pattern.MULTILINE); + Matcher matguid; + Matcher matfuncc; + Matcher matfuncd; + Matcher matenclosereplace; + Matcher matefifuncc; + Matcher matentrypoint; + Matcher matmacro; + + while (ii.hasNext()) { + StringBuffer wholefile = new StringBuffer(); + ifile = ii.next(); + rd = new BufferedReader(new FileReader(modulepath + File.separator + "temp" + File.separator + ifile)); + while ((line = rd.readLine()) != null) { + wholefile.append(line + '\n'); + } + line = wholefile.toString(); + + // if this is a Pei phase module , add these library class to .msa + matentrypoint = patentrypoint.matcher(line); + if (matentrypoint.find()) { + entrypoint = matentrypoint.group(2); + if (matentrypoint.group(1).matches("PEIM")) { + hashrequiredr9libs.add("PeimEntryPoint"); + } else { + hashrequiredr9libs.add("UefiDriverEntryPoint"); + } + } + + // find guid + matguid = Guid.ptnguid.matcher(line); // several ways to implement this , which one is faster ? : + while (matguid.find()) { // 1.currently , find once , then call to identify which is it + if ((temp = Guid.register(matguid, this, db)) != null) { // 2.use 3 different matchers , search 3 times to find each + //matguid.appendReplacement(result, db.getR9Guidname(temp)); // search the database for all 3 kinds of guids , high cost + } + } + //matguid.appendTail(result); + //line = result.toString(); + + // find EFI call in form of '->' , many 'gUnicodeCollationInterface->' like things are not changed + // This item is not simply replaced , special operation is required. + matefifuncc = patefifuncc.matcher(line); + while (matefifuncc.find()) { + hashEFIcall.add(matefifuncc.group(2)); + } + + // find function call + matfuncc = Func.ptnfuncc.matcher(line); + while (matfuncc.find()) { + if ((temp = Func.register(matfuncc, this, db)) != null) { + //ui.println(ifile + " dofunc " + temp); + //matfuncc.appendReplacement(result, db.getR9Func(temp)); + } + } + //matfuncc.appendTail(result); + //line = result.toString(); + + // find macro + matmacro = Macro.ptntmacro.matcher(line); + while (matmacro.find()) { + if ((temp = Macro.register(matmacro, this, db)) != null) { + } + } + + // find function definition + // replace all {} to @ + while ((matenclosereplace = Func.ptnbrace.matcher(line)).find()) { + line = matenclosereplace.replaceAll("@"); + } + + matfuncd = Func.ptnfuncd.matcher(line); + while (matfuncd.find()) { + if ((temp = Func.register(matfuncd, this, db)) != null) { + } + } + } + + // op on hash + Iterator funcci = hashfuncc.iterator(); + while (funcci.hasNext()) { + if (!hashfuncd.contains(temp = funcci.next()) && !hashEFIcall.contains(temp)) { + hashnonlocalfunc.add(temp); // this set contains both changed and not changed items + } + } + } + + public static void main(String[] args) throws Exception { + FirstPanel.init(); + } +} \ No newline at end of file diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/ModuleReader.java b/Tools/Source/MigrationTools/org/tianocore/migration/ModuleReader.java new file mode 100644 index 0000000000..d92b74cd01 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/ModuleReader.java @@ -0,0 +1,83 @@ +package org.tianocore.migration; + +import java.io.*; +import java.util.*; +import java.util.regex.*; +import org.tianocore.*; + +public class ModuleReader { + ModuleReader(String path, ModuleInfo moduleinfo, Database database) { + modulepath = path; + mi = moduleinfo; + db = database; + } + private String modulepath; + private ModuleInfo mi; + private Database db; + + private static Pattern ptninfequation = Pattern.compile("([^ ]*) *= *([^ ]*)"); + + public void readMsa(String name) throws Exception { + ModuleSurfaceAreaDocument msadoc = ModuleSurfaceAreaDocument.Factory.parse(new File(modulepath + File.separator + name)); + ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = msadoc.getModuleSurfaceArea(); + MsaHeaderDocument.MsaHeader msaheader = msa.getMsaHeader(); + + mi.modulename = msaheader.getModuleName(); + mi.guidvalue = msaheader.getGuidValue(); + mi.moduletype = msaheader.getModuleType().toString(); // ??? + + SourceFilesDocument.SourceFiles sourcefiles = msa.getSourceFiles(); + + String temp; + Iterator li = sourcefiles.getFilenameList().iterator(); + while (li.hasNext()) { + if (!mi.localmodulesources.contains(temp = li.next().toString())) { + System.out.println("Source File Missing ! : " + temp); + } + } + } + + public void readInf(String name) throws Exception { + System.out.println("Reading From Inf : " + name); + BufferedReader rd = new BufferedReader(new FileReader(modulepath + File.separator + name)); + String line; + String[] linecontext; + boolean inSrc = false; + Matcher mtrinfequation; + + while ((line = rd.readLine()) != null) { + if (line.length() != 0) { + if (inSrc) { + if (line.contains("[")) { + inSrc = false; + } else { + linecontext = line.split(" "); + if (linecontext[2].length() != 0) { + if (!mi.localmodulesources.contains(linecontext[2])) { + System.out.println("Source File Missing ! : " + linecontext[2]); + } + } + } + } else { + if ((mtrinfequation = ptninfequation.matcher(line)).find()) { + if (mtrinfequation.group(1).matches("BASE_NAME")) { + mi.modulename = mtrinfequation.group(2); + } + if (mtrinfequation.group(1).matches("FILE_GUID")) { + mi.guidvalue = mtrinfequation.group(2); + } + if (mtrinfequation.group(1).matches("COMPONENT_TYPE")) { + mi.moduletype = mtrinfequation.group(2); + } + if (mtrinfequation.group(1).matches("IMAGE_ENTRY_POINT")) { + mi.entrypoint = mtrinfequation.group(2); + } + } + if (line.contains("sources")) { + inSrc = true; + } + } + } + } + } +} \ No newline at end of file diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/MsaWriter.java b/Tools/Source/MigrationTools/org/tianocore/migration/MsaWriter.java new file mode 100644 index 0000000000..46cbb2dd51 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/MsaWriter.java @@ -0,0 +1,145 @@ +package org.tianocore.migration; + +import java.io.*; +import java.util.*; + +import org.tianocore.*; +import org.tianocore.SupportedArchitectures.Enum; +import org.apache.xmlbeans.*; + +public class MsaWriter { + MsaWriter(String path, ModuleInfo moduleinfo, Database database) { + modulepath = path; + mi = moduleinfo; + db = database; + } + + private String modulepath; + private ModuleInfo mi; + private Database db; + + private ModuleSurfaceAreaDocument msadoc = ModuleSurfaceAreaDocument.Factory.newInstance(); + + private ModuleSurfaceAreaDocument.ModuleSurfaceArea msa = msadoc.addNewModuleSurfaceArea(); + private MsaHeaderDocument.MsaHeader msaheader = msa.addNewMsaHeader(); + private ModuleDefinitionsDocument.ModuleDefinitions md = msa.addNewModuleDefinitions(); + private SourceFilesDocument.SourceFiles sourcefiles = msa.addNewSourceFiles(); //found local .h files are not written + private GuidsDocument.Guids guids = msa.addNewGuids(); + private ProtocolsDocument.Protocols protocols = msa.addNewProtocols(); + private PPIsDocument.PPIs ppis = msa.addNewPPIs(); + private PackageDependenciesDocument.PackageDependencies pd = msa.addNewPackageDependencies(); + private LibraryClassDefinitionsDocument.LibraryClassDefinitions libclassdefs = msa.addNewLibraryClassDefinitions(); + private ExternsDocument.Externs externs = msa.addNewExterns(); + + private String Query (String requirement) throws Exception { + String answer; + BufferedReader rd = new BufferedReader(new InputStreamReader(System.in)); + System.out.println(requirement); + while ((answer = rd.readLine()).length() == 0) ; + return answer; + } + + private ModuleSurfaceAreaDocument fulfillMsadoc() throws Exception { + Iterator it; + String temp; + + if (mi.modulename != null) { + msaheader.setModuleName(mi.modulename); + } else { + msaheader.setModuleName(mi.modulename = Query("ModuleName Not Found . Please Input ModuleName")); + } + if (mi.guidvalue != null) { + msaheader.setGuidValue(mi.guidvalue); + } else { + msaheader.setGuidValue(mi.guidvalue = Query("GuidValue Not Found . Please Input GuidValue")); + } + if (mi.moduletype != null) { + if (mi.moduletype.contains("PEI")) { + msaheader.setModuleType(ModuleTypeDef.Enum.forString("PEIM")); + } else { + msaheader.setModuleType(ModuleTypeDef.Enum.forString("DXE_DRIVER")); + } + } else { + msaheader.setModuleType(ModuleTypeDef.Enum.forString(mi.moduletype = Query("GuidValue Not Found . Please Input GuidValue"))); + } + msaheader.setCopyright("Copyright (c) 2006, Intel Corporation"); + msaheader.setVersion("1.0"); + msaheader.setAbstract("Component name for module " + mi.modulename); + msaheader.setDescription("FIX ME!"); //??? + msaheader.addNewLicense().setStringValue("All rights reserved.\n" + + " This software and associated documentation (if any) is furnished\n" + + " under a license and may only be used or copied in accordance\n" + + " with the terms of the license. Except as permitted by such\n" + + " license, no part of this software or documentation may be\n" + + " reproduced, stored in a retrieval system, or transmitted in any\n" + + " form or by any means without the express written consent of\n" + + " Intel Corporation."); + + List arch = new ArrayList(); + arch.add(SupportedArchitectures.IA_32); + arch.add(SupportedArchitectures.X_64); + arch.add(SupportedArchitectures.IPF); + arch.add(SupportedArchitectures.EBC); + md.setSupportedArchitectures(arch); + md.setBinaryModule(false); + md.setOutputFileBasename(mi.modulename); + + pd.addNewPackage().setPackageGuid("5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"); + externs.addNewSpecification().setStringValue("EFI_SPECIFICATION_VERSION 0x00020000"); + externs.addNewSpecification().setStringValue("EDK_RELEASE_VERSION 0x00020000"); + externs.addNewExtern().setModuleEntryPoint(mi.entrypoint); + + it = mi.localmodulesources.iterator(); + while (it.hasNext()) { + sourcefiles.addNewFilename().setStringValue(it.next()); + } + it = mi.protocol.iterator(); + while (it.hasNext()) { + if ((temp = it.next()) != null) { + ProtocolsDocument.Protocols.Protocol pr = protocols.addNewProtocol(); + pr.setProtocolCName(temp); + pr.setUsage(UsageTypes.ALWAYS_CONSUMED); + } + } + it = mi.ppi.iterator(); + while (it.hasNext()) { + if ((temp = it.next()) != null) { + PPIsDocument.PPIs.Ppi pp = ppis.addNewPpi(); + pp.setPpiCName(temp); + pp.setUsage(UsageTypes.ALWAYS_CONSUMED); + } + } + it = mi.guid.iterator(); + while (it.hasNext()) { + if ((temp = it.next()) != null) { + GuidsDocument.Guids.GuidCNames gcn = guids.addNewGuidCNames(); + gcn.setGuidCName(temp); + gcn.setUsage(UsageTypes.ALWAYS_CONSUMED); + } + } + it = mi.hashrequiredr9libs.iterator(); + while (it.hasNext()) { + if ((temp = it.next()) != null && !temp.matches("%")) { + LibraryClassDocument.LibraryClass lc = libclassdefs.addNewLibraryClass(); + lc.setKeyword(temp); + lc.setUsage(UsageTypes.ALWAYS_CONSUMED); + } + } + + return msadoc; + } + + public void flush() throws Exception { + XmlOptions options = new XmlOptions(); + + options.setCharacterEncoding("UTF-8"); + options.setSavePrettyPrint(); + options.setSavePrettyPrintIndent(2); + options.setUseDefaultNamespace(); + + BufferedWriter bw = new BufferedWriter(new FileWriter(modulepath + File.separator + "result" + File.separator + mi.modulename + ".msa")); + fulfillMsadoc().save(bw, options); + bw.flush(); + bw.close(); + } +} diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/SourceFileReplacer.java b/Tools/Source/MigrationTools/org/tianocore/migration/SourceFileReplacer.java new file mode 100644 index 0000000000..d9b5a108f1 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/SourceFileReplacer.java @@ -0,0 +1,338 @@ +package org.tianocore.migration; + +import java.io.*; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SourceFileReplacer { + SourceFileReplacer(String path, ModuleInfo moduleinfo, Database database, UI fp) { + modulepath = path; + mi = moduleinfo; + db = database; + ui = fp; + } + private String modulepath; + private ModuleInfo mi; + private Database db; + private UI ui; + private boolean showdetails = false; + + private class r8tor9 { + r8tor9(String r8, String r9) { + r8thing = r8; + r9thing = r9; + } + public String r8thing; + public String r9thing; + } + + // these sets are used only for printing log of the changes in current file + private Set filefunc = new HashSet(); + private Set filemacro = new HashSet(); + private Set fileguid = new HashSet(); + private Set fileppi = new HashSet(); + private Set fileprotocol = new HashSet(); + private Set filer8only = new HashSet(); + + private String r8only = "EfiLibInstallDriverBinding " + + "EfiLibInstallAllDriverProtocols " + + "EfiLibCompareLanguage " + + "BufToHexString " + + "EfiStrTrim " + + "EfiValueToHexStr " + + "HexStringToBuf " + + "IsHexDigit " + + "NibbleToHexChar " + + "GetHob " + + "GetHobListSize " + + "GetHobVersion " + + "GetHobBootMode " + + "GetCpuHobInfo " + + "GetDxeCoreHobInfo " + + "GetNextFirmwareVolumeHob " + + "GetNextGuidHob " + + "GetPalEntryHobInfo " + + "GetIoPortSpaceAddressHobInfo "; + + public void flush() throws Exception { + PrintWriter outfile; + String temp = null; + if (ui.yesOrNo("Change Source Code is to be doing . See details ?")) { + showdetails = true; + } + File tempdir = new File(modulepath + File.separator + "result" + File.separator); + if (!tempdir.exists()) tempdir.mkdir(); + String[] list = new File(modulepath + File.separator + "temp").list(); //what I change is the non-local .h commented-out files + for (int i = 0 ; i < list.length ; i++) { + if (list[i].contains(".c")) { + ui.println("\nModifying file : " + list[i]); + outfile = new PrintWriter(new BufferedWriter(new FileWriter(modulepath + File.separator + "result" + File.separator + list[i]))); + outfile.append(sourcefilereplace(modulepath + File.separator + "temp" + File.separator + list[i])); + outfile.flush(); + outfile.close(); + } else { + if (list[i].contains(".h")) { + temp = list[i]; + } else if (list[i].contains(".C")) { + temp = list[i].replaceFirst(".C", ".c"); + } else if (list[i].contains(".H")) { + temp = list[i].replaceFirst(".H", ".h"); + } else { + continue; + } + ui.println("\nCopying file : " + temp); + outfile = new PrintWriter(new BufferedWriter(new FileWriter(modulepath + File.separator + "result" + File.separator + temp))); + outfile.append(sourcefiletostring(modulepath + File.separator + "temp" + File.separator + list[i])); + outfile.flush(); + outfile.close(); + } + } + + if (!mi.hashr8only.isEmpty()) { + addr8only(); + } + } + + private void addr8only() throws Exception { + String paragraph = null; + String line = sourcefiletostring(Database.defaultpath + File.separator + "R8Lib.c"); + PrintWriter outfile1 = new PrintWriter(new BufferedWriter(new FileWriter(modulepath + File.separator + "result" + File.separator + "R8Lib.c"))); + PrintWriter outfile2 = new PrintWriter(new BufferedWriter(new FileWriter(modulepath + File.separator + "result" + File.separator + "R8Lib.h"))); + //outfile1.append("#include \"R8Lib.h\"\n\n"); + //outfile2.append("#include \"R8Lib.h\"\n\n"); + Pattern ptnr8only = Pattern.compile("////#?(\\w*)?.*?R8_(\\w*).*?////~", Pattern.DOTALL); + Matcher mtrr8only = ptnr8only.matcher(line); + Matcher mtrr8onlyhead; + while (mtrr8only.find()) { + if (mi.hashr8only.contains(mtrr8only.group(2))) { + paragraph = mtrr8only.group(); + outfile1.append(paragraph + "\n\n"); + if (mtrr8only.group(1).length() != 0) { + mi.hashrequiredr9libs.add(mtrr8only.group(1)); + } + //generate R8lib.h + while ((mtrr8onlyhead = Func.ptnbrace.matcher(paragraph)).find()) { + paragraph = mtrr8onlyhead.replaceAll(";"); + } + outfile2.append(paragraph + "\n\n"); + } + } + outfile1.flush(); + outfile1.close(); + outfile2.flush(); + outfile2.close(); + } + + private String sourcefiletostring(String filename) throws Exception { + BufferedReader rd = new BufferedReader(new FileReader(filename)); + StringBuffer wholefile = new StringBuffer(); + String line; + while ((line = rd.readLine()) != null) { + wholefile.append(line + "\n"); + } + return wholefile.toString(); + } + + // Caution : if there is @ in file , it will be replaced with \n , so is you use Doxygen ... God Bless you! + private String sourcefilereplace(String filename) throws Exception { + BufferedReader rd = new BufferedReader(new FileReader(filename)); + StringBuffer wholefile = new StringBuffer(); + String line; + String r8thing; + String r9thing; + r8tor9 temp; + boolean addr8 = false; + + Pattern pat = Pattern.compile("g?(BS|RT)(\\s*->\\s*)([a-zA-Z_]\\w*)", Pattern.MULTILINE); // ! only two level () bracket allowed ! + //Pattern ptnpei = Pattern.compile("\\(\\*\\*?PeiServices\\)[.-][>]?\\s*(\\w*[#$]*)(\\s*\\(([^\\(\\)]*(\\([^\\(\\)]*\\))?[^\\(\\)]*)*\\))", Pattern.MULTILINE); + + while ((line = rd.readLine()) != null) { + wholefile.append(line + "\n"); + } + line = wholefile.toString(); + + // replace BS -> gBS , RT -> gRT + Matcher mat = pat.matcher(line); + if (mat.find()) { // add a library here + ui.println("Converting all BS->gBS,RT->gRT"); + line = mat.replaceAll("g$1$2$3"); //unknown correctiveness + } + mat.reset(); + while (mat.find()) { + if (mat.group(1).matches("BS")) { + mi.hashrequiredr9libs.add("UefiBootServicesTableLib"); + } + if (mat.group(1).matches("RT")) { + mi.hashrequiredr9libs.add("UefiRuntimeServicesTableLib"); + } + } + /* + // remove EFI_DRIVER_ENTRY_POINT + Pattern patentrypoint = Pattern.compile("EFI_DRIVER_ENTRY_POINT[^\\}]*\\}"); + Matcher matentrypoint = patentrypoint.matcher(line); + if (matentrypoint.find()) { + ui.println("Deleting Entry_Point"); + line = matentrypoint.replaceAll(""); + } + */ + // start replacing names + Iterator it; + // Converting non-locla function + it = mi.hashnonlocalfunc.iterator(); + while (it.hasNext()) { + r8thing = it.next(); + if (r8thing.matches("EfiInitializeDriverLib")) { //s + mi.hashrequiredr9libs.add("UefiBootServicesTableLib"); //p + mi.hashrequiredr9libs.add("UefiRuntimeServicesTableLib"); //e + } else if (r8thing.matches("DxeInitializeDriverLib")) { //c + mi.hashrequiredr9libs.add("UefiBootServicesTableLib"); //i + mi.hashrequiredr9libs.add("UefiRuntimeServicesTableLib"); //a + mi.hashrequiredr9libs.add("DxeServicesTableLib"); //l + } else { // + mi.hashrequiredr9libs.add(db.getR9Lib(r8thing)); // add a library here + } + + if ((r9thing = db.getR9Func(r8thing)) != null) { + if (!r8thing.equals(r9thing)) { + if (line.contains(r8thing)) { + line = line.replaceAll(r8thing, r9thing); + filefunc.add(new r8tor9(r8thing, r9thing)); + Iterator rt = filefunc.iterator(); + while (rt.hasNext()) { + temp = rt.next(); + if (r8only.contains(temp.r8thing)) { + mi.localmodulesources.add("R8Lib.h"); + mi.localmodulesources.add("R8Lib.c"); + mi.localmoduleheaders.add("R8Lib.h"); + filer8only.add(r8thing); + mi.hashr8only.add(r8thing); + addr8 = true; + } + } + } + } + } + } //is any of the guids changed? + if (addr8 == true) { + line = line.replaceFirst("\\*/\n", "\\*/\n#include \"R8Lib.h\"\n"); + } + + // Converting macro + it = mi.hashnonlocalmacro.iterator(); + while (it.hasNext()) { //macros are all assumed MdePkg currently + r8thing = it.next(); + //mi.hashrequiredr9libs.add(db.getR9Lib(r8thing)); + if ((r9thing = db.getR9Macro(r8thing)) != null) { + if (line.contains(r8thing)) { + line = line.replaceAll(r8thing, r9thing); + filemacro.add(new r8tor9(r8thing, r9thing)); + } + } + } + + // Converting guid + replaceGuid(line, mi.guid, "guid", fileguid); + replaceGuid(line, mi.ppi, "ppi", fileppi); + replaceGuid(line, mi.protocol, "protocol", fileprotocol); + + // Converting Pei + // First , find all (**PeiServices)-> or (*PeiServices). with arg "PeiServices" , change name and add #% + Pattern ptnpei = Pattern.compile("\\(\\*\\*?PeiServices\\)[.-][>]?\\s*(\\w*)(\\s*\\(\\s*PeiServices\\s*,\\s*)", Pattern.MULTILINE); + if (mi.moduletype.contains("PEIM")) { + Matcher mtrpei = ptnpei.matcher(line); + while (mtrpei.find()) { // ! add a library here ! + line = mtrpei.replaceAll("PeiServices$1#%$2"); + mi.hashrequiredr9libs.add("PeiServicesLib"); + } + mtrpei.reset(); + if (line.contains("PeiServicesCopyMem")) { + line = line.replaceAll("PeiServicesCopyMem#%", "CopyMem"); + mi.hashrequiredr9libs.add("BaseMemoryLib"); + } + if (line.contains("PeiServicesSetMem")) { + line = line.replaceAll("PeiServicesSetMem#%", "SetMem"); + mi.hashrequiredr9libs.add("BaseMemoryLib"); + } + + // Second , find all #% to drop the arg "PeiServices" + Pattern ptnpeiarg = Pattern.compile("#%+(\\s*\\(+\\s*)PeiServices\\s*,\\s*", Pattern.MULTILINE); + Matcher mtrpeiarg = ptnpeiarg.matcher(line); + while (mtrpeiarg.find()) { + line = mtrpeiarg.replaceAll("$1"); + } + } + + Matcher mtrmac; + mtrmac = Pattern.compile("EFI_IDIV_ROUND\\((.*), (.*)\\)").matcher(line); + if (mtrmac.find()) { + line = mtrmac.replaceAll("\\($1 \\/ $2 \\+ \\(\\(\\(2 \\* \\($1 \\% $2\\)\\) \\< $2\\) \\? 0 \\: 1\\)\\)"); + } + mtrmac = Pattern.compile("EFI_MIN\\((.*), (.*)\\)").matcher(line); + if (mtrmac.find()) { + line = mtrmac.replaceAll("\\(\\($1 \\< $2\\) \\? $1 \\: $2\\)"); + } + mtrmac = Pattern.compile("EFI_MAX\\((.*), (.*)\\)").matcher(line); + if (mtrmac.find()) { + line = mtrmac.replaceAll("\\(\\($1 \\> $2\\) \\? $1 \\: $2\\)"); + } + mtrmac = Pattern.compile("EFI_UINTN_ALIGNED\\((.*)\\)").matcher(line); + if (mtrmac.find()) { + line = mtrmac.replaceAll("\\(\\(\\(UINTN\\) $1\\) \\& \\(sizeof \\(UINTN\\) \\- 1\\)\\)"); + } + if (line.contains("EFI_UINTN_ALIGN_MASK")) { + line = line.replaceAll("EFI_UINTN_ALIGN_MASK", "(sizeof (UINTN) - 1)"); + } + + show(filefunc, "function"); + show(filemacro, "macro"); + show(fileguid, "guid"); + show(fileppi, "ppi"); + show(fileprotocol, "protocol"); + if (!filer8only.isEmpty()) { + ui.println("Converting r8only : " + filer8only); + } + + filefunc.clear(); + filemacro.clear(); + fileguid.clear(); + fileppi.clear(); + fileprotocol.clear(); + filer8only.clear(); + + return line; + } + + private void show(Set hash, String sh) { + Iterator it = hash.iterator(); + r8tor9 temp; + if (showdetails) { + if (!hash.isEmpty()) { + ui.print("Converting " + sh + " : "); + while (it.hasNext()) { + temp = it.next(); + ui.print("[" + temp.r8thing + "->" + temp.r9thing + "] "); + } + ui.println(""); + } + } + } + + private void replaceGuid(String line, Set hash, String kind, Set filehash) { + Iterator it; + String r8thing; + String r9thing; + it = hash.iterator(); + while (it.hasNext()) { + r8thing = it.next(); + if ((r9thing = db.getR9Guidname(r8thing)) != null) { + if (!r8thing.equals(r9thing)) { + if (line.contains(r8thing)) { + line = line.replaceAll(r8thing, r9thing); + filehash.add(new r8tor9(r8thing, r9thing)); + } + } + } + } + } +} diff --git a/Tools/Source/MigrationTools/org/tianocore/migration/UI.java b/Tools/Source/MigrationTools/org/tianocore/migration/UI.java new file mode 100644 index 0000000000..da6798c6d0 --- /dev/null +++ b/Tools/Source/MigrationTools/org/tianocore/migration/UI.java @@ -0,0 +1,14 @@ +package org.tianocore.migration; + +import java.util.*; + +public interface UI { + + public boolean yesOrNo(String question); + + public void print(String message); + + public void println(String message); + + public void println(Set hash); +} -- 2.39.2