Няма описание

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