reader.odin 4.4 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. };