You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

368 lines
7.5 KiB

  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)
  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 encodeBool(b *buffer, tag int, x bool) {
  131. if x {
  132. encodeUint64(b, tag, 1)
  133. } else {
  134. encodeUint64(b, tag, 0)
  135. }
  136. }
  137. func encodeBoolOpt(b *buffer, tag int, x bool) {
  138. if x {
  139. encodeBool(b, tag, x)
  140. }
  141. }
  142. func encodeMessage(b *buffer, tag int, m message) {
  143. n1 := len(b.data)
  144. m.encode(b)
  145. n2 := len(b.data)
  146. encodeLength(b, tag, n2-n1)
  147. n3 := len(b.data)
  148. copy(b.tmp[:], b.data[n2:n3])
  149. copy(b.data[n1+(n3-n2):], b.data[n1:n2])
  150. copy(b.data[n1:], b.tmp[:n3-n2])
  151. }
  152. func unmarshal(data []byte, m message) (err error) {
  153. b := buffer{data: data, typ: 2}
  154. return decodeMessage(&b, m)
  155. }
  156. func le64(p []byte) uint64 {
  157. 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
  158. }
  159. func le32(p []byte) uint32 {
  160. return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
  161. }
  162. func decodeVarint(data []byte) (uint64, []byte, error) {
  163. var u uint64
  164. for i := 0; ; i++ {
  165. if i >= 10 || i >= len(data) {
  166. return 0, nil, errors.New("bad varint")
  167. }
  168. u |= uint64(data[i]&0x7F) << uint(7*i)
  169. if data[i]&0x80 == 0 {
  170. return u, data[i+1:], nil
  171. }
  172. }
  173. }
  174. func decodeField(b *buffer, data []byte) ([]byte, error) {
  175. x, data, err := decodeVarint(data)
  176. if err != nil {
  177. return nil, err
  178. }
  179. b.field = int(x >> 3)
  180. b.typ = int(x & 7)
  181. b.data = nil
  182. b.u64 = 0
  183. switch b.typ {
  184. case 0:
  185. b.u64, data, err = decodeVarint(data)
  186. if err != nil {
  187. return nil, err
  188. }
  189. case 1:
  190. if len(data) < 8 {
  191. return nil, errors.New("not enough data")
  192. }
  193. b.u64 = le64(data[:8])
  194. data = data[8:]
  195. case 2:
  196. var n uint64
  197. n, data, err = decodeVarint(data)
  198. if err != nil {
  199. return nil, err
  200. }
  201. if n > uint64(len(data)) {
  202. return nil, errors.New("too much data")
  203. }
  204. b.data = data[:n]
  205. data = data[n:]
  206. case 5:
  207. if len(data) < 4 {
  208. return nil, errors.New("not enough data")
  209. }
  210. b.u64 = uint64(le32(data[:4]))
  211. data = data[4:]
  212. default:
  213. return nil, errors.New("unknown wire type: " + string(b.typ))
  214. }
  215. return data, nil
  216. }
  217. func checkType(b *buffer, typ int) error {
  218. if b.typ != typ {
  219. return errors.New("type mismatch")
  220. }
  221. return nil
  222. }
  223. func decodeMessage(b *buffer, m message) error {
  224. if err := checkType(b, 2); err != nil {
  225. return err
  226. }
  227. dec := m.decoder()
  228. data := b.data
  229. for len(data) > 0 {
  230. // pull varint field# + type
  231. var err error
  232. data, err = decodeField(b, data)
  233. if err != nil {
  234. return err
  235. }
  236. if b.field >= len(dec) || dec[b.field] == nil {
  237. continue
  238. }
  239. if err := dec[b.field](b, m); err != nil {
  240. return err
  241. }
  242. }
  243. return nil
  244. }
  245. func decodeInt64(b *buffer, x *int64) error {
  246. if err := checkType(b, 0); err != nil {
  247. return err
  248. }
  249. *x = int64(b.u64)
  250. return nil
  251. }
  252. func decodeInt64s(b *buffer, x *[]int64) error {
  253. if b.typ == 2 {
  254. // Packed encoding
  255. data := b.data
  256. tmp := make([]int64, 0, len(data)) // Maximally sized
  257. for len(data) > 0 {
  258. var u uint64
  259. var err error
  260. if u, data, err = decodeVarint(data); err != nil {
  261. return err
  262. }
  263. tmp = append(tmp, int64(u))
  264. }
  265. *x = append(*x, tmp...)
  266. return nil
  267. }
  268. var i int64
  269. if err := decodeInt64(b, &i); err != nil {
  270. return err
  271. }
  272. *x = append(*x, i)
  273. return nil
  274. }
  275. func decodeUint64(b *buffer, x *uint64) error {
  276. if err := checkType(b, 0); err != nil {
  277. return err
  278. }
  279. *x = b.u64
  280. return nil
  281. }
  282. func decodeUint64s(b *buffer, x *[]uint64) error {
  283. if b.typ == 2 {
  284. data := b.data
  285. // Packed encoding
  286. tmp := make([]uint64, 0, len(data)) // Maximally sized
  287. for len(data) > 0 {
  288. var u uint64
  289. var err error
  290. if u, data, err = decodeVarint(data); err != nil {
  291. return err
  292. }
  293. tmp = append(tmp, u)
  294. }
  295. *x = append(*x, tmp...)
  296. return nil
  297. }
  298. var u uint64
  299. if err := decodeUint64(b, &u); err != nil {
  300. return err
  301. }
  302. *x = append(*x, u)
  303. return nil
  304. }
  305. func decodeString(b *buffer, x *string) error {
  306. if err := checkType(b, 2); err != nil {
  307. return err
  308. }
  309. *x = string(b.data)
  310. return nil
  311. }
  312. func decodeStrings(b *buffer, x *[]string) error {
  313. var s string
  314. if err := decodeString(b, &s); err != nil {
  315. return err
  316. }
  317. *x = append(*x, s)
  318. return nil
  319. }
  320. func decodeBool(b *buffer, x *bool) error {
  321. if err := checkType(b, 0); err != nil {
  322. return err
  323. }
  324. if int64(b.u64) == 0 {
  325. *x = false
  326. } else {
  327. *x = true
  328. }
  329. return nil
  330. }