package immibis.bon.mcp; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.*; public class ExcFile { public Map<String, String[]> exceptions = new HashMap<String, String[]>(); private static String[] EMPTY_STRING_ARRAY = new String[0]; // returns internal names, can return null // input uses SRG names public String[] getExceptionClasses(String clazz, String func, String desc) { String[] r = exceptions.get(clazz + "/" + func + desc); if(r == null) return EMPTY_STRING_ARRAY; return r; } private ExcFile() {} public static ExcFile read(InputStream in) throws IOException { return read(new InputStreamReader(in, StandardCharsets.UTF_8)); } /** Does not close <var>r</var>. */ public static ExcFile read(Reader r) throws IOException { //example line: //net/minecraft/src/NetClientHandler.<init>(Lnet/minecraft/client/Minecraft;Ljava/lang/String;I)V=java/net/UnknownHostException,java/io/IOException|p_i42_1_,p_i42_2_,p_i42_3_ ExcFile rv = new ExcFile(); @SuppressWarnings("resource") Scanner in = new Scanner(r); while(in.hasNextLine()) { String line = in.nextLine(); if(line.startsWith("#")) continue; if(line.contains("-Access=")) continue; if(line.contains("=CL_")) continue; int i = line.indexOf('.'); if(i < 0) continue; String clazz = line.substring(0, i); line = line.substring(i+1); i = line.indexOf('('); String func = line.substring(0, i); line = line.substring(i+1); i = line.indexOf('='); String desc = line.substring(0, i); line = line.substring(i+1); i = line.indexOf('|'); String excs = line.substring(0, i); line = line.substring(i+1); if(excs.contains("CL_")) throw new RuntimeException(excs); rv.exceptions.put(clazz + "/" + func + desc, excs.split(",")); } return rv; } @Deprecated public ExcFile(File f) throws IOException { try (FileReader fr = new FileReader(f)) { exceptions = read(fr).exceptions; } } }