mirror of
https://github.com/IllusionMan1212/gif-extractor-go.git
synced 2026-10-24 10:12:36 +00:00
initial commit
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
package main
|
||||
|
||||
import "io"
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func readByte(r io.Reader) (byte, error) {
|
||||
var buf [1]byte
|
||||
n, err := r.Read(buf[:])
|
||||
if n == 0 {
|
||||
return 0, io.ErrUnexpectedEOF
|
||||
}
|
||||
return buf[0], err
|
||||
}
|
||||
|
||||
func (v *blockReader) readNextBlock() error {
|
||||
blockSize, err := readByte(v.r)
|
||||
if err == io.EOF {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if blockSize == 0 {
|
||||
return io.EOF
|
||||
}
|
||||
_, err = io.ReadFull(v.r, v.buf[:blockSize])
|
||||
if err == io.EOF {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v.bufLen = int(blockSize)
|
||||
v.bufNext = 0
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v *blockReader) Read(p []byte) (n int, err error) {
|
||||
if v.bufNext >= v.bufLen {
|
||||
err = v.readNextBlock()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
n = min(len(p), v.bufLen-v.bufNext)
|
||||
for i := 0; i < n; i++ {
|
||||
p[i] = v.buf[i+v.bufNext]
|
||||
}
|
||||
v.bufNext += n
|
||||
return
|
||||
}
|
||||
|
||||
type blockReader struct {
|
||||
buf [255]byte
|
||||
bufLen int
|
||||
bufNext int
|
||||
r io.Reader
|
||||
}
|
||||
|
||||
func newBlockReader(r io.Reader) *blockReader {
|
||||
return &blockReader{
|
||||
r: r,
|
||||
bufLen: 0,
|
||||
bufNext: 0,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user