| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- package util
- import (
- "bufio"
- "bytes"
- "encoding/binary"
- "io"
- "math"
- )
- func readBool(r *bytes.Buffer, data *bool) error {
- b, err := r.ReadByte()
- if err != nil {
- return err
- }
- *data = b != 0
- return nil
- }
- func readInt8(r *bytes.Buffer, data *int8) error {
- b, err := r.ReadByte()
- if err != nil {
- return err
- }
- *data = int8(b)
- return nil
- }
- func readUint8(r *bytes.Buffer, data *uint8) error {
- b, err := r.ReadByte()
- if err != nil {
- return err
- }
- *data = uint8(b)
- return nil
- }
- func readInt16(r *bytes.Buffer, data *int16) error {
- order := binary.LittleEndian
- var b [2]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = int16(order.Uint16(bs))
- return nil
- }
- func readUint16(r *bytes.Buffer, data *uint16) error {
- order := binary.LittleEndian
- var b [2]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = order.Uint16(bs)
- return nil
- }
- func readInt(r *bytes.Buffer, data *int) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = int(int32(order.Uint32(bs)))
- return nil
- }
- func readInt32(r *bytes.Buffer, data *int32) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = int32(order.Uint32(bs))
- return nil
- }
- func readUint(r *bytes.Buffer, data *uint) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = uint(order.Uint32(bs))
- return nil
- }
- func readUint32(r *bytes.Buffer, data *uint32) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = order.Uint32(bs)
- return nil
- }
- func readInt64(r *bytes.Buffer, data *int64) error {
- order := binary.LittleEndian
- var b [8]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = int64(order.Uint64(bs))
- return nil
- }
- func readUint64(r *bytes.Buffer, data *uint64) error {
- order := binary.LittleEndian
- var b [8]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = order.Uint64(bs)
- return nil
- }
- func readFloat32(r *bytes.Buffer, data *float32) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = math.Float32frombits(order.Uint32(bs))
- return nil
- }
- func readFloat64(r *bytes.Buffer, data *float64) error {
- order := binary.LittleEndian
- var b [8]byte
- bs := b[:]
- _, err := readFull(r, bs)
- if err != nil {
- return err
- }
- *data = math.Float64frombits(order.Uint64(bs))
- return nil
- }
- func readBuffBool(r *bufio.Reader, data *bool) error {
- b, err := r.ReadByte()
- if err != nil {
- return err
- }
- *data = b != 0
- return nil
- }
- func readBuffInt8(r *bufio.Reader, data *int8) error {
- b, err := r.ReadByte()
- if err != nil {
- return err
- }
- *data = int8(b)
- return nil
- }
- func readBuffUint8(r *bufio.Reader, data *uint8) error {
- b, err := r.ReadByte()
- if err != nil {
- return err
- }
- *data = uint8(b)
- return nil
- }
- func readBuffInt16(r *bufio.Reader, data *int16) error {
- order := binary.LittleEndian
- var b [2]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = int16(order.Uint16(bs))
- return nil
- }
- func readBuffUint16(r *bufio.Reader, data *uint16) error {
- order := binary.LittleEndian
- var b [2]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = order.Uint16(bs)
- return nil
- }
- func readBuffInt(r *bufio.Reader, data *int) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = int(int32(order.Uint32(bs)))
- return nil
- }
- func readBuffInt32(r *bufio.Reader, data *int32) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = int32(order.Uint32(bs))
- return nil
- }
- func readBuffUint(r *bufio.Reader, data *uint) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = uint(order.Uint32(bs))
- return nil
- }
- func readBuffUint32(r *bufio.Reader, data *uint32) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = order.Uint32(bs)
- return nil
- }
- func readBuffInt64(r *bufio.Reader, data *int64) error {
- order := binary.LittleEndian
- var b [8]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = int64(order.Uint64(bs))
- return nil
- }
- func readBuffUint64(r *bufio.Reader, data *uint64) error {
- order := binary.LittleEndian
- var b [8]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = order.Uint64(bs)
- return nil
- }
- func readBuffFloat32(r *bufio.Reader, data *float32) error {
- order := binary.LittleEndian
- var b [4]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = math.Float32frombits(order.Uint32(bs))
- return nil
- }
- func readBuffFloat64(r *bufio.Reader, data *float64) error {
- order := binary.LittleEndian
- var b [8]byte
- bs := b[:]
- _, err := readBuffFull(r, bs)
- if err != nil {
- return err
- }
- *data = math.Float64frombits(order.Uint64(bs))
- return nil
- }
- // read full is a bufio.Reader specific implementation of io.ReadFull() which
- // avoids escaping our stack allocated scratch bytes
- func readBuffFull(r *bufio.Reader, buf []byte) (n int, err error) {
- min := len(buf)
- for n < min && err == nil {
- var nn int
- nn, err = r.Read(buf[n:])
- n += nn
- }
- if n >= min {
- err = nil
- } else if n > 0 && err == io.EOF {
- err = io.ErrUnexpectedEOF
- }
- return
- }
- // read full is a bytes.Buffer specific implementation of io.ReadFull() which
- // avoids escaping our stack allocated scratch bytes
- func readFull(r *bytes.Buffer, buf []byte) (n int, err error) {
- min := len(buf)
- for n < min && err == nil {
- var nn int
- nn, err = r.Read(buf[n:])
- n += nn
- }
- if n >= min {
- err = nil
- } else if n > 0 && err == io.EOF {
- err = io.ErrUnexpectedEOF
- }
- return
- }
- func writeBool(w *bytes.Buffer, data bool) error {
- if data {
- w.WriteByte(1)
- return nil
- }
- w.WriteByte(0)
- return nil
- }
- func writeInt8(w *bytes.Buffer, data int8) error {
- w.WriteByte(byte(data))
- return nil
- }
- func writeUint8(w *bytes.Buffer, data uint8) error {
- w.WriteByte(byte(data))
- return nil
- }
- func writeInt16(w *bytes.Buffer, data int16) error {
- var b [2]byte
- bs := b[:]
- binary.LittleEndian.PutUint16(bs, uint16(data))
- _, err := w.Write(bs)
- return err
- }
- func writeUint16(w *bytes.Buffer, data uint16) error {
- var b [2]byte
- bs := b[:]
- binary.LittleEndian.PutUint16(bs, data)
- _, err := w.Write(bs)
- return err
- }
- func writeInt32(w *bytes.Buffer, data int32) error {
- var b [4]byte
- bs := b[:]
- binary.LittleEndian.PutUint32(bs, uint32(data))
- _, err := w.Write(bs)
- return err
- }
- func writeUint32(w *bytes.Buffer, data uint32) error {
- var b [4]byte
- bs := b[:]
- binary.LittleEndian.PutUint32(bs, data)
- _, err := w.Write(bs)
- return err
- }
- func writeInt(w *bytes.Buffer, data int) error {
- var b [4]byte
- bs := b[:]
- binary.LittleEndian.PutUint32(bs, uint32(int32(data)))
- _, err := w.Write(bs)
- return err
- }
- func writeUint(w *bytes.Buffer, data uint) error {
- var b [4]byte
- bs := b[:]
- binary.LittleEndian.PutUint32(bs, uint32(data))
- _, err := w.Write(bs)
- return err
- }
- func writeInt64(w *bytes.Buffer, data int64) error {
- var b [8]byte
- bs := b[:]
- binary.LittleEndian.PutUint64(bs, uint64(data))
- _, err := w.Write(bs)
- return err
- }
- func writeUint64(w *bytes.Buffer, data uint64) error {
- var b [8]byte
- bs := b[:]
- binary.LittleEndian.PutUint64(bs, data)
- _, err := w.Write(bs)
- return err
- }
- func writeFloat32(w *bytes.Buffer, data float32) error {
- var b [4]byte
- bs := b[:]
- binary.LittleEndian.PutUint32(bs, math.Float32bits(data))
- _, err := w.Write(bs)
- return err
- }
- func writeFloat64(w *bytes.Buffer, data float64) error {
- var b [8]byte
- bs := b[:]
- binary.LittleEndian.PutUint64(bs, math.Float64bits(data))
- _, err := w.Write(bs)
- return err
- }
|