blob: cd59d727c1c25d224606bb1c5f4953fa3594eae6 (
plain)
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 | package rifs
import (
	"io"
	"os"
	"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
}
 |