diff options
Diffstat (limited to 'vendor/github.com/tdewolff/parse')
| -rw-r--r-- | vendor/github.com/tdewolff/parse/v2/binary.go | 601 | ||||
| -rw-r--r-- | vendor/github.com/tdewolff/parse/v2/binary_unix.go | 28 |
2 files changed, 178 insertions, 451 deletions
diff --git a/vendor/github.com/tdewolff/parse/v2/binary.go b/vendor/github.com/tdewolff/parse/v2/binary.go index 7247e6e10..cf4f91d4a 100644 --- a/vendor/github.com/tdewolff/parse/v2/binary.go +++ b/vendor/github.com/tdewolff/parse/v2/binary.go @@ -5,360 +5,15 @@ import ( "errors" "fmt" "io" - "math" "os" ) const PageSize = 4096 -// BinaryReader is a binary big endian file format reader. -type BinaryReader struct { - Endianness binary.ByteOrder - buf []byte - pos uint32 - eof bool -} - -// NewBinaryReader returns a big endian binary file format reader. -func NewBinaryReader(buf []byte) *BinaryReader { - if math.MaxUint32 < uint(len(buf)) { - return &BinaryReader{binary.BigEndian, nil, 0, true} - } - return &BinaryReader{binary.BigEndian, buf, 0, false} -} - -// NewBinaryReaderLE returns a little endian binary file format reader. -func NewBinaryReaderLE(buf []byte) *BinaryReader { - r := NewBinaryReader(buf) - r.Endianness = binary.LittleEndian - return r -} - -// Seek set the reader position in the buffer. -func (r *BinaryReader) Seek(pos uint32) error { - if uint32(len(r.buf)) < pos { - r.eof = true - return io.EOF - } - r.pos = pos - r.eof = false - return nil -} - -// Pos returns the reader's position. -func (r *BinaryReader) Pos() uint32 { - return r.pos -} - -// Len returns the remaining length of the buffer. -func (r *BinaryReader) Len() uint32 { - return uint32(len(r.buf)) - r.pos -} - -// SetLen sets the remaining length of the underlying buffer. -func (r *BinaryReader) SetLen(n uint32) { - r.buf = r.buf[: r.pos+n : r.pos+n] -} - -// EOF returns true if we reached the end-of-file. -func (r *BinaryReader) EOF() bool { - return r.eof -} - -// Read complies with io.Reader. -func (r *BinaryReader) Read(b []byte) (int, error) { - n := copy(b, r.buf[r.pos:]) - r.pos += uint32(n) - if r.pos == uint32(len(r.buf)) { - r.eof = true - return n, io.EOF - } - return n, nil -} - -// ReadBytes reads n bytes. -func (r *BinaryReader) ReadBytes(n uint32) []byte { - if r.eof || uint32(len(r.buf))-r.pos < n { - r.eof = true - return nil - } - buf := r.buf[r.pos : r.pos+n : r.pos+n] - r.pos += n - return buf -} - -// ReadString reads a string of length n. -func (r *BinaryReader) ReadString(n uint32) string { - return string(r.ReadBytes(n)) -} - -// ReadByte reads a single byte. -func (r *BinaryReader) ReadByte() byte { - b := r.ReadBytes(1) - if b == nil { - return 0 - } - return b[0] -} - -// ReadUint8 reads a uint8. -func (r *BinaryReader) ReadUint8() uint8 { - return r.ReadByte() -} - -// ReadUint16 reads a uint16. -func (r *BinaryReader) ReadUint16() uint16 { - b := r.ReadBytes(2) - if b == nil { - return 0 - } - return r.Endianness.Uint16(b) -} - -// ReadUint24 reads a uint24 into a uint32. -func (r *BinaryReader) ReadUint24() uint32 { - b := r.ReadBytes(3) - if b == nil { - return 0 - } else if r.Endianness == binary.LittleEndian { - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 - } else { - return uint32(b[2]) | uint32(b[1])<<8 | uint32(b[0])<<16 - } -} - -// ReadUint32 reads a uint32. -func (r *BinaryReader) ReadUint32() uint32 { - b := r.ReadBytes(4) - if b == nil { - return 0 - } - return r.Endianness.Uint32(b) -} - -// ReadUint64 reads a uint64. -func (r *BinaryReader) ReadUint64() uint64 { - b := r.ReadBytes(8) - if b == nil { - return 0 - } - return r.Endianness.Uint64(b) -} - -// ReadInt8 reads an int8. -func (r *BinaryReader) ReadInt8() int8 { - return int8(r.ReadByte()) -} - -// ReadInt16 reads an int16. -func (r *BinaryReader) ReadInt16() int16 { - return int16(r.ReadUint16()) -} - -// ReadInt24 reads a int24 into an int32. -func (r *BinaryReader) ReadInt24() int32 { - return int32(r.ReadUint24()) -} - -// ReadInt32 reads an int32. -func (r *BinaryReader) ReadInt32() int32 { - return int32(r.ReadUint32()) -} - -// ReadInt64 reads an int64. -func (r *BinaryReader) ReadInt64() int64 { - return int64(r.ReadUint64()) -} - -type BinaryFileReader struct { - f *os.File - size uint64 - offset uint64 - - Endianness binary.ByteOrder - buf []byte - pos int -} - -func NewBinaryFileReader(f *os.File, chunk int) (*BinaryFileReader, error) { - var buf []byte - var size uint64 - if chunk == 0 { - var err error - if buf, err = io.ReadAll(f); err != nil { - return nil, err - } - } else { - buf = make([]byte, 0, chunk) - } - if info, err := f.Stat(); err != nil { - return nil, err - } else { - size = uint64(info.Size()) - } - return &BinaryFileReader{ - f: f, - size: size, - Endianness: binary.BigEndian, - buf: buf, - }, nil -} - -func (r *BinaryFileReader) buffer(pos, length uint64) error { - if pos < r.offset || r.offset+uint64(len(r.buf)) < pos+length { - if math.MaxInt64 < pos { - return fmt.Errorf("seek position too large") - } else if _, err := r.f.Seek(int64(pos), 0); err != nil { - return err - } else if n, err := r.f.Read(r.buf[:cap(r.buf)]); err != nil { - return err - } else { - r.offset = pos - r.buf = r.buf[:n] - r.pos = 0 - } - } - return nil -} - -// Seek set the reader position in the buffer. -func (r *BinaryFileReader) Seek(pos uint64) error { - if r.size <= pos { - return io.EOF - } else if err := r.buffer(pos, 0); err != nil { - return err - } - r.pos = int(pos - r.offset) - return nil -} - -// Pos returns the reader's position. -func (r *BinaryFileReader) Pos() uint64 { - return r.offset + uint64(r.pos) -} - -// Len returns the remaining length of the buffer. -func (r *BinaryFileReader) Len() uint64 { - return r.size - r.Pos() -} - -// Offset returns the offset of the buffer. -func (r *BinaryFileReader) Offset() uint64 { - return r.offset -} - -// BufferLen returns the length of the buffer. -func (r *BinaryFileReader) BufferLen() int { - return len(r.buf) -} - -// Read complies with io.Reader. -func (r *BinaryFileReader) Read(b []byte) (int, error) { - if len(b) <= cap(r.buf) { - if err := r.buffer(r.offset+uint64(r.pos), uint64(len(b))); err != nil { - return 0, err - } - n := copy(b, r.buf[r.pos:]) - r.pos += n - return n, nil - } - - // read directly from file - if _, err := r.f.Seek(int64(r.offset)+int64(r.pos), 0); err != nil { - return 0, err - } - n, err := r.f.Read(b) - r.offset += uint64(r.pos + n) - r.pos = 0 - r.buf = r.buf[:0] - return n, err -} - -// ReadBytes reads n bytes. -func (r *BinaryFileReader) ReadBytes(n int) []byte { - if n < len(r.buf)-r.pos { - b := r.buf[r.pos : r.pos+n] - r.pos += n - return b - } - - b := make([]byte, n) - if _, err := r.Read(b); err != nil { - return nil - } - return b -} - -// ReadString reads a string of length n. -func (r *BinaryFileReader) ReadString(n int) string { - return string(r.ReadBytes(n)) -} - -// ReadByte reads a single byte. -func (r *BinaryFileReader) ReadByte() byte { - b := r.ReadBytes(1) - if b == nil { - return 0 - } - return b[0] -} - -// ReadUint8 reads a uint8. -func (r *BinaryFileReader) ReadUint8() uint8 { - return r.ReadByte() -} - -// ReadUint16 reads a uint16. -func (r *BinaryFileReader) ReadUint16() uint16 { - b := r.ReadBytes(2) - if b == nil { - return 0 - } - return r.Endianness.Uint16(b) -} - -// ReadUint32 reads a uint32. -func (r *BinaryFileReader) ReadUint32() uint32 { - b := r.ReadBytes(4) - if b == nil { - return 0 - } - return r.Endianness.Uint32(b) -} - -// ReadUint64 reads a uint64. -func (r *BinaryFileReader) ReadUint64() uint64 { - b := r.ReadBytes(8) - if b == nil { - return 0 - } - return r.Endianness.Uint64(b) -} - -// ReadInt8 reads a int8. -func (r *BinaryFileReader) ReadInt8() int8 { - return int8(r.ReadByte()) -} - -// ReadInt16 reads a int16. -func (r *BinaryFileReader) ReadInt16() int16 { - return int16(r.ReadUint16()) -} - -// ReadInt32 reads a int32. -func (r *BinaryFileReader) ReadInt32() int32 { - return int32(r.ReadUint32()) -} - -// ReadInt64 reads a int64. -func (r *BinaryFileReader) ReadInt64() int64 { - return int64(r.ReadUint64()) -} - type IBinaryReader interface { + Bytes([]byte, int64, int64) ([]byte, error) + Len() int64 Close() error - Len() int - Bytes(int, int64) ([]byte, error) } type binaryReaderFile struct { @@ -385,20 +40,21 @@ func (r *binaryReaderFile) Close() error { } // Len returns the length of the underlying memory-mapped file. -func (r *binaryReaderFile) Len() int { - return int(r.size) +func (r *binaryReaderFile) Len() int64 { + return r.size } -func (r *binaryReaderFile) Bytes(n int, off int64) ([]byte, error) { +func (r *binaryReaderFile) Bytes(b []byte, n, off int64) ([]byte, error) { if _, err := r.f.Seek(off, 0); err != nil { return nil, err + } else if b == nil { + b = make([]byte, n) } - b := make([]byte, n) m, err := r.f.Read(b) if err != nil { return nil, err - } else if m != n { + } else if int64(m) != n { return nil, errors.New("file: could not read all bytes") } return b, nil @@ -418,20 +74,26 @@ func (r *binaryReaderBytes) Close() error { } // Len returns the length of the underlying memory-mapped file. -func (r *binaryReaderBytes) Len() int { - return len(r.data) +func (r *binaryReaderBytes) Len() int64 { + return int64(len(r.data)) } -func (r *binaryReaderBytes) Bytes(n int, off int64) ([]byte, error) { - if off < 0 || int64(len(r.data)) < off { - return nil, fmt.Errorf("bytes: invalid offset %d", off) +func (r *binaryReaderBytes) Bytes(b []byte, n, off int64) ([]byte, error) { + if off < 0 || n < 0 || int64(len(r.data)) < off || int64(len(r.data))-off < n { + return nil, fmt.Errorf("bytes: invalid range %d--%d", off, off+n) + } + + data := r.data[off : off+n : off+n] + if b == nil { + return data, nil } - return r.data[off : off+int64(n) : off+int64(n)], nil + copy(b, data) + return b, nil } type binaryReaderReader struct { r io.Reader - n int64 + size int64 readerAt bool seeker bool } @@ -451,31 +113,33 @@ func (r *binaryReaderReader) Close() error { } // Len returns the length of the underlying memory-mapped file. -func (r *binaryReaderReader) Len() int { - return int(r.n) +func (r *binaryReaderReader) Len() int64 { + return r.size } -func (r *binaryReaderReader) Bytes(n int, off int64) ([]byte, error) { +func (r *binaryReaderReader) Bytes(b []byte, n, off int64) ([]byte, error) { + if b == nil { + b = make([]byte, n) + } + // seeker seems faster than readerAt by 10% if r.seeker { if _, err := r.r.(io.Seeker).Seek(off, 0); err != nil { return nil, err } - b := make([]byte, n) m, err := r.r.Read(b) if err != nil { return nil, err - } else if m != n { + } else if int64(m) != n { return nil, errors.New("file: could not read all bytes") } return b, nil } else if r.readerAt { - b := make([]byte, n) m, err := r.r.(io.ReaderAt).ReadAt(b, off) if err != nil { return nil, err - } else if m != n { + } else if int64(m) != n { return nil, errors.New("file: could not read all bytes") } return b, nil @@ -483,22 +147,22 @@ func (r *binaryReaderReader) Bytes(n int, off int64) ([]byte, error) { return nil, errors.New("io.Seeker and io.ReaderAt not implemented") } -type BinaryReader2 struct { +type BinaryReader struct { f IBinaryReader pos int64 err error - Endian binary.ByteOrder + ByteOrder binary.ByteOrder } -func NewBinaryReader2(f IBinaryReader) *BinaryReader2 { - return &BinaryReader2{ - f: f, - Endian: binary.BigEndian, +func NewBinaryReader(f IBinaryReader) *BinaryReader { + return &BinaryReader{ + f: f, + ByteOrder: binary.BigEndian, } } -func NewBinaryReader2Reader(r io.Reader, n int64) (*BinaryReader2, error) { +func NewBinaryReaderReader(r io.Reader, n int64) (*BinaryReader, error) { _, isReaderAt := r.(io.ReaderAt) _, isSeeker := r.(io.Seeker) @@ -512,27 +176,44 @@ func NewBinaryReader2Reader(r io.Reader, n int64) (*BinaryReader2, error) { } f = newBinaryReaderBytes(b) } - return NewBinaryReader2(f), nil + return NewBinaryReader(f), nil } -func NewBinaryReader2Bytes(data []byte) *BinaryReader2 { +func NewBinaryReaderBytes(data []byte) *BinaryReader { f := newBinaryReaderBytes(data) - return NewBinaryReader2(f) + return NewBinaryReader(f) } -func NewBinaryReader2File(filename string) (*BinaryReader2, error) { +func NewBinaryReaderFile(filename string) (*BinaryReader, error) { f, err := newBinaryReaderFile(filename) if err != nil { return nil, err } - return NewBinaryReader2(f), nil + return NewBinaryReader(f), nil +} + +func (r *BinaryReader) IBinaryReader() IBinaryReader { + return r.f +} + +func (r *BinaryReader) Clone() *BinaryReader { + f := r.f + if cloner, ok := f.(interface{ Clone() IBinaryReader }); ok { + f = cloner.Clone() + } + return &BinaryReader{ + f: f, + pos: r.pos, + err: r.err, + ByteOrder: r.ByteOrder, + } } -func (r *BinaryReader2) Err() error { +func (r *BinaryReader) Err() error { return r.err } -func (r *BinaryReader2) Close() error { +func (r *BinaryReader) Close() error { if err := r.f.Close(); err != nil { return err } @@ -540,150 +221,184 @@ func (r *BinaryReader2) Close() error { } // InPageCache returns true if the range is already in the page cache (for mmap). -func (r *BinaryReader2) InPageCache(start, end int64) bool { - index := int64(r.Pos()) / PageSize +func (r *BinaryReader) InPageCache(start, end int64) bool { + index := r.Pos() / PageSize return start/PageSize == index && end/PageSize == index } -// Free frees all previously read bytes, you cannot seek from before this position (for reader). -func (r *BinaryReader2) Free() { -} - // Pos returns the reader's position. -func (r *BinaryReader2) Pos() int64 { +func (r *BinaryReader) Pos() int64 { return r.pos } // Len returns the remaining length of the buffer. -func (r *BinaryReader2) Len() int { - return int(int64(r.f.Len()) - int64(r.pos)) +func (r *BinaryReader) Len() int64 { + return r.f.Len() - r.pos } -func (r *BinaryReader2) Seek(pos int64) { - r.pos = pos +// Seek complies with io.Seeker. +func (r *BinaryReader) Seek(off int64, whence int) (int64, error) { + if whence == 0 { + if off < 0 || r.f.Len() < off { + return 0, fmt.Errorf("invalid offset") + } + r.pos = off + } else if whence == 1 { + if r.pos+off < 0 || r.f.Len() < r.pos+off { + return 0, fmt.Errorf("invalid offset") + } + r.pos += off + } else if whence == 2 { + if off < -r.f.Len() || 0 < off { + return 0, fmt.Errorf("invalid offset") + } + r.pos = r.f.Len() - off + } else { + return 0, fmt.Errorf("invalid whence") + } + return r.pos, nil } // Read complies with io.Reader. -func (r *BinaryReader2) Read(b []byte) (int, error) { - data, err := r.f.Bytes(len(b), r.pos) +func (r *BinaryReader) Read(b []byte) (int, error) { + data, err := r.f.Bytes(b, int64(len(b)), r.pos) if err != nil && err != io.EOF { return 0, err } - n := copy(b, data) - r.pos += int64(len(b)) - return n, err + r.pos += int64(len(data)) + return len(data), err } // ReadAt complies with io.ReaderAt. -func (r *BinaryReader2) ReadAt(b []byte, off int64) (int, error) { - data, err := r.f.Bytes(len(b), off) +func (r *BinaryReader) ReadAt(b []byte, off int64) (int, error) { + data, err := r.f.Bytes(b, int64(len(b)), off) if err != nil && err != io.EOF { return 0, err } - n := copy(b, data) - return n, err + return len(data), err } // ReadBytes reads n bytes. -func (r *BinaryReader2) ReadBytes(n int) []byte { - data, err := r.f.Bytes(n, r.pos) +func (r *BinaryReader) ReadBytes(n int64) []byte { + data, err := r.f.Bytes(nil, n, r.pos) if err != nil { r.err = err return nil } - r.pos += int64(n) + r.pos += n return data } // ReadString reads a string of length n. -func (r *BinaryReader2) ReadString(n int) string { +func (r *BinaryReader) ReadString(n int64) string { return string(r.ReadBytes(n)) } // ReadByte reads a single byte. -func (r *BinaryReader2) ReadByte() byte { +func (r *BinaryReader) ReadByte() (byte, error) { data := r.ReadBytes(1) if data == nil { - return 0 + return 0, r.err } - return data[0] + return data[0], nil } // ReadUint8 reads a uint8. -func (r *BinaryReader2) ReadUint8() uint8 { - return r.ReadByte() +func (r *BinaryReader) ReadUint8() uint8 { + data := r.ReadBytes(1) + if data == nil { + return 0 + } + return data[0] } // ReadUint16 reads a uint16. -func (r *BinaryReader2) ReadUint16() uint16 { +func (r *BinaryReader) ReadUint16() uint16 { data := r.ReadBytes(2) if data == nil { return 0 - } else if r.Endian == binary.LittleEndian { + } else if r.ByteOrder == binary.LittleEndian { return uint16(data[1])<<8 | uint16(data[0]) } return uint16(data[0])<<8 | uint16(data[1]) } +// ReadUint24 reads a uint24 into a uint32. +func (r *BinaryReader) ReadUint24() uint32 { + b := r.ReadBytes(3) + if b == nil { + return 0 + } else if r.ByteOrder == binary.LittleEndian { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 + } else { + return uint32(b[2]) | uint32(b[1])<<8 | uint32(b[0])<<16 + } +} + // ReadUint32 reads a uint32. -func (r *BinaryReader2) ReadUint32() uint32 { +func (r *BinaryReader) ReadUint32() uint32 { data := r.ReadBytes(4) if data == nil { return 0 - } else if r.Endian == binary.LittleEndian { + } else if r.ByteOrder == binary.LittleEndian { return uint32(data[3])<<24 | uint32(data[2])<<16 | uint32(data[1])<<8 | uint32(data[0]) } return uint32(data[0])<<24 | uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3]) } // ReadUint64 reads a uint64. -func (r *BinaryReader2) ReadUint64() uint64 { +func (r *BinaryReader) ReadUint64() uint64 { data := r.ReadBytes(8) if data == nil { return 0 - } else if r.Endian == binary.LittleEndian { + } else if r.ByteOrder == binary.LittleEndian { return uint64(data[7])<<56 | uint64(data[6])<<48 | uint64(data[5])<<40 | uint64(data[4])<<32 | uint64(data[3])<<24 | uint64(data[2])<<16 | uint64(data[1])<<8 | uint64(data[0]) } return uint64(data[0])<<56 | uint64(data[1])<<48 | uint64(data[2])<<40 | uint64(data[3])<<32 | uint64(data[4])<<24 | uint64(data[5])<<16 | uint64(data[6])<<8 | uint64(data[7]) } // ReadInt8 reads a int8. -func (r *BinaryReader2) ReadInt8() int8 { - return int8(r.ReadByte()) +func (r *BinaryReader) ReadInt8() int8 { + return int8(r.ReadUint8()) } // ReadInt16 reads a int16. -func (r *BinaryReader2) ReadInt16() int16 { +func (r *BinaryReader) ReadInt16() int16 { return int16(r.ReadUint16()) } +// ReadInt24 reads a int24 into an int32. +func (r *BinaryReader) ReadInt24() int32 { + return int32(r.ReadUint24()) +} + // ReadInt32 reads a int32. -func (r *BinaryReader2) ReadInt32() int32 { +func (r *BinaryReader) ReadInt32() int32 { return int32(r.ReadUint32()) } // ReadInt64 reads a int64. -func (r *BinaryReader2) ReadInt64() int64 { +func (r *BinaryReader) ReadInt64() int64 { return int64(r.ReadUint64()) } // BinaryWriter is a big endian binary file format writer. type BinaryWriter struct { - buf []byte - Endian binary.ByteOrder + buf []byte + ByteOrder binary.AppendByteOrder } // NewBinaryWriter returns a big endian binary file format writer. func NewBinaryWriter(buf []byte) *BinaryWriter { return &BinaryWriter{ - buf: buf, - Endian: binary.BigEndian, + buf: buf, + ByteOrder: binary.BigEndian, } } // Len returns the buffer's length in bytes. -func (w *BinaryWriter) Len() uint32 { - return uint32(len(w.buf)) +func (w *BinaryWriter) Len() int64 { + return int64(len(w.buf)) } // Bytes returns the buffer's bytes. @@ -719,23 +434,26 @@ func (w *BinaryWriter) WriteUint8(v uint8) { // WriteUint16 writes the given uint16 to the buffer. func (w *BinaryWriter) WriteUint16(v uint16) { - pos := len(w.buf) - w.buf = append(w.buf, make([]byte, 2)...) - w.Endian.PutUint16(w.buf[pos:], v) + w.buf = w.ByteOrder.AppendUint16(w.buf, v) +} + +// WriteUint24 writes the given uint32 as a uint24 to the buffer. +func (w *BinaryWriter) WriteUint24(v uint32) { + if w.ByteOrder == binary.LittleEndian { + w.buf = append(w.buf, byte(v), byte(v>>8), byte(v>>16)) + } else { + w.buf = append(w.buf, byte(v>>16), byte(v>>8), byte(v)) + } } // WriteUint32 writes the given uint32 to the buffer. func (w *BinaryWriter) WriteUint32(v uint32) { - pos := len(w.buf) - w.buf = append(w.buf, make([]byte, 4)...) - w.Endian.PutUint32(w.buf[pos:], v) + w.buf = w.ByteOrder.AppendUint32(w.buf, v) } // WriteUint64 writes the given uint64 to the buffer. func (w *BinaryWriter) WriteUint64(v uint64) { - pos := len(w.buf) - w.buf = append(w.buf, make([]byte, 8)...) - w.Endian.PutUint64(w.buf[pos:], v) + w.buf = w.ByteOrder.AppendUint64(w.buf, v) } // WriteInt8 writes the given int8 to the buffer. @@ -748,6 +466,11 @@ func (w *BinaryWriter) WriteInt16(v int16) { w.WriteUint16(uint16(v)) } +// WriteInt24 writes the given int32 as an in24 to the buffer. +func (w *BinaryWriter) WriteInt24(v int32) { + w.WriteUint24(uint32(v)) +} + // WriteInt32 writes the given int32 to the buffer. func (w *BinaryWriter) WriteInt32(v int32) { w.WriteUint32(uint32(v)) @@ -794,7 +517,7 @@ func (r *BitmapReader) Read() bool { // BitmapWriter is a binary bitmap writer. type BitmapWriter struct { buf []byte - pos uint32 + pos uint64 } // NewBitmapWriter returns a binary bitmap writer. @@ -803,8 +526,8 @@ func NewBitmapWriter(buf []byte) *BitmapWriter { } // Len returns the buffer's length in bytes. -func (w *BitmapWriter) Len() uint32 { - return uint32(len(w.buf)) +func (w *BitmapWriter) Len() int64 { + return int64(len(w.buf)) } // Bytes returns the buffer's bytes. @@ -814,7 +537,7 @@ func (w *BitmapWriter) Bytes() []byte { // Write writes the next bit. func (w *BitmapWriter) Write(bit bool) { - if uint32(len(w.buf)) <= (w.pos+1)/8 { + if uint64(len(w.buf)) <= (w.pos+1)/8 { w.buf = append(w.buf, 0) } if bit { diff --git a/vendor/github.com/tdewolff/parse/v2/binary_unix.go b/vendor/github.com/tdewolff/parse/v2/binary_unix.go index 70bb8767f..4a8979fda 100644 --- a/vendor/github.com/tdewolff/parse/v2/binary_unix.go +++ b/vendor/github.com/tdewolff/parse/v2/binary_unix.go @@ -5,7 +5,6 @@ package parse import ( "errors" "fmt" - "io" "os" "runtime" "syscall" @@ -13,6 +12,7 @@ import ( type binaryReaderMmap struct { data []byte + size int64 } func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) { @@ -47,7 +47,7 @@ func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) { if err != nil { return nil, err } - r := &binaryReaderMmap{data} + r := &binaryReaderMmap{data, size} runtime.SetFinalizer(r, (*binaryReaderMmap).Close) return r, nil } @@ -67,25 +67,29 @@ func (r *binaryReaderMmap) Close() error { } // Len returns the length of the underlying memory-mapped file. -func (r *binaryReaderMmap) Len() int { - return len(r.data) +func (r *binaryReaderMmap) Len() int64 { + return r.size } -func (r *binaryReaderMmap) Bytes(n int, off int64) ([]byte, error) { +func (r *binaryReaderMmap) Bytes(b []byte, n, off int64) ([]byte, error) { if r.data == nil { return nil, errors.New("mmap: closed") - } else if off < 0 || int64(len(r.data)) < off { - return nil, fmt.Errorf("mmap: invalid offset %d", off) - } else if int64(len(r.data)-n) < off { - return r.data[off:len(r.data):len(r.data)], io.EOF + } else if off < 0 || n < 0 || int64(len(r.data)) < off || int64(len(r.data))-off < n { + return nil, fmt.Errorf("mmap: invalid range %d--%d", off, off+n) } - return r.data[off : off+int64(n) : off+int64(n)], nil + + data := r.data[off : off+n : off+n] + if b == nil { + return data, nil + } + copy(b, data) + return b, nil } -func NewBinaryReader2Mmap(filename string) (*BinaryReader2, error) { +func NewBinaryReaderMmap(filename string) (*BinaryReader, error) { f, err := newBinaryReaderMmap(filename) if err != nil { return nil, err } - return NewBinaryReader2(f), nil + return NewBinaryReader(f), nil } |
