/*
* Copyright (c) 2008-2019 Emmanuel Dupuy.
* This project is distributed under the GPLv3 license.
* This is a Copyleft license that gives the user the right to use,
* copy and modify the code freely for non-commercial purposes.
*/
package org.jd.gui.util.decompiler;
public class LineNumberStringBuilderPrinter extends StringBuilderPrinter {
protected boolean showLineNumbers = false;
protected int maxLineNumber = 0;
protected int digitCount = 0;
protected String lineNumberBeginPrefix;
protected String lineNumberEndPrefix;
protected String unknownLineNumberPrefix;
public void setShowLineNumbers(boolean showLineNumbers) { this.showLineNumbers = showLineNumbers; }
protected int printDigit(int dcv, int lineNumber, int divisor, int left) {
if (digitCount >= dcv) {
if (lineNumber < divisor) {
stringBuffer.append(' ');
} else {
int e = (lineNumber-left) / divisor;
stringBuffer.append((char)('0' + e));
left += e*divisor;
}
}
return left;
}
// --- Printer --- //
@Override
public void start(int maxLineNumber, int majorVersion, int minorVersion) {
super.start(maxLineNumber, majorVersion, minorVersion);
if (showLineNumbers) {
this.maxLineNumber = maxLineNumber;
if (maxLineNumber > 0) {
digitCount = 1;
unknownLineNumberPrefix = " ";
int maximum = 9;
while (maximum < maxLineNumber) {
digitCount++;
unknownLineNumberPrefix += ' ';
maximum = maximum*10 + 9;
}
lineNumberBeginPrefix = "/* ";
lineNumberEndPrefix = " */ ";
} else {
unknownLineNumberPrefix = "";
lineNumberBeginPrefix = "";
lineNumberEndPrefix = "";
}
} else {
this.maxLineNumber = 0;
unknownLineNumberPrefix = "";
lineNumberBeginPrefix = "";
lineNumberEndPrefix = "";
}
}
@Override public void startLine(int lineNumber) {
if (maxLineNumber > 0) {
stringBuffer.append(lineNumberBeginPrefix);
if (lineNumber == UNKNOWN_LINE_NUMBER) {
stringBuffer.append(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);
stringBuffer.append((char)('0' + (lineNumber-left)));
}
stringBuffer.append(lineNumberEndPrefix);
}
for (int i=0; i<indentationCount; i++) {
stringBuffer.append(TAB);
}
}
@Override public void extraLine(int count) {
if (realignmentLineNumber) {
while (count-- > 0) {
if (maxLineNumber > 0) {
stringBuffer.append(lineNumberBeginPrefix);
stringBuffer.append(unknownLineNumberPrefix);
stringBuffer.append(lineNumberEndPrefix);
}
stringBuffer.append(NEWLINE);
}
}
}
}