diff --git a/utils/javapp/src/fpc/tools/javapp/ClassData.java b/utils/javapp/src/fpc/tools/javapp/ClassData.java index 3278a2f539..8260d8b9ac 100644 --- a/utils/javapp/src/fpc/tools/javapp/ClassData.java +++ b/utils/javapp/src/fpc/tools/javapp/ClassData.java @@ -64,11 +64,13 @@ public class ClassData implements RuntimeConstants { private Hashtable indexHashAscii = new Hashtable(); private String pkgPrefix=""; private int pkgPrefixLen=0; + protected JavapEnvironment env; /** * Read classfile to disassemble. */ - public ClassData(InputStream infile){ + public ClassData(JavapEnvironment env, InputStream infile){ + this.env = env; try{ this.read(new DataInputStream(infile)); }catch (FileNotFoundException ee) { @@ -214,7 +216,7 @@ public class ClassData implements RuntimeConstants { int fields_count = in.readUnsignedShort(); fields=new FieldData[fields_count]; for (int k = 0; k < fields_count; k++) { - FieldData field=new FieldData(this); + FieldData field=new FieldData(env,this); field.read(in); fields[k]=field; } @@ -227,7 +229,7 @@ public class ClassData implements RuntimeConstants { int methods_count = in.readUnsignedShort(); methods=new MethodData[methods_count]; for (int k = 0; k < methods_count ; k++) { - MethodData method=new MethodData(this); + MethodData method=new MethodData(env,this); method.read(in); methods[k]=method; } diff --git a/utils/javapp/src/fpc/tools/javapp/FieldData.java b/utils/javapp/src/fpc/tools/javapp/FieldData.java index 4d85218d95..a28fd6abb0 100644 --- a/utils/javapp/src/fpc/tools/javapp/FieldData.java +++ b/utils/javapp/src/fpc/tools/javapp/FieldData.java @@ -49,8 +49,10 @@ public class FieldData implements RuntimeConstants { boolean isSynthetic=false; boolean isDeprecated=false; Vector attrs; + protected JavapEnvironment env; - public FieldData(ClassData cls){ + public FieldData(JavapEnvironment env, ClassData cls){ + this.env=env; this.cls=cls; } diff --git a/utils/javapp/src/fpc/tools/javapp/JavapEnvironment.java b/utils/javapp/src/fpc/tools/javapp/JavapEnvironment.java index 20b03534d2..e2cd2a8188 100644 --- a/utils/javapp/src/fpc/tools/javapp/JavapEnvironment.java +++ b/utils/javapp/src/fpc/tools/javapp/JavapEnvironment.java @@ -76,6 +76,9 @@ public class JavapEnvironment { String outputName = "java"; ArrayList excludePrefixes; ArrayList skelPrefixes; + String prefix_constant = ""; + String prefix_field = "f"; + String prefix_innerclass = "Inner"; public JavapEnvironment() { excludePrefixes = new ArrayList(); diff --git a/utils/javapp/src/fpc/tools/javapp/JavapPrinter.java b/utils/javapp/src/fpc/tools/javapp/JavapPrinter.java index 2351fd552c..07c8eb3f08 100644 --- a/utils/javapp/src/fpc/tools/javapp/JavapPrinter.java +++ b/utils/javapp/src/fpc/tools/javapp/JavapPrinter.java @@ -244,7 +244,7 @@ public class JavapPrinter { // print field attribute information. printFieldAttributes(field); if (!field.isFormalConst()) { - out.print("; external name '"+fieldName.substring(1)+"'"); + out.print("; external name '"+fieldName.substring(env.prefix_field.length())+"'"); } out.println(";"); } @@ -853,7 +853,7 @@ public class JavapPrinter { for (int i = 0; i < innerClassPrinters.size(); i++) { JavapPrinter innerPrinter = innerClassPrinters.get(i); if (checkInnerVisibility(innerPrinter.cls.access,protpub)) { - String shortInnerName = PascalClassData.getShortClassName(innerPrinter.cls.getClassName()); + String shortInnerName = PascalClassData.getShortClassName(env,innerPrinter.cls.getClassName()); String shortInnerSafeName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),shortInnerName); if (first) { if (!cls.isInterface()) { diff --git a/utils/javapp/src/fpc/tools/javapp/Main.java b/utils/javapp/src/fpc/tools/javapp/Main.java index 67c24ee692..3fdb9512ac 100644 --- a/utils/javapp/src/fpc/tools/javapp/Main.java +++ b/utils/javapp/src/fpc/tools/javapp/Main.java @@ -105,6 +105,9 @@ public class Main{ out.println(" -public Print only public classes and members"); out.println(" -protected Print protected/public classes and members"); out.println(" -private Show all classes and members"); + out.println(" -prefix_constants Prefix constant names with (default: )"); + out.println(" -prefix_fields Prefix field names with (default: f)"); + out.println(" -prefix_innerclasses Prefix inner class names with (default: Inner)"); out.println(" -x Treat this class/package as defined in another unit (suffix package names with '.'"); out.println(" -s Print internal type signatures"); out.println(" -bootclasspath Override location of class files loaded"); @@ -200,6 +203,30 @@ public class Main{ } } else if (arg.equals("-all")) { env.showallAttr = true; + } else if (arg.equals("-prefix_constants")) { + if ((i + 1) < argv.length) { + env.prefix_constant = argv[++i]; + } else { + error("-prefix_constants requires argument"); + usage(); + return false; + } + } else if (arg.equals("-prefix_fields")) { + if ((i + 1) < argv.length) { + env.prefix_field = argv[++i]; + } else { + error("-prefix_fields requires argument"); + usage(); + return false; + } + } else if (arg.equals("-prefix_innerclasses")) { + if ((i + 1) < argv.length) { + env.prefix_innerclass = argv[++i]; + } else { + error("-prefix_innerclasses requires argument"); + usage(); + return false; + } } else { error("invalid flag: " + arg); usage(); diff --git a/utils/javapp/src/fpc/tools/javapp/MethodData.java b/utils/javapp/src/fpc/tools/javapp/MethodData.java index 689e856ef0..0fedb9ea7d 100644 --- a/utils/javapp/src/fpc/tools/javapp/MethodData.java +++ b/utils/javapp/src/fpc/tools/javapp/MethodData.java @@ -62,7 +62,10 @@ public class MethodData { boolean isSynthetic=false; boolean isDeprecated=false; - public MethodData(ClassData cls){ + protected JavapEnvironment env; + + public MethodData(JavapEnvironment env, ClassData cls){ + this.env=env; this.cls=cls; } diff --git a/utils/javapp/src/fpc/tools/javapp/PascalClassData.java b/utils/javapp/src/fpc/tools/javapp/PascalClassData.java index 7a1ec2270f..1f62d79d50 100644 --- a/utils/javapp/src/fpc/tools/javapp/PascalClassData.java +++ b/utils/javapp/src/fpc/tools/javapp/PascalClassData.java @@ -8,9 +8,10 @@ import java.util.HashSet; import java.util.StringTokenizer; import java.util.Vector; +import fpc.tools.javapp.JavapEnvironment; + public class PascalClassData extends ClassData { - private JavapEnvironment env; public PascalClassData outerClass; private HashSet nestedDependencies; boolean setOuterDependencies; @@ -22,10 +23,9 @@ public class PascalClassData extends ClassData { public PascalClassData(InputStream infile, PascalClassData outerClass, JavapEnvironment env, boolean doCollectDependencies) { - super (infile); + super (env,infile); this.outerClass = outerClass; this.nestedDependencies = new HashSet(); - this.env = env; ClassIdentifierInfo.registerClassInfo(getClassName(),getSuperClassName(),getSuperInterfaces()); if (doCollectDependencies) { collectDependencies(); @@ -127,12 +127,12 @@ public class PascalClassData extends ClassData { return outerClass != null; } - public static String getShortClassName(String className) { + public static String getShortClassName(JavapEnvironment env, String className) { int index; className = className.replace('-', '_'); if (isInnerClass(className)) { index=className.lastIndexOf("$")+1; - return "Inner"+className.substring(index); + return env.prefix_innerclass+className.substring(index); } else className = className.replace("$","__"); @@ -240,7 +240,7 @@ public class PascalClassData extends ClassData { } public String getShortClassName() { - return getShortClassName(getClassName()); + return getShortClassName(env,getClassName()); } public String getShortPascalClassName() { @@ -305,7 +305,7 @@ public class PascalClassData extends ClassData { int fields_count = in.readUnsignedShort(); fields=new FieldData[fields_count]; for (int k = 0; k < fields_count; k++) { - FieldData field=new PascalFieldData(this); + FieldData field=new PascalFieldData(env,this); field.read(in); fields[k]=field; } @@ -319,7 +319,7 @@ public class PascalClassData extends ClassData { int methods_count = in.readUnsignedShort(); methods=new PascalMethodData[methods_count]; for (int k = 0; k < methods_count ; k++) { - MethodData method=new PascalMethodData(this); + MethodData method=new PascalMethodData(env,this); method.read(in); methods[k]=method; } diff --git a/utils/javapp/src/fpc/tools/javapp/PascalFieldData.java b/utils/javapp/src/fpc/tools/javapp/PascalFieldData.java index 0cdbb639b1..3c5b3caa89 100644 --- a/utils/javapp/src/fpc/tools/javapp/PascalFieldData.java +++ b/utils/javapp/src/fpc/tools/javapp/PascalFieldData.java @@ -8,8 +8,8 @@ public class PascalFieldData extends FieldData { private String cachedName; - public PascalFieldData(ClassData cls){ - super(cls); + public PascalFieldData(JavapEnvironment env, ClassData cls){ + super(env, cls); } public String getVisibilitySectionName(){ @@ -46,7 +46,7 @@ public class PascalFieldData extends FieldData { * Returns Pascal type signature of a field. */ public String getType(){ - return new PascalTypeSignature(getInternalSig(),cls,false,false).getFieldType(); + return new PascalTypeSignature(env,getInternalSig(),cls,false,false).getFieldType(); } /** @@ -65,7 +65,9 @@ public class PascalFieldData extends FieldData { String realName = super.getName(); // we prepend an "f" for fields to prevent name clashes if (!isFormalConst()) - realName = "f" + realName; + realName = env.prefix_field + realName; + else + realName = env.prefix_constant + realName; cachedName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),realName); } return cachedName; diff --git a/utils/javapp/src/fpc/tools/javapp/PascalMethodData.java b/utils/javapp/src/fpc/tools/javapp/PascalMethodData.java index aba664907c..73cda8ae7e 100644 --- a/utils/javapp/src/fpc/tools/javapp/PascalMethodData.java +++ b/utils/javapp/src/fpc/tools/javapp/PascalMethodData.java @@ -10,8 +10,8 @@ public class PascalMethodData extends MethodData { private String cachedName; - public PascalMethodData(ClassData cls) { - super(cls); + public PascalMethodData(JavapEnvironment env, ClassData cls) { + super(env,cls); } public String getVisibilitySectionName(){ @@ -41,7 +41,7 @@ public class PascalMethodData extends MethodData { */ public String getReturnType(){ - String rttype = (new PascalTypeSignature(getInternalSig(), cls, false, false)).getReturnType(); + String rttype = (new PascalTypeSignature(env,getInternalSig(), cls, false, false)).getReturnType(); return rttype; } @@ -61,7 +61,7 @@ public class PascalMethodData extends MethodData { * Return java type parameter signature. */ public String getParameters(boolean useOpenArrays, boolean useConstOpenArrays){ - String ptype = (new PascalTypeSignature(getInternalSig(),cls,useOpenArrays,useConstOpenArrays)).getParameters(); + String ptype = (new PascalTypeSignature(env,getInternalSig(),cls,useOpenArrays,useConstOpenArrays)).getParameters(); return ptype; } diff --git a/utils/javapp/src/fpc/tools/javapp/PascalTypeSignature.java b/utils/javapp/src/fpc/tools/javapp/PascalTypeSignature.java index 7fe76e1a9d..c44704edf3 100644 --- a/utils/javapp/src/fpc/tools/javapp/PascalTypeSignature.java +++ b/utils/javapp/src/fpc/tools/javapp/PascalTypeSignature.java @@ -10,8 +10,10 @@ public class PascalTypeSignature extends TypeSignature { // (done for constructors, under the assumption that these won't change the // incoming data) private boolean useConstOpenArrays; + private JavapEnvironment env; - public PascalTypeSignature(String JVMSignature, ClassData cls, boolean useOpenArrays, boolean useConstOpenArrays) { + public PascalTypeSignature(JavapEnvironment env, String JVMSignature, ClassData cls, boolean useOpenArrays, boolean useConstOpenArrays) { + this.env = env; this.useOpenArrays = useOpenArrays; this.useConstOpenArrays = useConstOpenArrays; init(JVMSignature); @@ -75,7 +77,7 @@ public class PascalTypeSignature extends TypeSignature { !PascalClassData.currentUnit.isExternalInnerClass(baseType)) { int index = baseType.lastIndexOf('$'); outerClass = PascalClassData.getShortPascalClassName(baseType.substring(0,index))+"."; - componentType = "Inner"+baseType.substring(index+1).replace('$', '.'); + componentType = env.prefix_innerclass+baseType.substring(index+1).replace('$', '.'); } else { outerClass = ""; componentType = PascalClassData.getShortPascalClassName(baseType); diff --git a/utils/javapp/src/fpc/tools/javapp/PascalUnit.java b/utils/javapp/src/fpc/tools/javapp/PascalUnit.java index ad2cc4fb28..4bf3a22734 100644 --- a/utils/javapp/src/fpc/tools/javapp/PascalUnit.java +++ b/utils/javapp/src/fpc/tools/javapp/PascalUnit.java @@ -114,10 +114,10 @@ public class PascalUnit { } private String getDefaultShortPascalName(String classname) { - String shortname = PascalClassData.getShortClassName(classname); + String shortname = PascalClassData.getShortClassName(env,classname); // inner class -> done (no naming problems) if (classname.indexOf('$') != -1) - return "Inner"+shortname; + return env.prefix_innerclass+shortname; // no package? if (shortname.equals(classname)) @@ -139,7 +139,7 @@ public class PascalUnit { if (PascalClassData.isInnerClass(className)) { int nestedIndex = className.indexOf('$'); // get the abbreviated Pascal name of the top-level class, followed by - // "Inner" + the nested class names (to avoid identifier conflicts) + // env.prefix_innerclass + the nested class names (to avoid identifier conflicts) String res = getShortPascalName(className.substring(0,nestedIndex)); // create valid identifier for inner classes that only exist in external version if (isExternalInnerClass(className)) { @@ -148,7 +148,7 @@ public class PascalUnit { } else { StringTokenizer innerTypes = new StringTokenizer(className.substring(nestedIndex+1), "$"); while (innerTypes.hasMoreTokens()) { - res = res + "." + "Inner"+innerTypes.nextToken(); + res = res + "." + env.prefix_innerclass+innerTypes.nextToken(); } } return res; @@ -353,7 +353,7 @@ public class PascalUnit { // remove added '$' again finishingName = finishingName.substring(0,finishingName.length()-1); if (nestedClasses.size()>1) { - finishingName = PascalClassData.getShortClassName(finishingName); + finishingName = PascalClassData.getShortClassName(env,finishingName); } else { finishingName = PascalClassData.getShortPascalClassName(finishingName); } @@ -367,7 +367,7 @@ public class PascalUnit { if (nestedClasses.size()>0) { unitFile.println(prefix+" type"); prefix = prefix + " "; - shortPascalName = PascalClassData.getShortClassName(curClass); + shortPascalName = PascalClassData.getShortClassName(env,curClass); } else { shortPascalName = PascalClassData.getShortPascalClassName(curClass); unitFile.println(); @@ -381,7 +381,7 @@ public class PascalUnit { // remove added '$' again finishingName = finishingName.substring(0,finishingName.length()-1); if (nestedClasses.size()>1) { - finishingName = PascalClassData.getShortClassName(finishingName); + finishingName = PascalClassData.getShortClassName(env,finishingName); } else { finishingName = PascalClassData.getShortPascalClassName(finishingName); }