mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
Add MigrationTools
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1232 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
c8b59d238c
commit
0dc8c58932
2
Tools/Source/MigrationTools/MANIFEST.MF
Normal file
2
Tools/Source/MigrationTools/MANIFEST.MF
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: org.tianocore.migration.ModuleInfo
|
45
Tools/Source/MigrationTools/MigrationTools.msa
Normal file
45
Tools/Source/MigrationTools/MigrationTools.msa
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" >
|
||||||
|
<MsaHeader>
|
||||||
|
<ModuleName>MigrationTools</ModuleName>
|
||||||
|
<ModuleType>TOOL</ModuleType>
|
||||||
|
<GuidValue>09C77FAE-6374-408e-AB88-32822B92096E</GuidValue>
|
||||||
|
<Version>1.0</Version>
|
||||||
|
<Abstract>This is the EFI/Tiano Migration Tool Resources Module</Abstract>
|
||||||
|
<Description>
|
||||||
|
This Module provdes the entity, action and exception package for Migration
|
||||||
|
tools, This package will be shared for building tools or wizard tools.
|
||||||
|
</Description>
|
||||||
|
<Copyright>Copyright 2005-2006, Intel Corporation</Copyright>
|
||||||
|
<License>
|
||||||
|
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.
|
||||||
|
</License>
|
||||||
|
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
|
||||||
|
</MsaHeader>
|
||||||
|
<ModuleDefinitions>
|
||||||
|
<SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>
|
||||||
|
<BinaryModule>false</BinaryModule>
|
||||||
|
<OutputFileBasename>NULL</OutputFileBasename>
|
||||||
|
</ModuleDefinitions>
|
||||||
|
<SourceFiles>
|
||||||
|
<Filename>build.xml</Filename>
|
||||||
|
<Filename>org/tianocore/migration/Database.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/FirstPanel.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/Func.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/Guid.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/Macro.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/ModuleInfo.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/ModuleReader.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/MsaWriter.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/SourceFileReplacer.java</Filename>
|
||||||
|
<Filename>org/tianocore/migration/UI.java</Filename>
|
||||||
|
</SourceFiles>
|
||||||
|
</ModuleSurfaceArea>
|
52
Tools/Source/MigrationTools/build.xml
Normal file
52
Tools/Source/MigrationTools/build.xml
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
Copyright (c) 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.
|
||||||
|
-->
|
||||||
|
<project name="MigrationTools" default="MigrationTools" basedir=".">
|
||||||
|
|
||||||
|
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
|
||||||
|
<property environment="env"/>
|
||||||
|
<property name="WORKSPACE" value="${env.WORKSPACE}"/>
|
||||||
|
<path id="classpath">
|
||||||
|
<fileset dir="${WORKSPACE}/Tools/Jars" includes="*.jar"/>
|
||||||
|
<fileset dir="${env.XMLBEANS_HOME}/lib" includes="*.jar"/>
|
||||||
|
</path>
|
||||||
|
<property name="buildDir" value="build"/>
|
||||||
|
<property name="installLocation" value="${WORKSPACE}/Tools/bin"/>
|
||||||
|
<target name="MigrationTools" depends="install"/>
|
||||||
|
<target name="source">
|
||||||
|
<mkdir dir="${buildDir}"/>
|
||||||
|
<javac srcdir="." destdir="${buildDir}">
|
||||||
|
<classpath refid="classpath"/>
|
||||||
|
<compilerarg value="-Xlint"/>
|
||||||
|
</javac>
|
||||||
|
</target>
|
||||||
|
<target name="clean">
|
||||||
|
<delete dir="${buildDir}"/>
|
||||||
|
</target>
|
||||||
|
<target name="cleanall">
|
||||||
|
<delete dir="${buildDir}"/>
|
||||||
|
<delete file="${installLocation}/MigrationTools.jar"/>
|
||||||
|
<if>
|
||||||
|
<available file="${installLocation}/MigrationTools.jar"/>
|
||||||
|
<then>
|
||||||
|
<echo message="You must manually remove the file: ${installLocation}/MigrationTools.jar"/>
|
||||||
|
<echo message="Java has already loaded the file, and cannot remove it within ANT!"/>
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
</target>
|
||||||
|
<target name="install" depends="source">
|
||||||
|
<jar destfile="${installLocation}/MigrationTools.jar"
|
||||||
|
basedir="${buildDir}"
|
||||||
|
includes="**"
|
||||||
|
manifest="MANIFEST.MF"
|
||||||
|
/>
|
||||||
|
</target>
|
||||||
|
</project>
|
@ -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<String> error = new HashSet<String>();
|
||||||
|
|
||||||
|
private Map<String,Guid> hashguid = new HashMap<String,Guid>();
|
||||||
|
private Map<String,Func> hashfunc = new HashMap<String,Func>();
|
||||||
|
private Map<String,Macro> hashmacro = new HashMap<String,Macro>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
@ -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<String> 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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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<String> localmodulesources = new HashSet<String>(); //contains both .c and .h
|
||||||
|
public Set<String> localmoduleheaders = new HashSet<String>();
|
||||||
|
public Set<String> preprocessedccodes = new HashSet<String>();
|
||||||
|
|
||||||
|
public Set<String> hashfuncc = new HashSet<String>();
|
||||||
|
public Set<String> hashfuncd = new HashSet<String>();
|
||||||
|
public Set<String> hashnonlocalfunc = new HashSet<String>();
|
||||||
|
public Set<String> hashnonlocalmacro = new HashSet<String>();
|
||||||
|
public Set<String> hashEFIcall = new HashSet<String>();
|
||||||
|
public Set<String> hashr8only = new HashSet<String>();
|
||||||
|
|
||||||
|
public Set<String> hashrequiredr9libs = new HashSet<String>(); // hashrequiredr9libs is now all added in SourceFileReplacer
|
||||||
|
public Set<String> guid = new HashSet<String>();
|
||||||
|
public Set<String> protocol = new HashSet<String>();
|
||||||
|
public Set<String> ppi = new HashSet<String>();
|
||||||
|
|
||||||
|
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<String> 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<String> 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<String> 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<String> 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();
|
||||||
|
}
|
||||||
|
}
|
@ -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<FilenameDocument.Filename> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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<String> 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<Enum> arch = new ArrayList<Enum>();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
@ -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<r8tor9> filefunc = new HashSet<r8tor9>();
|
||||||
|
private Set<r8tor9> filemacro = new HashSet<r8tor9>();
|
||||||
|
private Set<r8tor9> fileguid = new HashSet<r8tor9>();
|
||||||
|
private Set<r8tor9> fileppi = new HashSet<r8tor9>();
|
||||||
|
private Set<r8tor9> fileprotocol = new HashSet<r8tor9>();
|
||||||
|
private Set<String> filer8only = new HashSet<String>();
|
||||||
|
|
||||||
|
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<String> 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<r8tor9> 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<r8tor9> hash, String sh) {
|
||||||
|
Iterator<r8tor9> 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<String> hash, String kind, Set<r8tor9> filehash) {
|
||||||
|
Iterator<String> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
Tools/Source/MigrationTools/org/tianocore/migration/UI.java
Normal file
14
Tools/Source/MigrationTools/org/tianocore/migration/UI.java
Normal file
@ -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<String> hash);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user