From d7321b5b0d38c575e54c770f7aa18dacbacab3c8 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 27 Jul 2014 22:33:21 -0400 Subject: added identifier renaming capability copied some code over from M3L to handle the heavy bytecode magic. It's ok... M3L will eventually depend on Enigma. Completely restructured the mappings though. This way is better. =) --- src/cuchaz/enigma/mapping/SignatureUpdater.java | 87 +++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/cuchaz/enigma/mapping/SignatureUpdater.java (limited to 'src/cuchaz/enigma/mapping/SignatureUpdater.java') diff --git a/src/cuchaz/enigma/mapping/SignatureUpdater.java b/src/cuchaz/enigma/mapping/SignatureUpdater.java new file mode 100644 index 0000000..4c0dbac --- /dev/null +++ b/src/cuchaz/enigma/mapping/SignatureUpdater.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright (c) 2014 Jeff Martin. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Jeff Martin - initial API and implementation + ******************************************************************************/ +package cuchaz.enigma.mapping; + +import java.io.IOException; +import java.io.StringReader; + +public class SignatureUpdater +{ + public interface ClassNameUpdater + { + String update( String className ); + } + + public static String update( String signature, ClassNameUpdater updater ) + { + try + { + StringBuilder buf = new StringBuilder(); + + // read the signature character-by-character + StringReader reader = new StringReader( signature ); + int i = -1; + while( ( i = reader.read() ) != -1 ) + { + char c = (char)i; + + // does this character start a class name? + if( c == 'L' ) + { + // update the class name and add it to the buffer + buf.append( 'L' ); + String className = readClass( reader ); + if( className == null ) + { + throw new IllegalArgumentException( "Malformed signature: " + signature ); + } + buf.append( updater.update( className ) ); + buf.append( ';' ); + } + else + { + // copy the character into the buffer + buf.append( c ); + } + } + + return buf.toString(); + } + catch( IOException ex ) + { + // I'm pretty sure a StringReader will never throw one of these + throw new Error( ex ); + } + } + + private static String readClass( StringReader reader ) + throws IOException + { + // read all the characters in the buffer until we hit a ';' + StringBuilder buf = new StringBuilder(); + int i = -1; + while( ( i = reader.read() ) != -1 ) + { + char c = (char)i; + + if( c == ';' ) + { + return buf.toString(); + } + else + { + buf.append( c ); + } + } + + return null; + } +} -- cgit v1.2.3