blob: d6ba3740a004467bb77dda266232bd29533209e8 [file] [log] [blame]
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.dx.command.dump;
import com.android.dx.cf.iface.ParseException;
import com.android.dx.util.FileUtils;
import com.android.dx.util.HexParser;
import java.io.UnsupportedEncodingException;
/**
* Main class for the class file dumper.
*/
public class Main {
static Args parsedArgs = new Args();
/**
* This class is uninstantiable.
*/
private Main() {
// This space intentionally left blank.
}
/**
* Run!
*/
public static void main(String[] args) {
int at = 0;
for (/*at*/; at < args.length; at++) {
String arg = args[at];
if (arg.equals("--") || !arg.startsWith("--")) {
break;
} else if (arg.equals("--bytes")) {
parsedArgs.rawBytes = true;
} else if (arg.equals("--basic-blocks")) {
parsedArgs.basicBlocks = true;
} else if (arg.equals("--rop-blocks")) {
parsedArgs.ropBlocks = true;
} else if (arg.equals("--optimize")) {
parsedArgs.optimize = true;
} else if (arg.equals("--ssa-blocks")) {
parsedArgs.ssaBlocks = true;
} else if (arg.startsWith("--ssa-step=")) {
parsedArgs.ssaStep = arg.substring(arg.indexOf('=') + 1);
} else if (arg.equals("--debug")) {
parsedArgs.debug = true;
} else if (arg.equals("--dot")) {
parsedArgs.dotDump = true;
} else if (arg.equals("--strict")) {
parsedArgs.strictParse = true;
} else if (arg.startsWith("--width=")) {
arg = arg.substring(arg.indexOf('=') + 1);
parsedArgs.width = Integer.parseInt(arg);
} else if (arg.startsWith("--method=")) {
arg = arg.substring(arg.indexOf('=') + 1);
parsedArgs.method = arg;
} else {
System.err.println("unknown option: " + arg);
throw new RuntimeException("usage");
}
}
if (at == args.length) {
System.err.println("no input files specified");
throw new RuntimeException("usage");
}
for (/*at*/; at < args.length; at++) {
try {
String name = args[at];
System.out.println("reading " + name + "...");
byte[] bytes = FileUtils.readFile(name);
if (!name.endsWith(".class")) {
String src;
try {
src = new String(bytes, "utf-8");
} catch (UnsupportedEncodingException ex) {
throw new RuntimeException("shouldn't happen", ex);
}
bytes = HexParser.parse(src);
}
processOne(name, bytes);
} catch (ParseException ex) {
System.err.println("\ntrouble parsing:");
if (parsedArgs.debug) {
ex.printStackTrace();
} else {
ex.printContext(System.err);
}
}
}
}
/**
* Processes one file.
*
* @param name {@code non-null;} name of the file
* @param bytes {@code non-null;} contents of the file
*/
private static void processOne(String name, byte[] bytes) {
if (parsedArgs.dotDump) {
DotDumper.dump(bytes, name, parsedArgs);
} else if (parsedArgs.basicBlocks) {
BlockDumper.dump(bytes, System.out, name, false, parsedArgs);
} else if (parsedArgs.ropBlocks) {
BlockDumper.dump(bytes, System.out, name, true, parsedArgs);
} else if (parsedArgs.ssaBlocks) {
// --optimize ignored with --ssa-blocks
parsedArgs.optimize = false;
SsaDumper.dump(bytes, System.out, name, parsedArgs);
} else {
ClassDumper.dump(bytes, System.out, name, parsedArgs);
}
}
}