package jd.cli.printer.text; import jd.cli.preferences.CommonPreferences; import jd.core.model.instruction.bytecode.instruction.Instruction; import jd.core.printer.Printer; import java.io.PrintStream; public class PlainTextPrinter implements Printer { protected static final String TAB = " "; protected static final String NEWLINE = "\n"; protected CommonPreferences preferences; protected PrintStream printStream; protected int maxLineNumber; protected int majorVersion; protected int minorVersion; protected int digitCount; protected String lineNumberBeginPrefix; protected String lineNumberEndPrefix; protected String unknownLineNumberPrefix; protected int indentationCount; protected boolean display; public PlainTextPrinter( CommonPreferences preferences, PrintStream printStream) { this.preferences = preferences; this.printStream = printStream; this.maxLineNumber = 0; this.majorVersion = 0; this.minorVersion = 0; this.indentationCount = 0; } public int getMajorVersion() { return majorVersion; } public int getMinorVersion() { return minorVersion; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // public void print(byte b) { this.printStream.append(String.valueOf(b)); } public void print(int i) { this.printStream.append(String.valueOf(i)); } public void print(char c) { if (this.display) this.printStream.append(String.valueOf(c)); } public void print(String s) { if (this.display) printEscape(s); } public void printNumeric(String s) { this.printStream.append(s); } public void printString(String s, String scopeInternalName) { this.printStream.append(s); } public void printKeyword(String s) { if (this.display) this.printStream.append(s); } public void printJavaWord(String s) { this.printStream.append(s); } public void printType(String internalName, String name, String scopeInternalName) { if (this.display) printEscape(name); } public void printTypeDeclaration(String internalName, String name) { printEscape(name); } public void printTypeImport(String internalName, String name) { printEscape(name); } public void printField( String internalName, String name, String descriptor, String scopeInternalName) { printEscape(name); } public void printFieldDeclaration( String internalName, String name, String descriptor) { printEscape(name); } public void printStaticField( String internalName, String name, String descriptor, String scopeInternalName) { printEscape(name); } public void printStaticFieldDeclaration( String internalName, String name, String descriptor) { printEscape(name); } public void printConstructor( String internalName, String name, String descriptor, String scopeInternalName) { printEscape(name); } public void printConstructorDeclaration( String internalName, String name, String descriptor) { printEscape(name); } public void printStaticConstructorDeclaration( String internalName, String name) { this.printStream.append(name); } public void printMethod( String internalName, String name, String descriptor, String scopeInternalName) { printEscape(name); } public void printMethodDeclaration( String internalName, String name, String descriptor) { printEscape(name); } public void printStaticMethod( String internalName, String name, String descriptor, String scopeInternalName) { printEscape(name); } public void printStaticMethodDeclaration( String internalName, String name, String descriptor) { printEscape(name); } public void start(int maxLineNumber, int majorVersion, int minorVersion) { this.majorVersion = majorVersion; this.minorVersion = minorVersion; this.indentationCount = 0; this.display = true; if (this.preferences.isShowLineNumbers()) { this.maxLineNumber = maxLineNumber; if (maxLineNumber > 0) { this.digitCount = 1; this.unknownLineNumberPrefix = " "; int maximum = 9; while (maximum < maxLineNumber) { this.digitCount++; this.unknownLineNumberPrefix += ' '; maximum = maximum*10 + 9; } this.lineNumberBeginPrefix = "/* "; this.lineNumberEndPrefix = " */ "; } else { this.unknownLineNumberPrefix = ""; this.lineNumberBeginPrefix = ""; this.lineNumberEndPrefix = ""; } } else { this.maxLineNumber = 0; this.unknownLineNumberPrefix = ""; this.lineNumberBeginPrefix = ""; this.lineNumberEndPrefix = ""; } } public void end() {} public void indent() { this.indentationCount++; } public void desindent() { if (this.indentationCount > 0) this.indentationCount--; } public void startOfLine(int lineNumber) { if (this.maxLineNumber > 0) { this.printStream.append(this.lineNumberBeginPrefix); if (lineNumber == Instruction.UNKNOWN_LINE_NUMBER) { this.printStream.append(this.unknownLineNumberPrefix); } else { int left = 0; left = printDigit(5, lineNumber, 10000, left); left = printDigit(4, lineNumber, 1000, left); left = printDigit(3, lineNumber, 100, left); left = printDigit(2, lineNumber, 10, left); this.printStream.append((char)('0' + (lineNumber-left))); } this.printStream.append(this.lineNumberEndPrefix); } for (int i=0; i<indentationCount; i++) this.printStream.append(TAB); } public void endOfLine() { this.printStream.append(NEWLINE); } public void extraLine(int count) { if (this.preferences.isMergeEmptyLines() == false) { while (count-- > 0) { if (this.maxLineNumber > 0) { this.printStream.append(this.lineNumberBeginPrefix); this.printStream.append(this.unknownLineNumberPrefix); this.printStream.append(this.lineNumberEndPrefix); } this.printStream.append(NEWLINE); } } } public void startOfComment() {} public void endOfComment() {} public void startOfJavadoc() {} public void endOfJavadoc() {} public void startOfXdoclet() {} public void endOfXdoclet() {} public void startOfError() {} public void endOfError() {} public void startOfImportStatements() {} public void endOfImportStatements() {} public void startOfTypeDeclaration(String internalPath) {} public void endOfTypeDeclaration() {} public void startOfAnnotationName() {} public void endOfAnnotationName() {} public void startOfOptionalPrefix() { if (this.preferences.isShowPrefixThis() == false) this.display = false; } public void endOfOptionalPrefix() { this.display = true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // public void debugStartOfLayoutBlock() {} public void debugEndOfLayoutBlock() {} public void debugStartOfSeparatorLayoutBlock() {} public void debugEndOfSeparatorLayoutBlock(int min, int value, int max) {} public void debugStartOfStatementsBlockLayoutBlock() {} public void debugEndOfStatementsBlockLayoutBlock(int min, int value, int max) {} public void debugStartOfInstructionBlockLayoutBlock() {} public void debugEndOfInstructionBlockLayoutBlock() {} public void debugStartOfCommentDeprecatedLayoutBlock() {} public void debugEndOfCommentDeprecatedLayoutBlock() {} public void debugMarker(String marker) {} public void debugStartOfCaseBlockLayoutBlock() {} public void debugEndOfCaseBlockLayoutBlock() {} // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // protected void printEscape(String s) { if (this.preferences.isUnicodeEscape()) { int length = s.length(); for (int i=0; i<length; i++) { char c = s.charAt(i); if (c == '\t') { this.printStream.append(c); } else if (c < 32) { // Write octal format this.printStream.append("\\0"); this.printStream.append((char)('0' + (c >> 3))); this.printStream.append((char)('0' + (c & 0x7))); } else if (c > 127) { // Write octal format this.printStream.append("\\u"); int z = (c >> 12); this.printStream.append((char)((z <= 9) ? ('0' + z) : (('A' - 10) + z))); z = ((c >> 8) & 0xF); this.printStream.append((char)((z <= 9) ? ('0' + z) : (('A' - 10) + z))); z = ((c >> 4) & 0xF); this.printStream.append((char)((z <= 9) ? ('0' + z) : (('A' - 10) + z))); z = (c & 0xF); this.printStream.append((char)((z <= 9) ? ('0' + z) : (('A' - 10) + z))); } else { this.printStream.append(c); } } } else { this.printStream.append(s); } } protected int printDigit(int dcv, int lineNumber, int divisor, int left) { if (this.digitCount >= dcv) { if (lineNumber < divisor) { this.printStream.append(' '); } else { int e = (lineNumber-left) / divisor; this.printStream.append((char)('0' + e)); left += e*divisor; } } return left; } }