138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Lua
		
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Lua
		
	
--
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
--  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) netsnail@gmail.com
 | 
						|
--      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 "protobuf.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
 | 
						|
 |