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  }