binary.go raw
1 package wasm
2
3 import (
4 "encoding/binary"
5 "io"
6 )
7
8 func read(r io.Reader, v interface{}) error {
9 return binary.Read(r, binary.LittleEndian, v)
10 }
11
12 func readByte(r io.Reader) (byte, error) {
13 b := make([]byte, 1)
14 if _, err := r.Read(b); err != nil {
15 return 0, err
16 }
17 return b[0], nil
18 }
19
20 func readUntil(r io.Reader, delim byte, v *[]byte) error {
21 for {
22 b, err := readByte(r)
23 if err != nil {
24 return err
25 }
26 *v = append(*v, b)
27 if b == byte(delim) {
28 break
29 }
30 }
31 return nil
32 }
33
34 func readVarUint1(r io.Reader, v *uint8) error {
35 return read(r, v)
36 }
37
38 func readVarUint7(r io.Reader, v *uint8) error {
39 return read(r, v)
40 }
41
42 func readVarUint32(r io.Reader, v *uint32) error {
43 var shift uint32
44 for {
45 b, err := readByte(r)
46 if err != nil {
47 return err
48 }
49 *v |= uint32(b&0x7F) << shift
50 if (b & 0x80) == 0 {
51 break
52 }
53 shift += 7
54 }
55
56 return nil
57 }
58
59 func readVarUint64(r io.Reader, v *uint64) error {
60 var shift uint32
61 for {
62 b, err := readByte(r)
63 if err != nil {
64 return err
65 }
66 *v |= uint64(b&0x7F) << shift
67 if (b & 0x80) == 0 {
68 break
69 }
70 shift += 7
71 }
72
73 return nil
74 }
75
76 func readVarInt7(r io.Reader, v *int8) error {
77 if err := read(r, v); err != nil {
78 return err
79 }
80 *v &= 0x7F
81 return nil
82 }
83
84 func readVarInt32(r io.Reader, v *int32) error {
85 var shift uint32
86 for {
87 b, err := readByte(r)
88 if err != nil {
89 return err
90 }
91 *v |= int32(b&0x7F) << shift
92 if (b & 0x80) == 0 {
93 break
94 }
95 shift += 7
96 }
97
98 return nil
99 }
100
101 // varUint32Size returns the size in bytes of a varuint32
102 func varUint32Size(v uint32) int {
103 s := 0
104 for v > 0 {
105 s++
106 v = v >> 8
107 }
108 return s
109 }
110
111 func readString(r io.Reader, result *string) error {
112 var stringLen uint32
113 if err := readVarUint32(r, &stringLen); err != nil {
114 return err
115 }
116 stringBytes := make([]byte, stringLen)
117 if err := read(r, stringBytes); err != nil {
118 return err
119 }
120 *result = string(stringBytes)
121 return nil
122 }
123