in daffodil-runtime1-layers/src/main/scala/org/apache/daffodil/layers/runtime1/LineFoldedLayerBase.scala [169:242]
override def read(): Int = {
import State._
if (state eq Done) return -1
while (state != Done) {
state match {
case Start => {
c = jis.read()
c match {
case -1 => {
state = Done
return -1
}
case '\r' => {
state = GotCR
}
case _ => {
// state stays Start
return c
}
}
}
case GotCR => {
c = jis.read()
c match {
case -1 => {
state = Done
return '\r'
}
case '\n' => {
state = GotCRLF
}
case _ => {
state = Buf1
return '\r'
}
}
}
case GotCRLF => {
c = jis.read()
c match {
case ' ' | '\t' => {
if (mode == LineFoldMode.IMF) {
state = Start // absorb the CR, LF, but not the sp/tab
return c // return the sp/tab
} else {
// iCalendar case
// we don't return a character, we go around again
// effectively we've absorbed the CR, LF, and the SP/TAB.
state = Start
}
}
case _ => {
// CRLF followed by other not sp/tab, or end of data.
// Note: This can happen when layer length is just implicit because the
// layer does not end at the first \r\n that is not followed by tab/space.
state = Buf2
return '\r' // We are preserving the CR in this case (and the LF next call)
}
}
}
case Buf1 => {
state = Start
return c
}
case Buf2 => {
state = Buf1
return '\n'
}
case Done =>
Assert.invariantFailed("Done state not allowed.")
}
}
Assert.invariantFailed("No fall through to here.")
}