53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
package excelLanguage
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
func writeI8Varint(buf *bytes.Buffer, v int8) error {
|
|
uv := uint64((uint32(v) << 1) ^ uint32(v>>7)) // zigzag encode
|
|
b := make([]byte, binary.MaxVarintLen64)
|
|
n := binary.PutUvarint(b, uv)
|
|
_, err := buf.Write(b[:n])
|
|
return err
|
|
}
|
|
|
|
func readI8Varint(r *bytes.Reader) (int, error) {
|
|
uv, err := binary.ReadUvarint(r)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
// zigzag decode
|
|
v := int((uv >> 1) ^ uint64((int64(uv&1)<<63)>>63))
|
|
return v, nil
|
|
}
|
|
|
|
func readString(r *bytes.Reader) (string, error) {
|
|
l, err := r.ReadByte()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
buf := make([]byte, l)
|
|
if _, err := io.ReadFull(r, buf); err != nil {
|
|
return "", err
|
|
}
|
|
return string(buf), nil
|
|
}
|
|
|
|
func readStringArray(r *bytes.Reader) ([]string, error) {
|
|
length, err := readI8Varint(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
arr := make([]string, 0, length)
|
|
for i := 0; i < length; i++ {
|
|
s, err := readString(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
arr = append(arr, s)
|
|
}
|
|
return arr, nil
|
|
} |