View Javadoc
1   package org.djutils.decoderdumper;
2   
3   import java.io.IOException;
4   
5   /**
6    * <p>
7    * Copyright (c) 2013-2021 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
8    * BSD-style license. See <a href="https://djutils.org/docs/current/djutils/licenses.html">DJUTILS License</a>.
9    * <p>
10   * @version $Revision$, $LastChangedDate$, by $Author$, initial version Jan 3, 2019 <br>
11   * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
12   * @author <a href="https://www.tudelft.nl/staff/p.knoppers/">Peter Knoppers</a>
13   */
14  public class CharDecoder implements Decoder
15  {
16      /** Prototype output line. */
17      private final String prototypeLine;
18  
19      /** Maximum number of fields on one output line. */
20      private final int fieldsPerLine;
21  
22      /** Insert one extra space every N fields. */
23      private final int extraSpaceAfterEvery;
24  
25      /**
26       * Construct a new CharDecoder.
27       * @param fieldsPerLine int; maximum number of fields on one output line
28       * @param extraSpaceAfterEvery int; insert an extra space after every N fields
29       */
30      public CharDecoder(final int fieldsPerLine, final int extraSpaceAfterEvery)
31      {
32          this.fieldsPerLine = fieldsPerLine;
33          this.extraSpaceAfterEvery = extraSpaceAfterEvery > 0 ? extraSpaceAfterEvery : Integer.MAX_VALUE;
34          String format = String.format("%%%ds", fieldsPerLine + (fieldsPerLine - 1) / this.extraSpaceAfterEvery);
35          this.prototypeLine = String.format(format, "");
36      }
37  
38      /** String builder for current output line. */
39      private StringBuilder buffer = new StringBuilder();
40  
41      /** {@inheritDoc} */
42      @Override
43      public String getResult()
44      {
45          String result = this.buffer.toString();
46          this.buffer.setLength(0);
47          return result;
48      }
49  
50      /** {@inheritDoc} */
51      @Override
52      public int getMaximumWidth()
53      {
54          return this.prototypeLine.length();
55      }
56  
57      /** {@inheritDoc} */
58      @Override
59      public boolean append(final int address, final byte theByte) throws IOException
60      {
61          if (this.buffer.length() == 0)
62          {
63              this.buffer.append(this.prototypeLine);
64          }
65          int lineByte = address % this.fieldsPerLine;
66          int index = lineByte + lineByte / this.extraSpaceAfterEvery;
67          this.buffer.replace(index, index + 1, theByte >= 32 && theByte < 127 ? "" + (char) theByte : ".");
68          return lineByte == this.fieldsPerLine - 1;
69      }
70  
71      /** {@inheritDoc} */
72      @Override
73      public boolean ignoreForIdenticalOutputCheck()
74      {
75          return false;
76      }
77  
78      /** {@inheritDoc} */
79      @Override
80      public String toString()
81      {
82          return "CharDecoder [buffer=" + this.buffer + "]";
83      }
84  
85  }