bug fix in blockInitializers (now uses StructuredBlocks) Makefile optimized git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@1217 379699f6-c40d-0410-875b-85095c16579ebranch_1_1
parent
c24a2b7133
commit
9ce95e120a
@ -0,0 +1,193 @@ |
|||||||
|
/* Decompiler Copyright (C) 2000 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
|
||||||
|
package jode.decompiler; |
||||||
|
import jode.GlobalOptions; |
||||||
|
import jode.bytecode.SearchPath; |
||||||
|
import jode.bytecode.ClassInfo; |
||||||
|
import java.io.File; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.io.Writer; |
||||||
|
import java.io.BufferedWriter; |
||||||
|
|
||||||
|
/** |
||||||
|
* This is the interface that other java classes may use to decompile |
||||||
|
* classes. Feel free to use it in your own GNU GPL'ed project. |
||||||
|
* Please tell me about your project.<br> |
||||||
|
* |
||||||
|
* Note that the GNU GPL doesn't allow you to use this interface in |
||||||
|
* commercial programs. |
||||||
|
* |
||||||
|
* @author <a href="mailto:jochen@gnu.org">Jochen Hoenicke</a> |
||||||
|
* @version 1.0 |
||||||
|
*/ |
||||||
|
public class Decompiler { |
||||||
|
private SearchPath searchPath = null; |
||||||
|
private int importPackageLimit = ImportHandler.DEFAULT_PACKAGE_LIMIT; |
||||||
|
private int importClassLimit = ImportHandler.DEFAULT_CLASS_LIMIT; |
||||||
|
|
||||||
|
/** |
||||||
|
* We need a different pathSeparatorChar, since ':' (used for most |
||||||
|
* UNIX System) is used a protocol separator in URLs. |
||||||
|
* |
||||||
|
* We currently allow both pathSeparatorChar and |
||||||
|
* altPathSeparatorChar and decide if it is a protocol separator |
||||||
|
* by context. |
||||||
|
*/ |
||||||
|
public static final char altPathSeparatorChar |
||||||
|
= SearchPath.altPathSeparatorChar; |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new decompiler. |
||||||
|
*/ |
||||||
|
public Decompiler() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the class path. Should be called once before decompile is |
||||||
|
* called, otherwise the system class path is used. |
||||||
|
* @param classpath A comma separated classpath. |
||||||
|
* @exception NullPointerException if classpath is null. |
||||||
|
* @see #setClassPath(String[]) |
||||||
|
*/ |
||||||
|
public void setClassPath(String classpath) { |
||||||
|
searchPath = new SearchPath(classpath); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the class path. Should be called once before decompile is |
||||||
|
* called, otherwise the system class path is used. |
||||||
|
* @param classpath a non empty array of jar files and directories; |
||||||
|
* URLs are allowed, too. |
||||||
|
* @exception NullPointerException if classpath is null. |
||||||
|
* @exception IndexOutOfBoundsException if classpath array is empty. |
||||||
|
* @see #setClassPath(String) |
||||||
|
*/ |
||||||
|
public void setClassPath(String[] classpath) { |
||||||
|
StringBuffer sb = new StringBuffer(classpath[0]); |
||||||
|
for (int i = 1; i < classpath.length; i++) |
||||||
|
sb.append(altPathSeparatorChar).append(classpath[i]); |
||||||
|
searchPath = new SearchPath(sb.toString()); |
||||||
|
} |
||||||
|
|
||||||
|
private static final String[] optionStrings = { |
||||||
|
"lvt", "inner", "anonymous", "push", "pretty", "decrypt", |
||||||
|
"onetime", "immediate", "verify", "contrafo" |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Set an option. |
||||||
|
* @param option the option (pretty, style, decrypt, verify, etc.) |
||||||
|
* @param value ("1"/"0" for on/off, "sun"/"gnu" for style) |
||||||
|
* @exception IllegalArgumentException if option or value is invalid. |
||||||
|
*/ |
||||||
|
public void setOption(String option, String value) { |
||||||
|
if (option.equals("style")) { |
||||||
|
if (value.equals("gnu")) |
||||||
|
Options.outputStyle = Options.GNU_STYLE; |
||||||
|
else if (value.equals("sun")) |
||||||
|
Options.outputStyle = Options.SUN_STYLE; |
||||||
|
else |
||||||
|
throw new IllegalArgumentException("Invalid style "+value); |
||||||
|
return; |
||||||
|
} |
||||||
|
if (option.equals("import")) { |
||||||
|
int comma = value.indexOf(','); |
||||||
|
int packLimit = Integer.parseInt(value.substring(0, comma)); |
||||||
|
if (packLimit == 0) |
||||||
|
packLimit = Integer.MAX_VALUE; |
||||||
|
int clazzLimit = Integer.parseInt(value.substring(comma+1)); |
||||||
|
if (clazzLimit == 0) |
||||||
|
clazzLimit = Integer.MAX_VALUE; |
||||||
|
if (clazzLimit < 0 || packLimit < 0) |
||||||
|
throw new IllegalArgumentException |
||||||
|
("Option import doesn't allow negative parameters"); |
||||||
|
importPackageLimit = packLimit; |
||||||
|
importClassLimit = clazzLimit; |
||||||
|
return; |
||||||
|
} |
||||||
|
if (option.equals("verbose")) { |
||||||
|
GlobalOptions.verboseLevel = Integer.parseInt(value); |
||||||
|
return; |
||||||
|
} |
||||||
|
for (int i=0; i < optionStrings.length; i++) { |
||||||
|
if (option.equals(optionStrings[i])) { |
||||||
|
if (value.equals("0") |
||||||
|
|| value.equals("off") |
||||||
|
|| value.equals("no")) |
||||||
|
Options.options &= ~(1 << i); |
||||||
|
else if (value.equals("1") |
||||||
|
|| value.equals("on") |
||||||
|
|| value.equals("yes")) |
||||||
|
Options.options &= ~(1 << i); |
||||||
|
else |
||||||
|
throw new IllegalArgumentException("Illegal value for "+ |
||||||
|
option); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
throw new IllegalArgumentException("Illegal option: "+option); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set the stream where copyright and warnings/errors are printed |
||||||
|
* to. |
||||||
|
* @param errorStream the error stream. Note that this is a |
||||||
|
* PrintWriter, not a PrintStream (which are deprecated since 1.1). |
||||||
|
*/ |
||||||
|
public void setErr(PrintWriter errorStream) { |
||||||
|
GlobalOptions.err = errorStream; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Decompile a class. |
||||||
|
* @param className full-qualified classname, dot separated, e.g. |
||||||
|
* "java.lang.Object" |
||||||
|
* @param writer The stream where the decompiled code should be |
||||||
|
* written. Hint: Use a BufferedWriter for good performance. |
||||||
|
* @param progress A progress listener (see below). Null if you |
||||||
|
* don't need information about progress. |
||||||
|
* @exception IllegalArgumentException if className isn't correct. |
||||||
|
* @exception jode.jvm.VerifyException The code |
||||||
|
* isn't valid or a dependent class, needed for type |
||||||
|
* guessing, couldn't be found. |
||||||
|
* @exception IOException if writer throws an exception. |
||||||
|
* @exception RuntimeException If jode has a bug ;-) |
||||||
|
*/ |
||||||
|
public void decompile(String className, Writer writer, |
||||||
|
ProgressListener progress) |
||||||
|
throws java.io.IOException { |
||||||
|
if (searchPath == null) { |
||||||
|
String classPath = System.getProperty("java.class.path") |
||||||
|
.replace(File.pathSeparatorChar, altPathSeparatorChar); |
||||||
|
searchPath = new SearchPath(classPath); |
||||||
|
} |
||||||
|
|
||||||
|
ClassInfo.setClassPath(searchPath); |
||||||
|
ClassInfo clazz = ClassInfo.forName(className); |
||||||
|
ImportHandler imports = new ImportHandler(importPackageLimit, |
||||||
|
importClassLimit); |
||||||
|
TabbedPrintWriter tabbedWriter = |
||||||
|
new TabbedPrintWriter(writer, imports, false); |
||||||
|
ClassAnalyzer clazzAna = new ClassAnalyzer(null, clazz, imports); |
||||||
|
clazzAna.dumpJavaFile(tabbedWriter, progress); |
||||||
|
writer.flush(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
/* ProgressListener Copyright (C) 2000 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
|
||||||
|
package jode.decompiler; |
||||||
|
import jode.GlobalOptions; |
||||||
|
import jode.bytecode.SearchPath; |
||||||
|
import jode.bytecode.ClassInfo; |
||||||
|
import java.io.File; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.io.Writer; |
||||||
|
import java.io.BufferedWriter; |
||||||
|
|
||||||
|
/** |
||||||
|
* This interface is used by jode to tell about its progress. You |
||||||
|
* supply an instance of this interface to the |
||||||
|
* {@link Decompiler.decompile} method.<br> |
||||||
|
* |
||||||
|
* @author <a href="mailto:jochen@gnu.org">Jochen Hoenicke</a> |
||||||
|
* @version 1.0 */ |
||||||
|
public interface ProgressListener { |
||||||
|
/** |
||||||
|
* Gets called when jode makes some progress. |
||||||
|
* @param progress A number between 0.0 and 1.0 |
||||||
|
* @param detail |
||||||
|
* The name of the currently decompiled method or class. |
||||||
|
*/ |
||||||
|
public void updateProgress(double progress, String detail); |
||||||
|
} |
Loading…
Reference in new issue