1 /* 2 * Copyright (c) 2008-2019 Emmanuel Dupuy. 3 * This project is distributed under the GPLv3 license. 4 * This is a Copyleft license that gives the user the right to use, 5 * copy and modify the code freely for non-commercial purposes. 6 */ 7 8 package org.jd.gui.util.decompiler; 9 10 public class LineNumberStringBuilderPrinter extends StringBuilderPrinter { 11 protected boolean showLineNumbers = false; 12 13 protected int maxLineNumber = 0; 14 protected int digitCount = 0; 15 16 protected String lineNumberBeginPrefix; 17 protected String lineNumberEndPrefix; 18 protected String unknownLineNumberPrefix; 19 setShowLineNumbers(boolean showLineNumbers)20 public void setShowLineNumbers(boolean showLineNumbers) { this.showLineNumbers = showLineNumbers; } 21 printDigit(int dcv, int lineNumber, int divisor, int left)22 protected int printDigit(int dcv, int lineNumber, int divisor, int left) { 23 if (digitCount >= dcv) { 24 if (lineNumber < divisor) { 25 stringBuffer.append(' '); 26 } else { 27 int e = (lineNumber-left) / divisor; 28 stringBuffer.append((char)('0' + e)); 29 left += e*divisor; 30 } 31 } 32 33 return left; 34 } 35 36 // --- Printer --- // 37 @Override start(int maxLineNumber, int majorVersion, int minorVersion)38 public void start(int maxLineNumber, int majorVersion, int minorVersion) { 39 super.start(maxLineNumber, majorVersion, minorVersion); 40 41 if (showLineNumbers) { 42 this.maxLineNumber = maxLineNumber; 43 44 if (maxLineNumber > 0) { 45 digitCount = 1; 46 unknownLineNumberPrefix = " "; 47 int maximum = 9; 48 49 while (maximum < maxLineNumber) { 50 digitCount++; 51 unknownLineNumberPrefix += ' '; 52 maximum = maximum*10 + 9; 53 } 54 55 lineNumberBeginPrefix = "/* "; 56 lineNumberEndPrefix = " */ "; 57 } else { 58 unknownLineNumberPrefix = ""; 59 lineNumberBeginPrefix = ""; 60 lineNumberEndPrefix = ""; 61 } 62 } else { 63 this.maxLineNumber = 0; 64 unknownLineNumberPrefix = ""; 65 lineNumberBeginPrefix = ""; 66 lineNumberEndPrefix = ""; 67 } 68 } 69 startLine(int lineNumber)70 @Override public void startLine(int lineNumber) { 71 if (maxLineNumber > 0) { 72 stringBuffer.append(lineNumberBeginPrefix); 73 74 if (lineNumber == UNKNOWN_LINE_NUMBER) { 75 stringBuffer.append(unknownLineNumberPrefix); 76 } else { 77 int left = 0; 78 79 left = printDigit(5, lineNumber, 10000, left); 80 left = printDigit(4, lineNumber, 1000, left); 81 left = printDigit(3, lineNumber, 100, left); 82 left = printDigit(2, lineNumber, 10, left); 83 stringBuffer.append((char)('0' + (lineNumber-left))); 84 } 85 86 stringBuffer.append(lineNumberEndPrefix); 87 } 88 89 for (int i=0; i<indentationCount; i++) { 90 stringBuffer.append(TAB); 91 } 92 } extraLine(int count)93 @Override public void extraLine(int count) { 94 if (realignmentLineNumber) { 95 while (count-- > 0) { 96 if (maxLineNumber > 0) { 97 stringBuffer.append(lineNumberBeginPrefix); 98 stringBuffer.append(unknownLineNumberPrefix); 99 stringBuffer.append(lineNumberEndPrefix); 100 } 101 102 stringBuffer.append(NEWLINE); 103 } 104 } 105 } 106 } 107