forked from manveru/go-steam
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vdf.go
93 lines (80 loc) · 1.7 KB
/
vdf.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package vdf
import (
"bytes"
"encoding/binary"
)
const (
None = 0
String = 1
Int32 = 2
Float32 = 3
Pointer = 4
WideString = 5
Color = 6
UInt64 = 7
End = 8
)
func ParseBytes(b []byte) (kv map[string]interface{}, err error) {
return Parse(bytes.NewBuffer(b))
}
func Parse(buffer *bytes.Buffer) (kv map[string]interface{}, err error) {
kv = map[string]interface{}{}
var dataType uint8
var name string
for {
if dataType, err = readUInt8LE(buffer); err != nil {
return
}
if dataType == End {
break
}
if name, err = readCString(buffer); err != nil {
return
}
switch dataType {
case None:
kv[name], err = Parse(buffer)
case String:
kv[name], err = readCString(buffer)
case Int32:
case Color:
case Pointer:
kv[name], err = readInt32LE(buffer)
case UInt64:
kv[name], err = readUInt64LE(buffer)
case Float32:
kv[name], err = readFloat32LE(buffer)
}
if err != nil {
return
}
}
return kv, err
}
func readCString(buffer *bytes.Buffer) (string, error) {
name, err := buffer.ReadString('\000')
if err == nil {
name = name[:len(name)-1]
}
return name, err
}
func readUInt8LE(buffer *bytes.Buffer) (uint8, error) {
var v uint8
err := binary.Read(buffer, binary.LittleEndian, &v)
return v, err
}
func readInt32LE(buffer *bytes.Buffer) (int32, error) {
var v int32
err := binary.Read(buffer, binary.LittleEndian, &v)
return v, err
}
func readUInt64LE(buffer *bytes.Buffer) (uint64, error) {
var v uint64
err := binary.Read(buffer, binary.LittleEndian, &v)
return v, err
}
func readFloat32LE(buffer *bytes.Buffer) (float32, error) {
var v float32
err := binary.Read(buffer, binary.LittleEndian, &v)
return v, err
}