Geen omschrijving

proto.go 7.6KB

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