reader.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package xdr
  2. import (
  3. "errors"
  4. "io"
  5. )
  6. var ErrElementSizeExceeded = errors.New("element size exceeded")
  7. type Reader struct {
  8. r io.Reader
  9. tot int
  10. err error
  11. b [8]byte
  12. }
  13. func NewReader(r io.Reader) *Reader {
  14. return &Reader{
  15. r: r,
  16. }
  17. }
  18. func (r *Reader) ReadString() string {
  19. return string(r.ReadBytes())
  20. }
  21. func (r *Reader) ReadStringMax(max int) string {
  22. return string(r.ReadBytesMax(max))
  23. }
  24. func (r *Reader) ReadBytes() []byte {
  25. return r.ReadBytesInto(nil)
  26. }
  27. func (r *Reader) ReadBytesMax(max int) []byte {
  28. return r.ReadBytesMaxInto(max, nil)
  29. }
  30. func (r *Reader) ReadBytesInto(dst []byte) []byte {
  31. return r.ReadBytesMaxInto(0, dst)
  32. }
  33. func (r *Reader) ReadBytesMaxInto(max int, dst []byte) []byte {
  34. if r.err != nil {
  35. return nil
  36. }
  37. l := int(r.ReadUint32())
  38. if r.err != nil {
  39. return nil
  40. }
  41. if max > 0 && l > max {
  42. r.err = ErrElementSizeExceeded
  43. return nil
  44. }
  45. if l+pad(l) > len(dst) {
  46. dst = make([]byte, l+pad(l))
  47. } else {
  48. dst = dst[:l+pad(l)]
  49. }
  50. var n int
  51. n, r.err = io.ReadFull(r.r, dst)
  52. r.tot += n
  53. if debug {
  54. if n > maxDebugBytes {
  55. dl.Debugf("rd bytes (%d): %x...", n, dst[:maxDebugBytes])
  56. } else {
  57. dl.Debugf("rd bytes (%d): %x", n, dst)
  58. }
  59. }
  60. return dst[:l]
  61. }
  62. func (r *Reader) ReadUint16() uint16 {
  63. if r.err != nil {
  64. return 0
  65. }
  66. _, r.err = io.ReadFull(r.r, r.b[:4])
  67. r.tot += 4
  68. v := uint16(r.b[1]) | uint16(r.b[0])<<8
  69. if debug {
  70. dl.Debugf("rd uint16=%d", v)
  71. }
  72. return v
  73. }
  74. func (r *Reader) ReadUint32() uint32 {
  75. var n int
  76. if r.err != nil {
  77. return 0
  78. }
  79. n, r.err = io.ReadFull(r.r, r.b[:4])
  80. if n < 4 {
  81. return 0
  82. }
  83. r.tot += n
  84. v := uint32(r.b[3]) | uint32(r.b[2])<<8 | uint32(r.b[1])<<16 | uint32(r.b[0])<<24
  85. if debug {
  86. dl.Debugf("rd uint32=%d", v)
  87. }
  88. return v
  89. }
  90. func (r *Reader) ReadUint64() uint64 {
  91. var n int
  92. if r.err != nil {
  93. return 0
  94. }
  95. n, r.err = io.ReadFull(r.r, r.b[:8])
  96. r.tot += n
  97. v := uint64(r.b[7]) | uint64(r.b[6])<<8 | uint64(r.b[5])<<16 | uint64(r.b[4])<<24 |
  98. uint64(r.b[3])<<32 | uint64(r.b[2])<<40 | uint64(r.b[1])<<48 | uint64(r.b[0])<<56
  99. if debug {
  100. dl.Debugf("rd uint64=%d", v)
  101. }
  102. return v
  103. }
  104. func (r *Reader) Tot() int {
  105. return r.tot
  106. }
  107. func (r *Reader) Error() error {
  108. return r.err
  109. }