reader.odin 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package bytes
  2. import "core:io"
  3. import "core:unicode/utf8"
  4. Reader :: struct {
  5. s: []byte, // read-only buffer
  6. i: i64, // current reading index
  7. prev_rune: int, // previous reading index of rune or < 0
  8. }
  9. reader_init :: proc(r: ^Reader, s: []byte) {
  10. r.s = s
  11. r.i = 0
  12. r.prev_rune = -1
  13. }
  14. reader_to_stream :: proc(r: ^Reader) -> (s: io.Stream) {
  15. s.stream_data = r
  16. s.stream_vtable = &_reader_vtable
  17. return
  18. }
  19. reader_length :: proc(r: ^Reader) -> int {
  20. if r.i >= i64(len(r.s)) {
  21. return 0
  22. }
  23. return int(i64(len(r.s)) - r.i)
  24. }
  25. reader_size :: proc(r: ^Reader) -> i64 {
  26. return i64(len(r.s))
  27. }
  28. reader_read :: proc(r: ^Reader, p: []byte) -> (n: int, err: io.Error) {
  29. if r.i >= i64(len(r.s)) {
  30. return 0, .EOF
  31. }
  32. r.prev_rune = -1
  33. n = copy(p, r.s[r.i:])
  34. r.i += i64(n)
  35. return
  36. }
  37. reader_read_at :: proc(r: ^Reader, p: []byte, off: i64) -> (n: int, err: io.Error) {
  38. if off < 0 {
  39. return 0, .Invalid_Offset
  40. }
  41. if off >= i64(len(r.s)) {
  42. return 0, .EOF
  43. }
  44. n = copy(p, r.s[off:])
  45. if n < len(p) {
  46. err = .EOF
  47. }
  48. return
  49. }
  50. reader_read_byte :: proc(r: ^Reader) -> (byte, io.Error) {
  51. r.prev_rune = -1
  52. if r.i >= i64(len(r.s)) {
  53. return 0, .EOF
  54. }
  55. b := r.s[r.i]
  56. r.i += 1
  57. return b, nil
  58. }
  59. reader_unread_byte :: proc(r: ^Reader) -> io.Error {
  60. if r.i <= 0 {
  61. return .Invalid_Unread
  62. }
  63. r.prev_rune = -1
  64. r.i -= 1
  65. return nil
  66. }
  67. reader_read_rune :: proc(r: ^Reader) -> (ch: rune, size: int, err: io.Error) {
  68. if r.i >= i64(len(r.s)) {
  69. r.prev_rune = -1
  70. return 0, 0, .EOF
  71. }
  72. r.prev_rune = int(r.i)
  73. if c := r.s[r.i]; c < utf8.RUNE_SELF {
  74. r.i += 1
  75. return rune(c), 1, nil
  76. }
  77. ch, size = utf8.decode_rune(r.s[r.i:])
  78. r.i += i64(size)
  79. return
  80. }
  81. reader_unread_rune :: proc(r: ^Reader) -> io.Error {
  82. if r.i <= 0 {
  83. return .Invalid_Unread
  84. }
  85. if r.prev_rune < 0 {
  86. return .Invalid_Unread
  87. }
  88. r.i = i64(r.prev_rune)
  89. r.prev_rune = -1
  90. return nil
  91. }
  92. reader_seek :: proc(r: ^Reader, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
  93. r.prev_rune = -1
  94. abs: i64
  95. switch whence {
  96. case .Start:
  97. abs = offset
  98. case .Current:
  99. abs = r.i + offset
  100. case .End:
  101. abs = i64(len(r.s)) + offset
  102. case:
  103. return 0, .Invalid_Whence
  104. }
  105. if abs < 0 {
  106. return 0, .Invalid_Offset
  107. }
  108. r.i = abs
  109. return abs, nil
  110. }
  111. reader_write_to :: proc(r: ^Reader, w: io.Writer) -> (n: i64, err: io.Error) {
  112. r.prev_rune = -1
  113. if r.i >= i64(len(r.s)) {
  114. return 0, nil
  115. }
  116. s := r.s[r.i:]
  117. m: int
  118. m, err = io.write(w, s)
  119. if m > len(s) {
  120. panic("bytes.Reader.write_to: invalid io.write_string count")
  121. }
  122. r.i += i64(m)
  123. n = i64(m)
  124. if m != len(s) && err == nil {
  125. err = .Short_Write
  126. }
  127. return
  128. }
  129. @(private)
  130. _reader_vtable := io.Stream_VTable{
  131. impl_size = proc(s: io.Stream) -> i64 {
  132. r := (^Reader)(s.stream_data)
  133. return reader_size(r)
  134. },
  135. impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
  136. r := (^Reader)(s.stream_data)
  137. return reader_read(r, p)
  138. },
  139. impl_read_at = proc(s: io.Stream, p: []byte, off: i64) -> (n: int, err: io.Error) {
  140. r := (^Reader)(s.stream_data)
  141. return reader_read_at(r, p, off)
  142. },
  143. impl_read_byte = proc(s: io.Stream) -> (byte, io.Error) {
  144. r := (^Reader)(s.stream_data)
  145. return reader_read_byte(r)
  146. },
  147. impl_unread_byte = proc(s: io.Stream) -> io.Error {
  148. r := (^Reader)(s.stream_data)
  149. return reader_unread_byte(r)
  150. },
  151. impl_read_rune = proc(s: io.Stream) -> (ch: rune, size: int, err: io.Error) {
  152. r := (^Reader)(s.stream_data)
  153. return reader_read_rune(r)
  154. },
  155. impl_unread_rune = proc(s: io.Stream) -> io.Error {
  156. r := (^Reader)(s.stream_data)
  157. return reader_unread_rune(r)
  158. },
  159. impl_seek = proc(s: io.Stream, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
  160. r := (^Reader)(s.stream_data)
  161. return reader_seek(r, offset, whence)
  162. },
  163. impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
  164. r := (^Reader)(s.stream_data)
  165. return reader_write_to(r, w)
  166. },
  167. }