wire_format.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. --
  2. --------------------------------------------------------------------------------
  3. -- FILE: wire_format.lua
  4. -- DESCRIPTION: protoc-gen-lua
  5. -- Google's Protocol Buffers project, ported to lua.
  6. -- https://code.google.com/p/protoc-gen-lua/
  7. --
  8. -- Copyright (c) 2010 , 林卓毅 (Zhuoyi Lin) netsnail@gmail.com
  9. -- All rights reserved.
  10. --
  11. -- Use, modification and distribution are subject to the "New BSD License"
  12. -- as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
  13. -- COMPANY: NetEase
  14. -- CREATED: 2010年07月30日 15时59分53秒 CST
  15. --------------------------------------------------------------------------------
  16. --
  17. local pb = require "pb"
  18. module "protobuf.wire_format"
  19. WIRETYPE_VARINT = 0
  20. WIRETYPE_FIXED64 = 1
  21. WIRETYPE_LENGTH_DELIMITED = 2
  22. WIRETYPE_START_GROUP = 3
  23. WIRETYPE_END_GROUP = 4
  24. WIRETYPE_FIXED32 = 5
  25. _WIRETYPE_MAX = 5
  26. -- yeah, we don't need uint64
  27. local function _VarUInt64ByteSizeNoTag(uint64)
  28. if uint64 <= 0x7f then return 1 end
  29. if uint64 <= 0x3fff then return 2 end
  30. if uint64 <= 0x1fffff then return 3 end
  31. if uint64 <= 0xfffffff then return 4 end
  32. return 5
  33. end
  34. function PackTag(field_number, wire_type)
  35. return field_number * 8 + wire_type
  36. end
  37. function UnpackTag(tag)
  38. local wire_type = tag % 8
  39. return (tag - wire_type) / 8, wire_type
  40. end
  41. ZigZagEncode32 = pb.zig_zag_encode32
  42. ZigZagDecode32 = pb.zig_zag_decode32
  43. ZigZagEncode64 = pb.zig_zag_encode64
  44. ZigZagDecode64 = pb.zig_zag_decode64
  45. function Int32ByteSize(field_number, int32)
  46. return Int64ByteSize(field_number, int32)
  47. end
  48. function Int32ByteSizeNoTag(int32)
  49. return _VarUInt64ByteSizeNoTag(int32)
  50. end
  51. function Int64ByteSize(field_number, int64)
  52. return UInt64ByteSize(field_number, int64)
  53. end
  54. function UInt32ByteSize(field_number, uint32)
  55. return UInt64ByteSize(field_number, uint32)
  56. end
  57. function UInt64ByteSize(field_number, uint64)
  58. return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64)
  59. end
  60. function SInt32ByteSize(field_number, int32)
  61. return UInt32ByteSize(field_number, ZigZagEncode(int32))
  62. end
  63. function SInt64ByteSize(field_number, int64)
  64. return UInt64ByteSize(field_number, ZigZagEncode(int64))
  65. end
  66. function Fixed32ByteSize(field_number, fixed32)
  67. return TagByteSize(field_number) + 4
  68. end
  69. function Fixed64ByteSize(field_number, fixed64)
  70. return TagByteSize(field_number) + 8
  71. end
  72. function SFixed32ByteSize(field_number, sfixed32)
  73. return TagByteSize(field_number) + 4
  74. end
  75. function SFixed64ByteSize(field_number, sfixed64)
  76. return TagByteSize(field_number) + 8
  77. end
  78. function FloatByteSize(field_number, flt)
  79. return TagByteSize(field_number) + 4
  80. end
  81. function DoubleByteSize(field_number, double)
  82. return TagByteSize(field_number) + 8
  83. end
  84. function BoolByteSize(field_number, b)
  85. return TagByteSize(field_number) + 1
  86. end
  87. function EnumByteSize(field_number, enum)
  88. return UInt32ByteSize(field_number, enum)
  89. end
  90. function StringByteSize(field_number, string)
  91. return BytesByteSize(field_number, string)
  92. end
  93. function BytesByteSize(field_number, b)
  94. return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(#b) + #b
  95. end
  96. function MessageByteSize(field_number, message)
  97. return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(message.ByteSize()) + message.ByteSize()
  98. end
  99. function MessageSetItemByteSize(field_number, msg)
  100. local total_size = 2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3)
  101. total_size = total_size + _VarUInt64ByteSizeNoTag(field_number)
  102. local message_size = msg.ByteSize()
  103. total_size = total_size + _VarUInt64ByteSizeNoTag(message_size)
  104. total_size = total_size + message_size
  105. return total_size
  106. end
  107. function TagByteSize(field_number)
  108. return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0))
  109. end