codeberg.org/go-pdf/fpdf@v0.11.1/rbuf.go (about) 1 // Copyright ©2021 The go-pdf Authors. All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package fpdf 6 7 import ( 8 "bytes" 9 "encoding/binary" 10 "io" 11 ) 12 13 type rbuffer struct { 14 p []byte 15 c int 16 } 17 18 // newRBuffer returns a new buffer populated with the contents of the specified Reader 19 func newRBuffer(r io.Reader) (b *rbuffer, err error) { 20 buf := new(bytes.Buffer) 21 _, err = buf.ReadFrom(r) 22 b = &rbuffer{p: buf.Bytes()} 23 return 24 } 25 26 func (r *rbuffer) Read(p []byte) (int, error) { 27 if r.c >= len(r.p) { 28 return 0, io.EOF 29 } 30 n := copy(p, r.p[r.c:]) 31 r.c += n 32 return n, nil 33 } 34 35 func (r *rbuffer) ReadByte() (byte, error) { 36 if r.c >= len(r.p) { 37 return 0, io.EOF 38 } 39 v := r.p[r.c] 40 r.c++ 41 return v, nil 42 } 43 44 func (r *rbuffer) u8() uint8 { 45 if r.c >= len(r.p) { 46 panic(io.ErrShortBuffer) 47 } 48 v := r.p[r.c] 49 r.c++ 50 return v 51 } 52 53 func (r *rbuffer) u32() uint32 { 54 const n = 4 55 if r.c+n >= len(r.p) { 56 panic(io.ErrShortBuffer) 57 } 58 beg := r.c 59 r.c += n 60 v := binary.BigEndian.Uint32(r.p[beg:]) 61 return v 62 } 63 64 func (r *rbuffer) i32() int32 { 65 return int32(r.u32()) 66 } 67 68 func (r *rbuffer) Next(n int) []byte { 69 c := r.c 70 r.c += n 71 return r.p[c:r.c] 72 }