Fix rare out of bounds error with selections

Fixes #446
This commit is contained in:
Zachary Yedidia
2016-11-11 20:12:21 -05:00
parent d0d167b663
commit 89c468924e
2 changed files with 15 additions and 3 deletions

View File

@@ -73,10 +73,13 @@ func (c *Cursor) DeleteSelection() {
// GetSelection returns the cursor's selection
func (c *Cursor) GetSelection() string {
if c.CurSelection[0].GreaterThan(c.CurSelection[1]) {
return c.buf.Substr(c.CurSelection[1], c.CurSelection[0])
if InBounds(c.CurSelection[0], c.buf) && InBounds(c.CurSelection[1], c.buf) {
if c.CurSelection[0].GreaterThan(c.CurSelection[1]) {
return c.buf.Substr(c.CurSelection[1], c.CurSelection[0])
}
return c.buf.Substr(c.CurSelection[0], c.CurSelection[1])
}
return c.buf.Substr(c.CurSelection[0], c.CurSelection[1])
return ""
}
// SelectLine selects the current line

View File

@@ -28,6 +28,15 @@ func ToCharPos(start Loc, buf *Buffer) int {
return loc
}
// InBounds returns whether the given location is a valid character position in the given buffer
func InBounds(pos Loc, buf *Buffer) bool {
if pos.Y < 0 || pos.Y >= buf.NumLines || pos.X < 0 || pos.X > Count(buf.Line(pos.Y)) {
return false
}
return true
}
// ByteOffset is just like ToCharPos except it counts bytes instead of runes
func ByteOffset(pos Loc, buf *Buffer) int {
x, y := pos.X, pos.Y