private bool ZBuildLineFromBytes(cTrace.cContext pParentContext) { var lContext = pParentContext.NewMethod(nameof(cResponseBuilder), nameof(ZBuildLineFromBytes)); if (mBytes.Count < 3 || mBytes[mBytes.Count - 1] != cASCII.RBRACE) { ZAddWholeLine(false, lContext); return(true); // complete } int lBytePosition = mBytes.Count - 2; while (lBytePosition > 0) { byte lByte = mBytes[lBytePosition]; if (lByte < cASCII.ZERO || lByte > cASCII.NINE) { break; } lBytePosition--; } if (lBytePosition == mBytes.Count - 2 || mBytes[lBytePosition] != cASCII.LBRACE) { ZAddWholeLine(false, lContext); return(true); // complete } mBytesToGo = 0; checked { for (int i = lBytePosition + 1; i < mBytes.Count - 1; i++) { mBytesToGo = mBytesToGo * 10 + mBytes[i] - cASCII.ZERO; } } if (lBytePosition != 0 && mBytes[lBytePosition - 1] == cASCII.TILDA) { lBytePosition--; } mBytes.RemoveRange(lBytePosition, mBytes.Count - lBytePosition); ZAddWholeLine(false, lContext); if (mBytesToGo == 0) { if (!lContext.ContextTraceDelay) { lContext.TraceVerbose("adding empty literal line"); } mLines.Add(new cResponseLine(true, new byte[0])); } else if (!lContext.ContextTraceDelay) { lContext.TraceVerbose("expecting literal of length {0}", mBytesToGo); } return(false); // still need more bytes }