reader.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package bufio
  2. import (
  3. "bytes"
  4. "io"
  5. "log"
  6. )
  7. var (
  8. ReadBufferSize = 1024
  9. )
  10. func DelimRemove(data, delim []byte) []byte {
  11. if bytes.HasSuffix(data, delim) {
  12. data = data[:len(data)-len(delim)+1]
  13. }
  14. return data
  15. }
  16. func NewReader(r io.Reader) *Reader {
  17. return &Reader{
  18. r: r,
  19. }
  20. }
  21. type Reader struct {
  22. r io.Reader
  23. buf bytes.Buffer
  24. seek int
  25. }
  26. func (s *Reader) fromBuf(data []byte) (res []byte) {
  27. if s.buf.Len() > 0 {
  28. res = append(s.buf.Bytes(), data...)
  29. s.buf.Reset()
  30. s.seek = 0
  31. } else {
  32. res = data
  33. }
  34. return
  35. }
  36. func (s *Reader) toBuf(data []byte) {
  37. s.seek = s.buf.Len()
  38. s.buf.Write(data)
  39. }
  40. func (s *Reader) scanBuf(delim []byte) (res []byte, check bool) {
  41. buf := s.buf.Bytes()[s.seek:]
  42. if index := bytes.Index(buf, delim); index >= 0 {
  43. rSize := s.seek + index + len(delim)
  44. check, res = true, make([]byte, rSize)
  45. s.buf.Read(res)
  46. s.seek = 0
  47. } else {
  48. s.seek = s.buf.Len()
  49. }
  50. return
  51. }
  52. func (s *Reader) scanNeeded() bool {
  53. return s.seek < s.buf.Len()
  54. }
  55. func (s *Reader) readBufferSize(delim []byte) int {
  56. if ReadBufferSize >= len(delim) {
  57. return ReadBufferSize
  58. }
  59. return len(delim)
  60. }
  61. func (s *Reader) ReadBytes(delim []byte) (res []byte, err error) {
  62. var check bool
  63. // scan internal buffer
  64. if s.scanNeeded() {
  65. log.Println("NEEDED")
  66. if res, check = s.scanBuf(delim); check {
  67. return
  68. }
  69. }
  70. // read from external buffer
  71. buf, count := make([]byte, s.readBufferSize(delim)), 0
  72. for {
  73. if count, err = s.r.Read(buf); count > 0 {
  74. s.buf.Write(buf[:count])
  75. for s.scanNeeded() {
  76. if res, check = s.scanBuf(delim); check {
  77. return
  78. }
  79. }
  80. }
  81. if err != nil {
  82. if err == io.EOF && s.buf.Len() > 0 {
  83. res, check = s.buf.Bytes(), true
  84. s.buf.Reset()
  85. }
  86. return
  87. }
  88. }
  89. }