1 package org.djutils.decoderdumper;
2
3 import java.io.IOException;
4
5
6
7
8
9
10
11
12
13
14
15 public class CharDecoder implements Decoder
16 {
17
18 private final String prototypeLine;
19
20
21 private final int fieldsPerLine;
22
23
24 private final int extraSpaceAfterEvery;
25
26
27
28
29
30
31 public CharDecoder(final int fieldsPerLine, int extraSpaceAfterEvery)
32 {
33 this.fieldsPerLine = fieldsPerLine;
34 this.extraSpaceAfterEvery = extraSpaceAfterEvery > 0 ? extraSpaceAfterEvery : Integer.MAX_VALUE;
35 String format = String.format("%%%ds", fieldsPerLine + (fieldsPerLine - 1) / this.extraSpaceAfterEvery);
36 this.prototypeLine = String.format(format, "");
37 }
38
39
40 private StringBuilder buffer = new StringBuilder();
41
42
43 @Override
44 public String getResult()
45 {
46 String result = this.buffer.toString();
47 this.buffer.setLength(0);
48 return result;
49 }
50
51
52 @Override
53 public int getMaximumWidth()
54 {
55 return this.prototypeLine.length();
56 }
57
58
59 @Override
60 public boolean append(int address, byte theByte) throws IOException
61 {
62 if (this.buffer.length() == 0)
63 {
64 this.buffer.append(this.prototypeLine);
65 }
66 int lineByte = address % this.fieldsPerLine;
67 int index = lineByte + lineByte / this.extraSpaceAfterEvery;
68 this.buffer.replace(index, index + 1, theByte >= 32 && theByte < 127 ? "" + (char) theByte : ".");
69 return lineByte == this.fieldsPerLine - 1;
70 }
71
72
73 @Override
74 public boolean ignoreForIdenticalOutputCheck()
75 {
76 return false;
77 }
78
79
80 @Override
81 public String toString()
82 {
83 return "CharDecoder [buffer=" + this.buffer + "]";
84 }
85
86 }