package handling; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Properties; import tools.HexTool; public class ExternalCodeTableGetter { final Properties props; public ExternalCodeTableGetter(Properties properties) { this.props = properties; } private final static <T extends Enum<? extends WritableIntValueHolder> & WritableIntValueHolder> T valueOf(final String name, T[] values) { for (T val : values) { if (val.name().equals(name)) { return val; } } return null; } private final <T extends Enum<? extends WritableIntValueHolder> & WritableIntValueHolder> byte getValue(final String name, T[] values, final byte def) { String prop = this.props.getProperty(name); if ((prop != null) && (prop.length() > 0)) { String trimmed = prop.trim(); String[] args = trimmed.split(" "); int base = 0; String offset; if (args.length == 2) { base = ((WritableIntValueHolder) valueOf(args[0], values)).getValue(); if (base == def) { base = getValue(args[0], values, def); } offset = args[1]; } else { offset = args[0]; } if ((offset.length() > 2) && (offset.substring(0, 2).equals("0x"))) { return (byte) (Short.parseShort(offset.substring(2), 16) + base); } return (byte) (Short.parseShort(offset) + base); } return def; } public final static <T extends Enum<? extends WritableIntValueHolder> & WritableIntValueHolder> String getOpcodeTable(T[] enumeration) { StringBuilder enumVals = new StringBuilder(); List<T> all = new ArrayList<>(); all.addAll(Arrays.asList(enumeration)); Collections.sort(all, new Comparator<WritableIntValueHolder>() { @Override public int compare(WritableIntValueHolder o1, WritableIntValueHolder o2) { return Byte.valueOf(o1.getValue()).compareTo(o2.getValue()); } }); for (Enum code : all) { enumVals.append(code.name()); enumVals.append(" = "); enumVals.append("0x"); enumVals.append(HexTool.toString(((WritableIntValueHolder) code).getValue())); enumVals.append(" ("); enumVals.append(((WritableIntValueHolder) code).getValue()); enumVals.append(")\n"); } return enumVals.toString(); } public final static <T extends Enum<? extends WritableIntValueHolder> & WritableIntValueHolder> void populateValues(Properties properties, T[] values) { ExternalCodeTableGetter exc = new ExternalCodeTableGetter(properties); for (Enum code : values) { ((WritableIntValueHolder) code).setValue(exc.getValue(code.name(), values, (byte) -1)); } } }