53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
package rifs
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
|
|
log "github.com/dsoprea/go-logging"
|
|
)
|
|
|
|
// SeekType is a convenience type to associate the different seek-types with
|
|
// printable descriptions.
|
|
type SeekType int
|
|
|
|
// String returns a descriptive string.
|
|
func (n SeekType) String() string {
|
|
if n == io.SeekCurrent {
|
|
return "SEEK-CURRENT"
|
|
} else if n == io.SeekEnd {
|
|
return "SEEK-END"
|
|
} else if n == io.SeekStart {
|
|
return "SEEK-START"
|
|
}
|
|
|
|
log.Panicf("unknown seek-type: (%d)", n)
|
|
return ""
|
|
}
|
|
|
|
// CalculateSeek calculates an offset in a file-stream given the parameters.
|
|
func CalculateSeek(currentOffset int64, delta int64, whence int, fileSize int64) (finalOffset int64, err error) {
|
|
defer func() {
|
|
if state := recover(); state != nil {
|
|
err = log.Wrap(state.(error))
|
|
finalOffset = 0
|
|
}
|
|
}()
|
|
|
|
if whence == os.SEEK_SET {
|
|
finalOffset = delta
|
|
} else if whence == os.SEEK_CUR {
|
|
finalOffset = currentOffset + delta
|
|
} else if whence == os.SEEK_END {
|
|
finalOffset = fileSize + delta
|
|
} else {
|
|
log.Panicf("whence not valid: (%d)", whence)
|
|
}
|
|
|
|
if finalOffset < 0 {
|
|
finalOffset = 0
|
|
}
|
|
|
|
return finalOffset, nil
|
|
}
|