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