forked from sean-lin/protoc-gen-lua
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wire_format.lua
137 lines (109 loc) · 3.67 KB
/
wire_format.lua
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
--
--------------------------------------------------------------------------------
-- FILE: wire_format.lua
-- DESCRIPTION: protoc-gen-lua
-- Google's Protocol Buffers project, ported to lua.
-- https://code.google.com/p/protoc-gen-lua/
--
-- Copyright (c) 2010 , 林卓毅 (Zhuoyi Lin) [email protected]
-- All rights reserved.
--
-- Use, modification and distribution are subject to the "New BSD License"
-- as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
-- COMPANY: NetEase
-- CREATED: 2010年07月30日 15时59分53秒 CST
--------------------------------------------------------------------------------
--
local pb = require "pb"
module "wire_format"
WIRETYPE_VARINT = 0
WIRETYPE_FIXED64 = 1
WIRETYPE_LENGTH_DELIMITED = 2
WIRETYPE_START_GROUP = 3
WIRETYPE_END_GROUP = 4
WIRETYPE_FIXED32 = 5
_WIRETYPE_MAX = 5
-- yeah, we don't need uint64
local function _VarUInt64ByteSizeNoTag(uint64)
if uint64 <= 0x7f then return 1 end
if uint64 <= 0x3fff then return 2 end
if uint64 <= 0x1fffff then return 3 end
if uint64 <= 0xfffffff then return 4 end
return 5
end
function PackTag(field_number, wire_type)
return field_number * 8 + wire_type
end
function UnpackTag(tag)
local wire_type = tag % 8
return (tag - wire_type) / 8, wire_type
end
ZigZagEncode32 = pb.zig_zag_encode32
ZigZagDecode32 = pb.zig_zag_decode32
ZigZagEncode64 = pb.zig_zag_encode64
ZigZagDecode64 = pb.zig_zag_decode64
function Int32ByteSize(field_number, int32)
return Int64ByteSize(field_number, int32)
end
function Int32ByteSizeNoTag(int32)
return _VarUInt64ByteSizeNoTag(int32)
end
function Int64ByteSize(field_number, int64)
return UInt64ByteSize(field_number, int64)
end
function UInt32ByteSize(field_number, uint32)
return UInt64ByteSize(field_number, uint32)
end
function UInt64ByteSize(field_number, uint64)
return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64)
end
function SInt32ByteSize(field_number, int32)
return UInt32ByteSize(field_number, ZigZagEncode(int32))
end
function SInt64ByteSize(field_number, int64)
return UInt64ByteSize(field_number, ZigZagEncode(int64))
end
function Fixed32ByteSize(field_number, fixed32)
return TagByteSize(field_number) + 4
end
function Fixed64ByteSize(field_number, fixed64)
return TagByteSize(field_number) + 8
end
function SFixed32ByteSize(field_number, sfixed32)
return TagByteSize(field_number) + 4
end
function SFixed64ByteSize(field_number, sfixed64)
return TagByteSize(field_number) + 8
end
function FloatByteSize(field_number, flt)
return TagByteSize(field_number) + 4
end
function DoubleByteSize(field_number, double)
return TagByteSize(field_number) + 8
end
function BoolByteSize(field_number, b)
return TagByteSize(field_number) + 1
end
function EnumByteSize(field_number, enum)
return UInt32ByteSize(field_number, enum)
end
function StringByteSize(field_number, string)
return BytesByteSize(field_number, string)
end
function BytesByteSize(field_number, b)
return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(#b) + #b
end
function MessageByteSize(field_number, message)
return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(message.ByteSize()) + message.ByteSize()
end
function MessageSetItemByteSize(field_number, msg)
local total_size = 2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3)
total_size = total_size + _VarUInt64ByteSizeNoTag(field_number)
local message_size = msg.ByteSize()
total_size = total_size + _VarUInt64ByteSizeNoTag(message_size)
total_size = total_size + message_size
return total_size
end
function TagByteSize(field_number)
return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0))
end