11 func WriteByte(b byte, w io.Writer, n *int, err *error) {
12 WriteTo([]byte{b}, w, n, err)
15 func ReadByte(r io.Reader, n *int, err *error) byte {
17 ReadFull(buf[:], r, n, err)
23 func WriteInt8(i int8, w io.Writer, n *int, err *error) {
24 WriteByte(byte(i), w, n, err)
27 func ReadInt8(r io.Reader, n *int, err *error) int8 {
28 return int8(ReadByte(r, n, err))
33 func WriteUint8(i uint8, w io.Writer, n *int, err *error) {
34 WriteByte(byte(i), w, n, err)
37 func ReadUint8(r io.Reader, n *int, err *error) uint8 {
38 return uint8(ReadByte(r, n, err))
43 func WriteInt16(i int16, w io.Writer, n *int, err *error) {
45 binary.BigEndian.PutUint16(buf[:], uint16(i))
47 WriteTo(buf[:], w, n, err)
50 func ReadInt16(r io.Reader, n *int, err *error) int16 {
52 ReadFull(buf[:], r, n, err)
53 return int16(binary.BigEndian.Uint16(buf[:]))
56 func PutInt16(buf []byte, i int16) {
57 binary.BigEndian.PutUint16(buf, uint16(i))
60 func GetInt16(buf []byte) int16 {
61 return int16(binary.BigEndian.Uint16(buf))
66 func WriteUint16(i uint16, w io.Writer, n *int, err *error) {
68 binary.BigEndian.PutUint16(buf[:], uint16(i))
70 WriteTo(buf[:], w, n, err)
73 func ReadUint16(r io.Reader, n *int, err *error) uint16 {
75 ReadFull(buf[:], r, n, err)
76 return uint16(binary.BigEndian.Uint16(buf[:]))
79 func PutUint16(buf []byte, i uint16) {
80 binary.BigEndian.PutUint16(buf, i)
83 func GetUint16(buf []byte) uint16 {
84 return binary.BigEndian.Uint16(buf)
89 func WriteInt32(i int32, w io.Writer, n *int, err *error) {
91 binary.BigEndian.PutUint32(buf[:], uint32(i))
93 WriteTo(buf[:], w, n, err)
96 func ReadInt32(r io.Reader, n *int, err *error) int32 {
98 ReadFull(buf[:], r, n, err)
99 return int32(binary.BigEndian.Uint32(buf[:]))
102 func PutInt32(buf []byte, i int32) {
103 binary.BigEndian.PutUint32(buf, uint32(i))
106 func GetInt32(buf []byte) int32 {
107 return int32(binary.BigEndian.Uint32(buf))
112 func WriteUint32(i uint32, w io.Writer, n *int, err *error) {
114 binary.BigEndian.PutUint32(buf[:], uint32(i))
116 WriteTo(buf[:], w, n, err)
119 func ReadUint32(r io.Reader, n *int, err *error) uint32 {
121 ReadFull(buf[:], r, n, err)
122 return uint32(binary.BigEndian.Uint32(buf[:]))
125 func PutUint32(buf []byte, i uint32) {
126 binary.BigEndian.PutUint32(buf, i)
129 func GetUint32(buf []byte) uint32 {
130 return binary.BigEndian.Uint32(buf)
135 func WriteInt64(i int64, w io.Writer, n *int, err *error) {
137 binary.BigEndian.PutUint64(buf[:], uint64(i))
139 WriteTo(buf[:], w, n, err)
142 func ReadInt64(r io.Reader, n *int, err *error) int64 {
144 ReadFull(buf[:], r, n, err)
145 return int64(binary.BigEndian.Uint64(buf[:]))
148 func PutInt64(buf []byte, i int64) {
149 binary.BigEndian.PutUint64(buf, uint64(i))
152 func GetInt64(buf []byte) int64 {
153 return int64(binary.BigEndian.Uint64(buf))
158 func WriteUint64(i uint64, w io.Writer, n *int, err *error) {
160 binary.BigEndian.PutUint64(buf[:], uint64(i))
162 WriteTo(buf[:], w, n, err)
165 func ReadUint64(r io.Reader, n *int, err *error) uint64 {
167 ReadFull(buf[:], r, n, err)
168 return uint64(binary.BigEndian.Uint64(buf[:]))
171 func PutUint64(buf []byte, i uint64) {
172 binary.BigEndian.PutUint64(buf, i)
175 func GetUint64(buf []byte) uint64 {
176 return binary.BigEndian.Uint64(buf)
179 func uvarintSize(i uint64) int {
207 func WriteVarint(i int, w io.Writer, n *int, err *error) {
213 var size = uvarintSize(uint64(i))
215 // e.g. 0xF1 for a single negative byte
216 WriteUint8(uint8(size+0xF0), w, n, err)
218 WriteUint8(uint8(size), w, n, err)
222 binary.BigEndian.PutUint64(buf[:], uint64(i))
223 WriteTo(buf[(8-size):], w, n, err)
227 func ReadVarint(r io.Reader, n *int, err *error) int {
228 var size = ReadUint8(r, n, err)
230 if (size >> 4) == 0xF {
235 setFirstErr(err, errors.New("Varint overflow"))
240 setFirstErr(err, errors.New("Varint does not allow negative zero"))
245 ReadFull(buf[(8-size):], r, n, err)
246 var i = int(binary.BigEndian.Uint64(buf[:]))
254 func PutVarint(buf []byte, i int) (n int, err error) {
260 var size = uvarintSize(uint64(i))
261 if len(buf) < size+1 {
262 return 0, errors.New("Insufficient buffer length")
265 // e.g. 0xF1 for a single negative byte
266 buf[0] = byte(size + 0xF0)
272 binary.BigEndian.PutUint64(buf2[:], uint64(i))
273 copy(buf[1:], buf2[(8-size):])
278 func GetVarint(buf []byte) (i int, n int, err error) {
280 return 0, 0, errors.New("Insufficent buffer length")
282 var size = int(buf[0])
284 if (size >> 4) == 0xF {
289 return 0, 0, errors.New("Varint overflow")
293 return 0, 0, errors.New("Varint does not allow negative zero")
297 if len(buf) < 1+size {
298 return 0, 0, errors.New("Insufficient buffer length")
301 copy(buf2[(8-size):], buf[1:1+size])
302 i = int(binary.BigEndian.Uint64(buf2[:]))
304 return -i, size + 1, nil
306 return i, size + 1, nil
312 func WriteUvarint(i uint, w io.Writer, n *int, err *error) {
313 var size = uvarintSize(uint64(i))
314 WriteUint8(uint8(size), w, n, err)
317 binary.BigEndian.PutUint64(buf[:], uint64(i))
318 WriteTo(buf[(8-size):], w, n, err)
322 func ReadUvarint(r io.Reader, n *int, err *error) uint {
323 var size = ReadUint8(r, n, err)
325 setFirstErr(err, errors.New("Uvarint overflow"))
332 ReadFull(buf[(8-size):], r, n, err)
333 return uint(binary.BigEndian.Uint64(buf[:]))
336 func PutUvarint(buf []byte, i uint) (n int, err error) {
337 var size = uvarintSize(uint64(i))
338 if len(buf) < size+1 {
339 return 0, errors.New("Insufficient buffer length")
344 binary.BigEndian.PutUint64(buf2[:], uint64(i))
345 copy(buf[1:], buf2[(8-size):])
350 func GetUvarint(buf []byte) (i uint, n int, err error) {
352 return 0, 0, errors.New("Insufficent buffer length")
354 var size = int(buf[0])
356 return 0, 0, errors.New("Uvarint overflow")
361 if len(buf) < 1+size {
362 return 0, 0, errors.New("Insufficient buffer length")
365 copy(buf2[(8-size):], buf[1:1+size])
366 i = uint(binary.BigEndian.Uint64(buf2[:]))
367 return i, size + 1, nil
370 func setFirstErr(err *error, newErr error) {
371 if *err == nil && newErr != nil {