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
+ loc := 0
+ for i := 0; i < y; i++ {
+ // + 1 for the newline
+ loc += len(buf.Line(i)) + 1
+ }
+ loc += len(buf.Line(y)[:x])
+ return loc
+}
+
// Loc stores a location
type Loc struct {
X, Y int