void debug_view_textbuf::view_update() { // update the console info m_total.x = text_buffer_max_width(&m_textbuf); m_total.y = text_buffer_num_lines(&m_textbuf); if (m_total.x < 80) m_total.x = 80; // determine the starting sequence number UINT32 curseq = 0; if (!m_at_bottom) { curseq = m_topseq; if (!text_buffer_get_seqnum_line(&m_textbuf, curseq)) m_at_bottom = true; } if (m_at_bottom) { curseq = text_buffer_line_index_to_seqnum(&m_textbuf, m_total.y - 1); if (m_total.y < m_visible.y) curseq -= m_total.y - 1; else curseq -= m_visible.y - 1; } m_topleft.y = curseq - text_buffer_line_index_to_seqnum(&m_textbuf, 0); // loop over visible rows debug_view_char *dest = m_viewdata; for (UINT32 row = 0; row < m_visible.y; row++) { const char *line = text_buffer_get_seqnum_line(&m_textbuf, curseq++); UINT32 col = 0; // if this visible row is valid, add it to the buffer if (line != NULL) { size_t len = strlen(line); UINT32 effcol = m_topleft.x; // copy data while (col < m_visible.x && effcol < len) { dest->byte = line[effcol++]; dest->attrib = DCA_NORMAL; dest++; col++; } } // fill the rest with blanks while (col < m_visible.x) { dest->byte = ' '; dest->attrib = DCA_NORMAL; dest++; col++; } } }
const char *text_buffer_get_seqnum_line(text_buffer *text, UINT32 seqnum) { UINT32 numlines = text_buffer_num_lines(text); UINT32 index = seqnum - text->linestartseq; if (index >= numlines) return nullptr; return &text->buffer[text->lineoffs[(text->linestart + index) % text->linesize]]; }