Ejemplo n.º 1
0
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++;
		}
	}
}
Ejemplo n.º 2
0
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]];
}