package bytecode;
import immibis.bon.ClassCollection;
import immibis.bon.Mapping;
import immibis.bon.NameSet;
import immibis.bon.ReferenceDataCollection;
import immibis.bon.Remapper;
import immibis.bon.SimpleNameSet;
import immibis.bon.io.JarLoader;
import immibis.bon.io.JarWriter;
import installer.ProgressDialog;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Collections;
import java.util.Scanner;
public class ApplySRG {
public static void main(String[] args) {
if(args.length != 3) {
System.err.println("Usage: java ApplySRG srgfile infile outfile");
System.exit(1);
}
try {
apply(new FileReader(args[0]), new File(args[1]), new File(args[2]), null);
} catch(Throwable t) {
t.printStackTrace();
System.exit(1);
}
}
public static void apply(Reader srg, File infile, File outfile, final ProgressDialog dlg) throws Exception {
NameSet inputNS = new SimpleNameSet("IN");
NameSet outputNS = new SimpleNameSet("OUT");
Mapping m = new Mapping(inputNS, outputNS);
try (Scanner s = new Scanner(srg)) {
while(s.hasNextLine()) {
String line = s.nextLine();
String[] parts = line.split(" ");
switch(parts[0]) {
case "PK:": break;
case "CL:":
m.setClass(parts[1], parts[2]);
break;
case "FD:":
m.setField(parts[1].substring(0, parts[1].lastIndexOf('/')), getLastPart(parts[1]), getLastPart(parts[2]));
break;
case "MD:":
m.setMethod(parts[1].substring(0, parts[1].lastIndexOf('/')), getLastPart(parts[1]), parts[2], getLastPart(parts[3]));
break;
default: throw new Exception("Unknown SRG line start: "+line);
}
}
}
ClassCollection cc = JarLoader.loadClassesFromJar(inputNS, infile, null);
cc = Remapper.remap(cc, m, Collections.<ReferenceDataCollection>emptyList(), dlg);
JarWriter.write(outfile, cc, null);
}
private static String getLastPart(String string) {
if(string.contains("/"))
return string.substring(string.lastIndexOf('/')+1);
return string;
}
}