github.com/ruishantech/selfupdate@v1.0.3/internal/binarydist/seek.go (about)

     1  package binarydist
     2  
     3  import (
     4  	"errors"
     5  )
     6  
     7  type seekBuffer struct {
     8  	buf []byte
     9  	pos int
    10  }
    11  
    12  func (b *seekBuffer) Write(p []byte) (n int, err error) {
    13  	n = copy(b.buf[b.pos:], p)
    14  	if n == len(p) {
    15  		b.pos += n
    16  		return n, nil
    17  	}
    18  	b.buf = append(b.buf, p[n:]...)
    19  	b.pos += len(p)
    20  	return len(p), nil
    21  }
    22  
    23  func (b *seekBuffer) Seek(offset int64, whence int) (ret int64, err error) {
    24  	var abs int64
    25  	switch whence {
    26  	case 0:
    27  		abs = offset
    28  	case 1:
    29  		abs = int64(b.pos) + offset
    30  	case 2:
    31  		abs = int64(len(b.buf)) + offset
    32  	default:
    33  		return 0, errors.New("binarydist: invalid whence")
    34  	}
    35  	if abs < 0 {
    36  		return 0, errors.New("binarydist: negative position")
    37  	}
    38  	if abs >= 1<<31 {
    39  		return 0, errors.New("binarydist: position out of range")
    40  	}
    41  	b.pos = int(abs)
    42  	return abs, nil
    43  }