Nessuna descrizione

proto.go 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. // Copyright 2014 Google Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // This file is a simple protocol buffer encoder and decoder.
  15. //
  16. // A protocol message must implement the message interface:
  17. // decoder() []decoder
  18. // encode(*buffer)
  19. //
  20. // The decode method returns a slice indexed by field number that gives the
  21. // function to decode that field.
  22. // The encode method encodes its receiver into the given buffer.
  23. //
  24. // The two methods are simple enough to be implemented by hand rather than
  25. // by using a protocol compiler.
  26. //
  27. // See profile.go for examples of messages implementing this interface.
  28. //
  29. // There is no support for groups, message sets, or "has" bits.
  30. package profile
  31. import "errors"
  32. type buffer struct {
  33. field int
  34. typ int
  35. u64 uint64
  36. data []byte
  37. tmp [16]byte
  38. }
  39. type decoder func(*buffer, message) error
  40. type message interface {
  41. decoder() []decoder
  42. encode(*buffer)
  43. }
  44. func marshal(m message) []byte {
  45. var b buffer
  46. m.encode(&b)
  47. return b.data
  48. }
  49. func encodeVarint(b *buffer, x uint64) {
  50. for x >= 128 {
  51. b.data = append(b.data, byte(x)|0x80)
  52. x >>= 7
  53. }
  54. b.data = append(b.data, byte(x))
  55. }
  56. func encodeLength(b *buffer, tag int, len int) {
  57. encodeVarint(b, uint64(tag)<<3|2)
  58. encodeVarint(b, uint64(len))
  59. }
  60. func encodeUint64(b *buffer, tag int, x uint64) {
  61. // append varint to b.data
  62. encodeVarint(b, uint64(tag)<<3|0)
  63. encodeVarint(b, x)
  64. }
  65. func encodeUint64s(b *buffer, tag int, x []uint64) {
  66. if len(x) > 2 {
  67. // Use packed encoding
  68. n1 := len(b.data)
  69. for _, u := range x {
  70. encodeVarint(b, u)
  71. }
  72. n2 := len(b.data)
  73. encodeLength(b, tag, n2-n1)
  74. n3 := len(b.data)
  75. copy(b.tmp[:], b.data[n2:n3])
  76. copy(b.data[n1+(n3-n2):], b.data[n1:n2])
  77. copy(b.data[n1:], b.tmp[:n3-n2])
  78. return
  79. }
  80. for _, u := range x {
  81. encodeUint64(b, tag, u)
  82. }
  83. }
  84. func encodeUint64Opt(b *buffer, tag int, x uint64) {
  85. if x == 0 {
  86. return
  87. }
  88. encodeUint64(b, tag, x)
  89. }
  90. func encodeInt64(b *buffer, tag int, x int64) {
  91. u := uint64(x)
  92. encodeUint64(b, tag, u)
  93. }
  94. func encodeInt64s(b *buffer, tag int, x []int64) {
  95. if len(x) > 2 {
  96. // Use packed encoding
  97. n1 := len(b.data)
  98. for _, u := range x {
  99. encodeVarint(b, uint64(u))
  100. }
  101. n2 := len(b.data)
  102. encodeLength(b, tag, n2-n1)
  103. n3 := len(b.data)
  104. copy(b.tmp[:], b.data[n2:n3])
  105. copy(b.data[n1+(n3-n2):], b.data[n1:n2])
  106. copy(b.data[n1:], b.tmp[:n3-n2])
  107. return
  108. }
  109. for _, u := range x {
  110. encodeInt64(b, tag, u)
  111. }
  112. }
  113. func encodeInt64Opt(b *buffer, tag int, x int64) {
  114. if x == 0 {
  115. return
  116. }
  117. encodeInt64(b, tag, x)
  118. }
  119. func encodeString(b *buffer, tag int, x string) {
  120. encodeLength(b, tag, len(x))
  121. b.data = append(b.data, x...)
  122. }
  123. func encodeStrings(b *buffer, tag int, x []string) {
  124. for _, s := range x {
  125. encodeString(b, tag, s)
  126. }
  127. }
  128. func encodeStringOpt(b *buffer, tag int, x string) {
  129. if x == "" {
  130. return
  131. }
  132. encodeString(b, tag, x)
  133. }
  134. func encodeBool(b *buffer, tag int, x bool) {
  135. if x {
  136. encodeUint64(b, tag, 1)
  137. } else {
  138. encodeUint64(b, tag, 0)
  139. }
  140. }
  141. func encodeBoolOpt(b *buffer, tag int, x bool) {
  142. if x == false {
  143. return
  144. }
  145. encodeBool(b, tag, x)
  146. }
  147. func encodeMessage(b *buffer, tag int, m message) {
  148. n1 := len(b.data)
  149. m.encode(b)
  150. n2 := len(b.data)
  151. encodeLength(b, tag, n2-n1)
  152. n3 := len(b.data)
  153. copy(b.tmp[:], b.data[n2:n3])
  154. copy(b.data[n1+(n3-n2):], b.data[n1:n2])
  155. copy(b.data[n1:], b.tmp[:n3-n2])
  156. }
  157. func unmarshal(data []byte, m message) (err error) {
  158. b := buffer{data: data, typ: 2}
  159. return decodeMessage(&b, m)
  160. }
  161. func le64(p []byte) uint64 {
  162. return uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 | uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56
  163. }
  164. func le32(p []byte) uint32 {
  165. return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
  166. }
  167. func decodeVarint(data []byte) (uint64, []byte, error) {
  168. var i int
  169. var u uint64
  170. for i = 0; ; i++ {
  171. if i >= 10 || i >= len(data) {
  172. return 0, nil, errors.New("bad varint")
  173. }
  174. u |= uint64(data[i]&0x7F) << uint(7*i)
  175. if data[i]&0x80 == 0 {
  176. return u, data[i+1:], nil
  177. }
  178. }
  179. }
  180. func decodeField(b *buffer, data []byte) ([]byte, error) {
  181. x, data, err := decodeVarint(data)
  182. if err != nil {
  183. return nil, err
  184. }
  185. b.field = int(x >> 3)
  186. b.typ = int(x & 7)
  187. b.data = nil
  188. b.u64 = 0
  189. switch b.typ {
  190. case 0:
  191. b.u64, data, err = decodeVarint(data)
  192. if err != nil {
  193. return nil, err
  194. }
  195. case 1:
  196. if len(data) < 8 {
  197. return nil, errors.New("not enough data")
  198. }
  199. b.u64 = le64(data[:8])
  200. data = data[8:]
  201. case 2:
  202. var n uint64
  203. n, data, err = decodeVarint(data)
  204. if err != nil {
  205. return nil, err
  206. }
  207. if n > uint64(len(data)) {
  208. return nil, errors.New("too much data")
  209. }
  210. b.data = data[:n]
  211. data = data[n:]
  212. case 5:
  213. if len(data) < 4 {
  214. return nil, errors.New("not enough data")
  215. }
  216. b.u64 = uint64(le32(data[:4]))
  217. data = data[4:]
  218. default:
  219. return nil, errors.New("unknown type: " + string(b.typ))
  220. }
  221. return data, nil
  222. }
  223. func checkType(b *buffer, typ int) error {
  224. if b.typ != typ {
  225. return errors.New("type mismatch")
  226. }
  227. return nil
  228. }
  229. func decodeMessage(b *buffer, m message) error {
  230. if err := checkType(b, 2); err != nil {
  231. return err
  232. }
  233. dec := m.decoder()
  234. data := b.data
  235. for len(data) > 0 {
  236. // pull varint field# + type
  237. var err error
  238. data, err = decodeField(b, data)
  239. if err != nil {
  240. return err
  241. }
  242. if b.field >= len(dec) || dec[b.field] == nil {
  243. continue
  244. }
  245. if err := dec[b.field](b, m); err != nil {
  246. return err
  247. }
  248. }
  249. return nil
  250. }
  251. func decodeInt64(b *buffer, x *int64) error {
  252. if err := checkType(b, 0); err != nil {
  253. return err
  254. }
  255. *x = int64(b.u64)
  256. return nil
  257. }
  258. func decodeInt64s(b *buffer, x *[]int64) error {
  259. if b.typ == 2 {
  260. // Packed encoding
  261. data := b.data
  262. for len(data) > 0 {
  263. var u uint64
  264. var err error
  265. if u, data, err = decodeVarint(data); err != nil {
  266. return err
  267. }
  268. *x = append(*x, int64(u))
  269. }
  270. return nil
  271. }
  272. var i int64
  273. if err := decodeInt64(b, &i); err != nil {
  274. return err
  275. }
  276. *x = append(*x, i)
  277. return nil
  278. }
  279. func decodeUint64(b *buffer, x *uint64) error {
  280. if err := checkType(b, 0); err != nil {
  281. return err
  282. }
  283. *x = b.u64
  284. return nil
  285. }
  286. func decodeUint64s(b *buffer, x *[]uint64) error {
  287. if b.typ == 2 {
  288. data := b.data
  289. // Packed encoding
  290. for len(data) > 0 {
  291. var u uint64
  292. var err error
  293. if u, data, err = decodeVarint(data); err != nil {
  294. return err
  295. }
  296. *x = append(*x, u)
  297. }
  298. return nil
  299. }
  300. var u uint64
  301. if err := decodeUint64(b, &u); err != nil {
  302. return err
  303. }
  304. *x = append(*x, u)
  305. return nil
  306. }
  307. func decodeString(b *buffer, x *string) error {
  308. if err := checkType(b, 2); err != nil {
  309. return err
  310. }
  311. *x = string(b.data)
  312. return nil
  313. }
  314. func decodeStrings(b *buffer, x *[]string) error {
  315. var s string
  316. if err := decodeString(b, &s); err != nil {
  317. return err
  318. }
  319. *x = append(*x, s)
  320. return nil
  321. }
  322. func decodeBool(b *buffer, x *bool) error {
  323. if err := checkType(b, 0); err != nil {
  324. return err
  325. }
  326. if int64(b.u64) == 0 {
  327. *x = false
  328. } else {
  329. *x = true
  330. }
  331. return nil
  332. }