package cuchaz.enigma.convert; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Collection; import java.util.List; import com.beust.jcommander.internal.Lists; import cuchaz.enigma.mapping.ClassEntry; import cuchaz.enigma.mapping.Entry; import cuchaz.enigma.mapping.EntryFactory; import cuchaz.enigma.mapping.FieldEntry; import cuchaz.enigma.mapping.Type; public class MatchesReader { public static ClassMatches readClasses(File file) throws IOException { try (BufferedReader in = new BufferedReader(new FileReader(file))) { ClassMatches matches = new ClassMatches(); String line = null; while ((line = in.readLine()) != null) { matches.add(readClassMatch(line)); } return matches; } } private static ClassMatch readClassMatch(String line) throws IOException { String[] sides = line.split(":", 2); return new ClassMatch(readClasses(sides[0]), readClasses(sides[1])); } private static Collection readClasses(String in) { List entries = Lists.newArrayList(); for (String className : in.split(",")) { className = className.trim(); if (className.length() > 0) { entries.add(new ClassEntry(className)); } } return entries; } public static MemberMatches readMembers(File file) throws IOException { try (BufferedReader in = new BufferedReader(new FileReader(file))) { MemberMatches matches = new MemberMatches(); String line = null; while ((line = in.readLine()) != null) { readMemberMatch(matches, line); } return matches; } } private static void readMemberMatch(MemberMatches matches, String line) { if (line.startsWith("!")) { T source = readEntry(line.substring(1)); matches.addUnmatchableSourceEntry(source); } else { String[] parts = line.split(":", 2); T source = readEntry(parts[0]); T dest = readEntry(parts[1]); if (source != null && dest != null) { matches.addMatch(source, dest); } else if (source != null) { matches.addUnmatchedSourceEntry(source); } else if (dest != null) { matches.addUnmatchedDestEntry(dest); } } } @SuppressWarnings("unchecked") private static T readEntry(String in) { if (in.length() <= 0) { return null; } String[] parts = in.split(" "); if (parts.length == 3 && parts[2].indexOf('(') < 0) { return (T)new FieldEntry( new ClassEntry(parts[0]), parts[1], new Type(parts[2]) ); } else { assert(parts.length == 2 || parts.length == 3); if (parts.length == 2) { return (T)EntryFactory.getBehaviorEntry(parts[0], parts[1]); } else if (parts.length == 3) { return (T)EntryFactory.getBehaviorEntry(parts[0], parts[1], parts[2]); } else { throw new Error("Malformed behavior entry: " + in); } } } }