in daffodil-io/src/main/scala/org/apache/daffodil/io/Dump.scala [170:228]
private def textDump(
addr: Long,
rowStart0b: Int,
txtsb: StringBuilder,
limit0b: Int,
endByteAddress0b: Long,
byteBuffer: ByteBuffer,
decoder: Option[JavaCharsetDecoder],
textByteWidth: Int
): Unit = {
var i = rowStart0b + nPadBytesFromPriorLine
txtsb ++= paddingFromPriorLine
while (i <= limit0b) {
val bytePos0b = addr + i
val (charRep, nBytesConsumed, width) =
convertToCharRepr(bytePos0b, endByteAddress0b, byteBuffer, decoder)
Assert.invariant(nBytesConsumed > 0)
// some characters will print double width. It is assumed all such
// characters occupy at least one byte.
Assert.invariant(nBytesConsumed >= width)
//
// Will padding wrap to next line?
//
val padByteRep = "~" * (textByteWidth - 1)
val nBytesPastEnd =
if (nBytesConsumed == 1) 0
else {
(limit0b - i + 1, nBytesConsumed) match {
case (1, 2) => 1
case (1, 3) => 2
case (1, 4) => 3
case (2, 2) => 0
case (2, 3) => 1
case (2, 4) => 2
case (3, 2) => 0
case (3, 3) => 0
case (3, 4) => 1
case (4, _) => 0
case _ => 0
}
}
paddingFromPriorLine = padByteRep * 2 * nBytesPastEnd
nPadBytesFromPriorLine = nBytesPastEnd
//
// Adjust padding downward if the character is double wide.
//
val padding = padByteRep * ((nBytesConsumed, width) match {
case (1, 1) => 1
case (1, 2) => 0
case (2, x) => 4 - x
case (3, x) => 6 - x
case (4, x) => 8 - x
case (n, x) => Assert.impossible()
})
val trimmedPadding = padding.take(padding.length - paddingFromPriorLine.length)
txtsb ++= charRep + trimmedPadding
i += nBytesConsumed
}
}