View Javadoc
1   package org.djutils.decoderdumper;
2   
3   import java.io.IOException;
4   
5   /**
6    * <p>
7    * Copyright (c) 2013-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
8    * BSD-style license. See <a href="https://opentrafficsim.org/node/13">OpenTrafficSim 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   * @author <a href="https://www.transport.citg.tudelft.nl">Wouter Schakel</a>
14   */
15  public class CharDecoder implements Decoder
16  {
17      /** Prototype output line. */
18      private final String prototypeLine;
19  
20      /** Maximum number of fields on one output line. */
21      private final int fieldsPerLine;
22  
23      /** Insert one extra space every N fields. */
24      private final int extraSpaceAfterEvery;
25  
26      /**
27       * Construct a new CharDecoder.
28       * @param fieldsPerLine int; maximum number of fields on one output line
29       * @param extraSpaceAfterEvery int; insert an extra space after every N fields
30       */
31      public CharDecoder(final int fieldsPerLine, final 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      /** String builder for current output line. */
40      private StringBuilder buffer = new StringBuilder();
41  
42      /** {@inheritDoc} */
43      @Override
44      public String getResult()
45      {
46          String result = this.buffer.toString();
47          this.buffer.setLength(0);
48          return result;
49      }
50  
51      /** {@inheritDoc} */
52      @Override
53      public int getMaximumWidth()
54      {
55          return this.prototypeLine.length();
56      }
57  
58      /** {@inheritDoc} */
59      @Override
60      public boolean append(final int address, final 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      /** {@inheritDoc} */
73      @Override
74      public boolean ignoreForIdenticalOutputCheck()
75      {
76          return false;
77      }
78  
79      /** {@inheritDoc} */
80      @Override
81      public String toString()
82      {
83          return "CharDecoder [buffer=" + this.buffer + "]";
84      }
85  
86  }