3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 package org
.tianocore
.migration
;
17 import java
.util
.regex
.*;
19 import org
.tianocore
.*;
21 public final class ModuleReader
implements Common
.ForDoAll
{
22 private static final ModuleReader modulereader
= new ModuleReader();
23 private ModuleInfo mi
;
24 private final CommentLaplace commentlaplace
= new CommentLaplace();
26 private static final Pattern ptninfequation
= Pattern
.compile("([^\\s]*)\\s*=\\s*([^\\s]*)");
27 private static final Pattern ptnsection
= Pattern
.compile("\\[([^\\[\\]]*)\\]([^\\[\\]]*)\\n", Pattern
.MULTILINE
);
28 private static final Pattern ptnfilename
= Pattern
.compile("[^\\s]+");
30 public final void ModuleScan() throws Exception
{
31 Common
.toDoAll(mi
.modulepath
, ModuleInfo
.class.getMethod("enroll", String
.class), mi
, null, Common
.FILE
);
34 String filename
= null;
35 if (mi
.msaorinf
.isEmpty()) {
36 MigrationTool
.ui
.println("No INF nor MSA file found!");
39 if (mi
.msaorinf
.size() == 1) {
40 filename
= (String
)mi
.msaorinf
.toArray()[0];
42 filename
= MigrationTool
.ui
.choose("Found .inf or .msa file for module\n" + mi
.modulepath
+ "\nChoose one Please", mi
.msaorinf
.toArray());
46 if (filename
.contains(".inf")) {
48 } else if (filename
.contains(".msa")) {
56 private final void readMsa(String name
) throws Exception
{
57 ModuleSurfaceAreaDocument msadoc
= ModuleSurfaceAreaDocument
.Factory
.parse(new File(mi
.modulepath
+ File
.separator
+ name
));
58 ModuleSurfaceAreaDocument
.ModuleSurfaceArea msa
= msadoc
.getModuleSurfaceArea();
59 MsaHeaderDocument
.MsaHeader msaheader
= msa
.getMsaHeader();
61 mi
.modulename
= msaheader
.getModuleName();
62 mi
.guidvalue
= msaheader
.getGuidValue();
63 mi
.moduletype
= msaheader
.getModuleType().toString(); // ???
65 SourceFilesDocument
.SourceFiles sourcefiles
= msa
.getSourceFiles();
68 Iterator
<FilenameDocument
.Filename
> li
= sourcefiles
.getFilenameList().iterator();
69 while (li
.hasNext()) {
70 if (!mi
.localmodulesources
.contains(temp
= li
.next().toString())) {
71 System
.out
.println("Source File Missing! : " + temp
);
75 private final String
extractLicense(String wholeline
) throws Exception
{
77 String license
= null;
79 BufferedReader rd
= new BufferedReader(new StringReader(wholeline
));
80 while ((tempLine
= rd
.readLine()) != null) {
81 if (tempLine
.contains("#")) {
82 if (tempLine
.contains("Copyright")) {
87 while ((tempLine
= rd
.readLine())!= null) {
88 if (!tempLine
.contains("#") ||
89 tempLine
.contains("Module Name:") ||
90 tempLine
.contains("Abstract:")) {
92 // We assume license ends here.
96 license
+= " " + tempLine
.replaceAll("\\s*[#]\\s*(.*)", "$1\n");
105 private final void readInf(String name
) throws Exception
{
106 System
.out
.println("\nParsing INF file: " + name
);
108 Matcher mtrinfequation
;
112 wholeline
= Common
.file2string(mi
.modulepath
+ File
.separator
+ name
);
113 mi
.license
= extractLicense(wholeline
);
114 mtrsection
= ptnsection
.matcher(wholeline
);
115 while (mtrsection
.find()) {
116 if (mtrsection
.group(1).matches("defines")) {
117 mtrinfequation
= ptninfequation
.matcher(mtrsection
.group(2));
118 while (mtrinfequation
.find()) {
119 if (mtrinfequation
.group(1).matches("BASE_NAME")) {
120 mi
.modulename
= mtrinfequation
.group(2);
122 if (mtrinfequation
.group(1).matches("FILE_GUID")) {
123 mi
.guidvalue
= mtrinfequation
.group(2);
125 if (mtrinfequation
.group(1).matches("COMPONENT_TYPE")) {
126 mi
.moduletype
= mtrinfequation
.group(2);
130 if (mtrsection
.group(1).contains("nmake.")) {
131 mtrinfequation
= ptninfequation
.matcher(mtrsection
.group(2));
132 while (mtrinfequation
.find()) {
133 if (mtrinfequation
.group(1).matches("IMAGE_ENTRY_POINT")) {
134 mi
.entrypoint
= mtrinfequation
.group(2);
136 if (mtrinfequation
.group(1).matches("DPX_SOURCE")) {
137 if (!mi
.localmodulesources
.contains(mtrinfequation
.group(2))) {
138 MigrationTool
.ui
.println("DPX File Missing! : " + mtrinfequation
.group(2));
143 if (mtrsection
.group(1).contains("sources.")) {
144 mtrfilename
= ptnfilename
.matcher(mtrsection
.group(2));
145 while (mtrfilename
.find()) {
146 mi
.infsources
.add(mtrfilename
.group());
147 if (!mi
.localmodulesources
.contains(mtrfilename
.group())) {
148 MigrationTool
.ui
.println("Warn: Source File Missing! : " + mtrfilename
.group());
152 if (mtrsection
.group(1).matches("includes.")) {
153 mtrfilename
= ptnfilename
.matcher(mtrsection
.group(2));
154 while (mtrfilename
.find()) {
155 mi
.infincludes
.add(mtrfilename
.group());
161 private final void preProcessModule() throws Exception
{
162 // according to .inf file, add extraordinary includes and sourcefiles
163 Common
.dirCopy(mi
.modulepath
, mi
.temppath
); // collect all Laplace.namechange to here???
165 if (!mi
.infincludes
.isEmpty()) {
166 Iterator
<String
> it
= mi
.infincludes
.iterator();
167 String tempincludename
= null;
168 while (it
.hasNext()) {
169 tempincludename
= it
.next();
170 if (tempincludename
.contains("..")) {
171 Matcher mtr
= Common
.PTNSEPARATER
.matcher(tempincludename
);
172 if (mtr
.find() && !mtr
.group(2).matches(".")) {
173 Common
.oneLevelDirCopy(mi
.modulepath
.replaceAll(Common
.STRSEPARATER
, "$1") + File
.separator
+ mtr
.group(2), mi
.temppath
, ".h");
175 Common
.oneLevelDirCopy(mi
.modulepath
.replaceAll(Common
.STRSEPARATER
, "$1"), mi
.temppath
, ".h");
180 if (!mi
.infsources
.isEmpty()) {
181 Iterator
<String
> it
= mi
.infsources
.iterator();
182 String tempsourcename
= null;
183 while (it
.hasNext()) {
184 tempsourcename
= it
.next();
185 if (tempsourcename
.contains("..")) {
186 Common
.ensureDir(mi
.temppath
+ File
.separator
+ "MT_Parent_Sources");
187 Matcher mtr
= Common
.PTNSEPARATER
.matcher(tempsourcename
);
189 Common
.fileCopy(mi
.modulepath
.replaceAll(Common
.STRSEPARATER
, "$1") + File
.separator
+ mtr
.group(2), mi
.temppath
+ File
.separator
+ "MT_Parent_Sources" + File
.separator
+ mtr
.group(2));
195 Common
.toDoAll(mi
.temppath
, this, Common
.FILE
);
197 parsePreProcessedSourceCode();
201 private final void parsePreProcessedSourceCode() throws Exception
{
202 BufferedReader rd
= null;
207 Iterator
<String
> ii
= mi
.localmodulesources
.iterator();
208 while (ii
.hasNext()) {
210 if (temp
.contains(".c") || temp
.contains(".dxs")) {
211 mi
.preprocessedccodes
.add(temp
);
215 ii
= mi
.preprocessedccodes
.iterator();
217 Pattern patefifuncc
= Pattern
.compile("g?(BS|RT)\\s*->\\s*([a-zA-Z_]\\w*)",Pattern
.MULTILINE
);
221 Matcher matenclosereplace
;
225 while (ii
.hasNext()) {
226 StringBuffer wholefile
= new StringBuffer();
228 rd
= new BufferedReader(new FileReader(mi
.temppath
+ File
.separator
+ ifile
));
229 while ((line
= rd
.readLine()) != null) {
230 wholefile
.append(line
+ '\n');
232 line
= wholefile
.toString();
235 matguid
= Guid
.ptnguid
.matcher(line
); // several ways to implement this , which one is faster ? :
236 while (matguid
.find()) { // 1.currently , find once , then call to identify which is it
237 if ((temp
= Guid
.register(matguid
, mi
, MigrationTool
.db
)) != null) { // 2.use 3 different matchers , search 3 times to find each
238 //matguid.appendReplacement(result, MigrationTool.db.getR9Guidname(temp)); // search the database for all 3 kinds of guids , high cost
241 //matguid.appendTail(result);
242 //line = result.toString();
244 // find EFI call in form of '->' , many 'gUnicodeCollationInterface->' like things are not changed
245 // This item is not simply replaced , special operation is required.
246 matefifuncc
= patefifuncc
.matcher(line
);
247 while (matefifuncc
.find()) {
248 mi
.hashEFIcall
.add(matefifuncc
.group(2));
251 // find function call
252 matfuncc
= Func
.ptnfuncc
.matcher(line
);
253 while (matfuncc
.find()) {
254 if ((temp
= Func
.register(matfuncc
, mi
, MigrationTool
.db
)) != null) {
255 //MigrationTool.ui.println(ifile + " dofunc " + temp);
256 //matfuncc.appendReplacement(result, MigrationTool.db.getR9Func(temp));
259 //matfuncc.appendTail(result);
260 //line = result.toString();
263 matmacro
= Macro
.ptntmacro
.matcher(line
);
264 while (matmacro
.find()) {
265 if ((temp
= Macro
.register(matmacro
, mi
, MigrationTool
.db
)) != null) {
269 // find function definition
270 // replace all {} to @
271 while ((matenclosereplace
= Func
.ptnbrace
.matcher(line
)).find()) {
272 line
= matenclosereplace
.replaceAll("@");
275 matfuncd
= Func
.ptnfuncd
.matcher(line
);
276 while (matfuncd
.find()) {
277 if ((temp
= Func
.register(matfuncd
, mi
, MigrationTool
.db
)) != null) {
283 Iterator
<String
> funcci
= mi
.hashfuncc
.iterator();
284 while (funcci
.hasNext()) {
285 if (!mi
.hashfuncd
.contains(temp
= funcci
.next()) && !mi
.hashEFIcall
.contains(temp
)) {
286 mi
.hashnonlocalfunc
.add(temp
); // this set contains both changed and not changed items
291 public class CommentLaplace
extends Common
.Laplace
{
292 public String
operation(String wholeline
) {
293 StringBuffer wholebuffer
= new StringBuffer();
294 String templine
= null;
295 Pattern ptnincludefile
= Pattern
.compile("[\"<](.*[.]h)[\">]");
296 Pattern ptninclude
= Pattern
.compile("#include\\s*(.*)");
297 Matcher mtrinclude
= ptninclude
.matcher(wholeline
);
298 Matcher mtrincludefile
= null;
299 while (mtrinclude
.find()) {
300 mtrincludefile
= ptnincludefile
.matcher(mtrinclude
.group(1));
301 if (mtrincludefile
.find() && mi
.localmodulesources
.contains(mtrincludefile
.group(1))) {
302 templine
= mtrinclude
.group();
304 templine
= MigrationTool
.MIGRATIONCOMMENT
+ mtrinclude
.group();
306 mtrinclude
.appendReplacement(wholebuffer
, templine
);
308 mtrinclude
.appendTail(wholebuffer
);
309 return wholebuffer
.toString();
312 public boolean recognize(String filename
) {
313 return filename
.contains(".c") || filename
.contains(".h") || filename
.contains(".dxs");
316 public String
namechange(String oldname
) {
321 //-----------------------------------ForDoAll-----------------------------------//
322 public void run(String filepath
) throws Exception
{
323 String name
= mi
.temppath
+ File
.separator
+ filepath
.replace(mi
.temppath
+ File
.separator
, "");
324 if (commentlaplace
.recognize(name
)) {
325 commentlaplace
.transform(name
, name
);
329 public boolean filter(File dir
) {
332 //-----------------------------------ForDoAll-----------------------------------//
334 public final void setModuleInfo(ModuleInfo m
) {
338 public static final void aimAt(ModuleInfo mi
) throws Exception
{
339 modulereader
.setModuleInfo(mi
);
340 modulereader
.ModuleScan();