summaryrefslogtreecommitdiff
path: root/vendor/github.com/dsoprea/go-utility/v2/filesystem/calculate_seek.go
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
}