diff options
-rw-r--r-- | src/ring.cc | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/ring.cc b/src/ring.cc index d03b1559..7d549541 100644 --- a/src/ring.cc +++ b/src/ring.cc @@ -1107,8 +1107,6 @@ _vte_frozen_row_text_offset_to_column (VteRing *ring, } else records[1].text_start_offset = _vte_stream_head (ring->text_stream); - g_assert(offset->text_offset >= records[0].text_start_offset && 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 (ring->text_stream, records[0].text_start_offset, buffer->str, buffer->len)) return FALSE; @@ -1116,6 +1114,12 @@ _vte_frozen_row_text_offset_to_column (VteRing *ring, 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(offset->text_offset >= records[0].text_start_offset && offset->text_offset <= records[0].text_start_offset + buffer->len); + row = _vte_ring_index(ring, position); /* row and buffer now contain the same text, in different representation */ @@ -1123,7 +1127,7 @@ _vte_frozen_row_text_offset_to_column (VteRing *ring, /* 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++; } |