CT_INT_TYPE CIndentingStreambuf::overflow(CT_INT_TYPE c) { if (m_NeedIndent && pptr() != pbase()) { m_Buf->sputn(m_Indent.data(), m_Indent.size()); m_NeedIndent = false; } if ( !m_OutputActive ) { // avoid double-indenting m_OutputActive = true; const char *p, *oldp = m_PutArea; while (oldp < pptr() && (p = (const char*)memchr(oldp, '\n', pptr() - oldp)) != 0) { m_Buf->sputn(oldp, p - oldp + 1); if (p == pptr() - 1) { m_NeedIndent = true; // defer } else { m_Buf->sputn(m_Indent.data(), m_Indent.size()); } oldp = p + 1; } m_Buf->sputn(oldp, pptr() - oldp); m_OutputActive = false; setp(m_PutArea, m_PutArea + sizeof(m_PutArea)); } if ( !CT_EQ_INT_TYPE(c, CT_EOF) ) { sputc(CT_TO_CHAR_TYPE(c)); } return CT_NOT_EOF(CT_EOF); }
CT_INT_TYPE CConn_Streambuf::overflow(CT_INT_TYPE c) { if (!m_Conn) return CT_EOF; size_t n_written; size_t n_towrite = (size_t)(pptr() - pbase()); if (n_towrite) { // send buffer do { m_Status = CONN_Write(m_Conn, pbase(), n_towrite, &n_written, eIO_WritePlain); _ASSERT(n_written <= n_towrite); if (!n_written) { _ASSERT(m_Status != eIO_Success); break; } // update buffer content (get rid of the data just sent) memmove(pbase(), pbase() + n_written, n_towrite - n_written); x_PPos += (CT_OFF_TYPE) n_written; pbump(-int(n_written)); // store char if (!CT_EQ_INT_TYPE(c, CT_EOF)) return sputc(CT_TO_CHAR_TYPE(c)); n_towrite -= n_written; } while (n_towrite && m_Status == eIO_Success); if (n_towrite) { _ASSERT(m_Status != eIO_Success); ERR_POST_X(4, x_Message("overflow(): CONN_Write() failed")); return CT_EOF; } } else if (!CT_EQ_INT_TYPE(c, CT_EOF)) { // send char CT_CHAR_TYPE b = CT_TO_CHAR_TYPE(c); m_Status = CONN_Write(m_Conn, &b, 1, &n_written, eIO_WritePlain); _ASSERT(n_written <= 1); if (!n_written) { _ASSERT(m_Status != eIO_Success); ERR_POST_X(5, x_Message("overflow(): CONN_Write(1) failed")); return CT_EOF; } x_PPos += (CT_OFF_TYPE) 1; return c; } _ASSERT(CT_EQ_INT_TYPE(c, CT_EOF)); if ((m_Status = CONN_Flush(m_Conn)) != eIO_Success) { ERR_POST_X(9, x_Message("overflow(): CONN_Flush() failed")); return CT_EOF; } return CT_NOT_EOF(CT_EOF); }
CT_INT_TYPE CCompressionStreambuf::overflow(CT_INT_TYPE c) { // Check processor's state if ( !IsStreamProcessorOkay(CCompressionStream::eWrite) ) { return CT_EOF; } if ( m_Writer->m_State == CSP::eFinalize ) { return CT_EOF; } if ( !CT_EQ_INT_TYPE(c, CT_EOF) ) { // Put this character in the last position // (this function is called when pptr() == eptr() but we // have reserved one byte more in the constructor, thus // *epptr() and now *pptr() point to valid positions) *pptr() = c; // Increment put pointer pbump(1); } if ( ProcessStreamWrite() ) { return CT_NOT_EOF(CT_EOF); } return CT_EOF; }