reader.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. // All rights reserved. Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. package xdr
  5. import (
  6. "errors"
  7. "io"
  8. )
  9. var ErrElementSizeExceeded = errors.New("element size exceeded")
  10. type Reader struct {
  11. r io.Reader
  12. err error
  13. b [8]byte
  14. sb []byte
  15. }
  16. func NewReader(r io.Reader) *Reader {
  17. return &Reader{
  18. r: r,
  19. }
  20. }
  21. func (r *Reader) ReadString() string {
  22. if r.sb == nil {
  23. r.sb = make([]byte, 64)
  24. } else {
  25. r.sb = r.sb[:cap(r.sb)]
  26. }
  27. r.sb = r.ReadBytesInto(r.sb)
  28. return string(r.sb)
  29. }
  30. func (r *Reader) ReadStringMax(max int) string {
  31. if r.sb == nil {
  32. r.sb = make([]byte, 64)
  33. } else {
  34. r.sb = r.sb[:cap(r.sb)]
  35. }
  36. r.sb = r.ReadBytesMaxInto(max, r.sb)
  37. return string(r.sb)
  38. }
  39. func (r *Reader) ReadBytes() []byte {
  40. return r.ReadBytesInto(nil)
  41. }
  42. func (r *Reader) ReadBytesMax(max int) []byte {
  43. return r.ReadBytesMaxInto(max, nil)
  44. }
  45. func (r *Reader) ReadBytesInto(dst []byte) []byte {
  46. return r.ReadBytesMaxInto(0, dst)
  47. }
  48. func (r *Reader) ReadBytesMaxInto(max int, dst []byte) []byte {
  49. if r.err != nil {
  50. return nil
  51. }
  52. l := int(r.ReadUint32())
  53. if r.err != nil {
  54. return nil
  55. }
  56. if max > 0 && l > max {
  57. r.err = ErrElementSizeExceeded
  58. return nil
  59. }
  60. if l+pad(l) > len(dst) {
  61. dst = make([]byte, l+pad(l))
  62. } else {
  63. dst = dst[:l+pad(l)]
  64. }
  65. var n int
  66. n, r.err = io.ReadFull(r.r, dst)
  67. if r.err != nil {
  68. if debug {
  69. dl.Debugf("rd bytes (%d): %v", len(dst), r.err)
  70. }
  71. return nil
  72. }
  73. if debug {
  74. if n > maxDebugBytes {
  75. dl.Debugf("rd bytes (%d): %x...", len(dst), dst[:maxDebugBytes])
  76. } else {
  77. dl.Debugf("rd bytes (%d): %x", len(dst), dst)
  78. }
  79. }
  80. return dst[:l]
  81. }
  82. func (r *Reader) ReadBool() bool {
  83. return r.ReadUint32() != 0
  84. }
  85. func (r *Reader) ReadUint16() uint16 {
  86. return uint16(r.ReadUint32())
  87. }
  88. func (r *Reader) ReadUint32() uint32 {
  89. if r.err != nil {
  90. return 0
  91. }
  92. _, r.err = io.ReadFull(r.r, r.b[:4])
  93. if r.err != nil {
  94. if debug {
  95. dl.Debugf("rd uint32: %v", r.err)
  96. }
  97. return 0
  98. }
  99. v := uint32(r.b[3]) | uint32(r.b[2])<<8 | uint32(r.b[1])<<16 | uint32(r.b[0])<<24
  100. if debug {
  101. dl.Debugf("rd uint32=%d (0x%08x)", v, v)
  102. }
  103. return v
  104. }
  105. func (r *Reader) ReadUint64() uint64 {
  106. if r.err != nil {
  107. return 0
  108. }
  109. _, r.err = io.ReadFull(r.r, r.b[:8])
  110. if r.err != nil {
  111. if debug {
  112. dl.Debugf("rd uint64: %v", r.err)
  113. }
  114. return 0
  115. }
  116. v := uint64(r.b[7]) | uint64(r.b[6])<<8 | uint64(r.b[5])<<16 | uint64(r.b[4])<<24 |
  117. uint64(r.b[3])<<32 | uint64(r.b[2])<<40 | uint64(r.b[1])<<48 | uint64(r.b[0])<<56
  118. if debug {
  119. dl.Debugf("rd uint64=%d (0x%016x)", v, v)
  120. }
  121. return v
  122. }
  123. type XDRError struct {
  124. op string
  125. err error
  126. }
  127. func (e XDRError) Error() string {
  128. return "xdr " + e.op + ": " + e.err.Error()
  129. }
  130. func (r *Reader) Error() error {
  131. if r.err == nil {
  132. return nil
  133. }
  134. return XDRError{"read", r.err}
  135. }