reader.odin 4.3 KB

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