summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ring.cc12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/ring.cc b/src/ring.cc
index 731b1bc2..a1ef059f 100644
--- a/src/ring.cc
+++ b/src/ring.cc
@@ -1067,9 +1067,6 @@ Ring::frozen_row_text_offset_to_column(row_t position,
} else
records[1].text_start_offset = _vte_stream_head (m_text_stream);
- g_assert_cmpuint(offset->text_offset, >=, records[0].text_start_offset);
- g_assert_cmpuint(offset->text_offset, <, records[1].text_start_offset);
-
g_string_set_size (buffer, records[1].text_start_offset - records[0].text_start_offset);
if (!_vte_stream_read(m_text_stream, records[0].text_start_offset, buffer->str, buffer->len))
return false;
@@ -1077,6 +1074,13 @@ Ring::frozen_row_text_offset_to_column(row_t position,
if (G_LIKELY (buffer->len && buffer->str[buffer->len - 1] == '\n'))
buffer->len--;
+ /* Now that we've chopped off the likely trailing newline (which is only rarely missing,
+ * if the ring ends in a soft wrapped line; see bug 181), the position we're about to
+ * locate can be anywhere in the string, including just after its last character,
+ * but not beyond that. */
+ g_assert_cmpuint(offset->text_offset, >=, records[0].text_start_offset);
+ g_assert_cmpuint(offset->text_offset, <=, records[0].text_start_offset + buffer->len);
+
row = index(position);
/* row and buffer now contain the same text, in different representation */
@@ -1084,7 +1088,7 @@ Ring::frozen_row_text_offset_to_column(row_t position,
/* count the number of characters for the given UTF-8 text offset */
off = offset->text_offset - records[0].text_start_offset;
num_chars = 0;
- for (i = 0; i < off && i < buffer->len; i++) {
+ for (i = 0; i < off; i++) {
if ((buffer->str[i] & 0xC0) != 0x80) num_chars++;
}