/
tagparser.go
146 lines (114 loc) · 2.41 KB
/
tagparser.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package nbt
func (p *Parser) readTagByte() (TagByte, error) {
byte, err := p.readInt8()
return TagByte(byte), err
}
func (p *Parser) readTagShort() (TagShort, error) {
i, err := p.readInt16()
return TagShort(i), err
}
func (p *Parser) readTagInt() (TagInt, error) {
i, err := p.readInt32()
return TagInt(i), err
}
func (p *Parser) readTagLong() (TagLong, error) {
i, err := p.readInt64()
return TagLong(i), err
}
func (p *Parser) readTagFloat() (TagFloat, error) {
i, err := p.readFloat32()
return TagFloat(i), err
}
func (p *Parser) readTagDouble() (TagDouble, error) {
i, err := p.readFloat64()
return TagDouble(i), err
}
func (p *Parser) readTagByteArray() (TagByteArray, error) {
length, err := p.readInt32()
if err != nil {
return nil, err
}
bytes, err := p.readBytes(int(length))
return bytes, err
}
func (p *Parser) readTagString() (TagString, error) {
length, err := p.readUint16()
if err != nil {
return "", err
}
bytes, err := p.readBytes(int(length))
return TagString(bytes), err
}
func (p *Parser) readTagList() (tag TagList, err error) {
tag.ElementType, err = p.readTagId()
if err != nil {
return
}
var length int32
length, err = p.readInt32()
if err != nil {
return
}
if length <= 0 {
return
}
tag.Elements = make([]Tag, length)
for i := int32(0); i < length; i++ {
tag.Elements[i], err = tag.ElementType.Read(p)
if err != nil {
return
}
}
return
}
func (p *Parser) readTagCompound() (TagCompound, error) {
tag := make(TagCompound)
for {
// parse tag ID
tagId, err := p.readTagId()
if err != nil {
return nil, err
}
if tagId == TagTypeEnd {
break
}
// parse tag name
var nameLength uint16
nameLength, err = p.readUint16()
if err != nil {
return nil, err
}
var name string
name, err = p.readUtf8(int(nameLength))
subTag, err := tagId.Read(p)
if err != nil {
return nil, err
}
tag[name] = subTag
}
return tag, nil
}
func (p *Parser) readTagIntArray() (tag TagIntArray, err error) {
var length int32
length, err = p.readInt32()
if err != nil {
return
}
tag = make([]int32, length)
for i := int32(0); i < length; i++ {
tag[i], err = p.readInt32()
}
return
}
func (p *Parser) readTagLongArray() (tag TagLongArray, err error) {
var length int32
length, err = p.readInt32()
if err != nil {
return
}
tag = make([]int64, length)
for i := int32(0); i < length; i++ {
tag[i], err = p.readInt64()
}
return
}