buffer.odin 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. package bytes
  2. import "core:io"
  3. import "core:unicode/utf8"
  4. MIN_READ :: 512
  5. @(private)
  6. SMALL_BUFFER_SIZE :: 64
  7. // A Buffer is a variable-sized buffer of bytes with a io.Stream interface
  8. // The zero value for Buffer is an empty buffer ready to use.
  9. Buffer :: struct {
  10. buf: [dynamic]byte,
  11. off: int,
  12. last_read: Read_Op,
  13. }
  14. @(private)
  15. Read_Op :: enum i8 {
  16. Read = -1,
  17. Invalid = 0,
  18. Read_Rune1 = 1,
  19. Read_Rune2 = 2,
  20. Read_Rune3 = 3,
  21. Read_Rune4 = 4,
  22. }
  23. buffer_init :: proc(b: ^Buffer, buf: []byte) {
  24. resize(&b.buf, len(buf))
  25. copy(b.buf[:], buf)
  26. }
  27. buffer_init_string :: proc(b: ^Buffer, s: string) {
  28. resize(&b.buf, len(s))
  29. copy(b.buf[:], s)
  30. }
  31. buffer_init_allocator :: proc(b: ^Buffer, len, cap: int, allocator := context.allocator) {
  32. b.buf.allocator = allocator
  33. reserve(&b.buf, cap)
  34. resize(&b.buf, len)
  35. }
  36. buffer_destroy :: proc(b: ^Buffer) {
  37. delete(b.buf)
  38. buffer_reset(b)
  39. }
  40. buffer_to_bytes :: proc(b: ^Buffer) -> []byte {
  41. return b.buf[b.off:]
  42. }
  43. buffer_to_string :: proc(b: ^Buffer) -> string {
  44. if b == nil {
  45. return "<nil>"
  46. }
  47. return string(b.buf[b.off:])
  48. }
  49. buffer_is_empty :: proc(b: ^Buffer) -> bool {
  50. return len(b.buf) <= b.off
  51. }
  52. buffer_length :: proc(b: ^Buffer) -> int {
  53. return len(b.buf) - b.off
  54. }
  55. buffer_capacity :: proc(b: ^Buffer) -> int {
  56. return cap(b.buf)
  57. }
  58. buffer_reset :: proc(b: ^Buffer) {
  59. clear(&b.buf)
  60. b.off = 0
  61. b.last_read = .Invalid
  62. }
  63. buffer_truncate :: proc(b: ^Buffer, n: int) {
  64. if n == 0 {
  65. buffer_reset(b)
  66. return
  67. }
  68. b.last_read = .Invalid
  69. if n < 0 || n > buffer_length(b) {
  70. panic("bytes.truncate: truncation out of range")
  71. }
  72. resize(&b.buf, b.off+n)
  73. }
  74. @(private)
  75. _buffer_try_grow :: proc(b: ^Buffer, n: int) -> (int, bool) {
  76. if l := len(b.buf); n <= cap(b.buf)-l {
  77. resize(&b.buf, l+n)
  78. return l, true
  79. }
  80. return 0, false
  81. }
  82. @(private)
  83. _buffer_grow :: proc(b: ^Buffer, n: int) -> int {
  84. m := buffer_length(b)
  85. if m == 0 && b.off != 0 {
  86. buffer_reset(b)
  87. }
  88. if i, ok := _buffer_try_grow(b, n); ok {
  89. return i
  90. }
  91. if b.buf == nil && n <= SMALL_BUFFER_SIZE {
  92. b.buf = make([dynamic]byte, n, SMALL_BUFFER_SIZE)
  93. return 0
  94. }
  95. c := cap(b.buf)
  96. if n <= c/2 - m {
  97. copy(b.buf[:], b.buf[b.off:])
  98. } else if c > max(int) - c - n {
  99. panic("bytes.Buffer: too large")
  100. } else {
  101. resize(&b.buf, 2*c + n)
  102. copy(b.buf[:], b.buf[b.off:])
  103. }
  104. b.off = 0
  105. resize(&b.buf, m+n)
  106. return m
  107. }
  108. buffer_grow :: proc(b: ^Buffer, n: int) {
  109. if n < 0 {
  110. panic("bytes.buffer_grow: negative count")
  111. }
  112. m := _buffer_grow(b, n)
  113. resize(&b.buf, m)
  114. }
  115. buffer_write_at :: proc(b: ^Buffer, p: []byte, offset: int) -> (n: int, err: io.Error) {
  116. b.last_read = .Invalid
  117. if offset < 0 {
  118. err = .Invalid_Offset
  119. return
  120. }
  121. _, ok := _buffer_try_grow(b, offset+len(p))
  122. if !ok {
  123. _ = _buffer_grow(b, offset+len(p))
  124. }
  125. if len(b.buf) <= offset {
  126. return 0, .Short_Write
  127. }
  128. return copy(b.buf[offset:], p), nil
  129. }
  130. buffer_write :: proc(b: ^Buffer, p: []byte) -> (n: int, err: io.Error) {
  131. b.last_read = .Invalid
  132. m, ok := _buffer_try_grow(b, len(p))
  133. if !ok {
  134. m = _buffer_grow(b, len(p))
  135. }
  136. return copy(b.buf[m:], p), nil
  137. }
  138. buffer_write_ptr :: proc(b: ^Buffer, ptr: rawptr, size: int) -> (n: int, err: io.Error) {
  139. return buffer_write(b, ([^]byte)(ptr)[:size])
  140. }
  141. buffer_write_string :: proc(b: ^Buffer, s: string) -> (n: int, err: io.Error) {
  142. b.last_read = .Invalid
  143. m, ok := _buffer_try_grow(b, len(s))
  144. if !ok {
  145. m = _buffer_grow(b, len(s))
  146. }
  147. return copy(b.buf[m:], s), nil
  148. }
  149. buffer_write_byte :: proc(b: ^Buffer, c: byte) -> io.Error {
  150. b.last_read = .Invalid
  151. m, ok := _buffer_try_grow(b, 1)
  152. if !ok {
  153. m = _buffer_grow(b, 1)
  154. }
  155. b.buf[m] = c
  156. return nil
  157. }
  158. buffer_write_rune :: proc(b: ^Buffer, r: rune) -> (n: int, err: io.Error) {
  159. if r < utf8.RUNE_SELF {
  160. buffer_write_byte(b, byte(r))
  161. return 1, nil
  162. }
  163. b.last_read = .Invalid
  164. m, ok := _buffer_try_grow(b, utf8.UTF_MAX)
  165. if !ok {
  166. m = _buffer_grow(b, utf8.UTF_MAX)
  167. }
  168. res: [4]byte
  169. res, n = utf8.encode_rune(r)
  170. copy(b.buf[m:][:utf8.UTF_MAX], res[:n])
  171. resize(&b.buf, m+n)
  172. return
  173. }
  174. buffer_next :: proc(b: ^Buffer, n: int) -> []byte {
  175. n := n
  176. b.last_read = .Invalid
  177. m := buffer_length(b)
  178. if n > m {
  179. n = m
  180. }
  181. data := b.buf[b.off : b.off + n]
  182. b.off += n
  183. if n > 0 {
  184. b.last_read = .Read
  185. }
  186. return data
  187. }
  188. buffer_read :: proc(b: ^Buffer, p: []byte) -> (n: int, err: io.Error) {
  189. b.last_read = .Invalid
  190. if buffer_is_empty(b) {
  191. buffer_reset(b)
  192. if len(p) == 0 {
  193. return 0, nil
  194. }
  195. return 0, .EOF
  196. }
  197. n = copy(p, b.buf[b.off:])
  198. b.off += n
  199. if n > 0 {
  200. b.last_read = .Read
  201. }
  202. return
  203. }
  204. buffer_read_ptr :: proc(b: ^Buffer, ptr: rawptr, size: int) -> (n: int, err: io.Error) {
  205. return buffer_read(b, ([^]byte)(ptr)[:size])
  206. }
  207. buffer_read_at :: proc(b: ^Buffer, p: []byte, offset: int) -> (n: int, err: io.Error) {
  208. b.last_read = .Invalid
  209. if offset < 0 || offset >= len(b.buf) {
  210. err = .Invalid_Offset
  211. return
  212. }
  213. if 0 <= offset && offset < len(b.buf) {
  214. n = copy(p, b.buf[offset:])
  215. }
  216. if n > 0 {
  217. b.last_read = .Read
  218. }
  219. return
  220. }
  221. buffer_read_byte :: proc(b: ^Buffer) -> (byte, io.Error) {
  222. if buffer_is_empty(b) {
  223. buffer_reset(b)
  224. return 0, .EOF
  225. }
  226. c := b.buf[b.off]
  227. b.off += 1
  228. b.last_read = .Read
  229. return c, nil
  230. }
  231. buffer_read_rune :: proc(b: ^Buffer) -> (r: rune, size: int, err: io.Error) {
  232. if buffer_is_empty(b) {
  233. buffer_reset(b)
  234. return 0, 0, .EOF
  235. }
  236. c := b.buf[b.off]
  237. if c < utf8.RUNE_SELF {
  238. b.off += 1
  239. b.last_read = .Read_Rune1
  240. return rune(c), 1, nil
  241. }
  242. r, size = utf8.decode_rune(b.buf[b.off:])
  243. b.off += size
  244. b.last_read = Read_Op(i8(size))
  245. return
  246. }
  247. buffer_unread_byte :: proc(b: ^Buffer) -> io.Error {
  248. if b.last_read == .Invalid {
  249. return .Invalid_Unread
  250. }
  251. b.last_read = .Invalid
  252. if b.off > 0 {
  253. b.off -= 1
  254. }
  255. return nil
  256. }
  257. buffer_unread_rune :: proc(b: ^Buffer) -> io.Error {
  258. if b.last_read <= .Invalid {
  259. return .Invalid_Unread
  260. }
  261. if b.off >= int(b.last_read) {
  262. b.off -= int(i8(b.last_read))
  263. }
  264. b.last_read = .Invalid
  265. return nil
  266. }
  267. buffer_read_bytes :: proc(b: ^Buffer, delim: byte) -> (line: []byte, err: io.Error) {
  268. i := index_byte(b.buf[b.off:], delim)
  269. end := b.off + i + 1
  270. if i < 0 {
  271. end = len(b.buf)
  272. err = .EOF
  273. }
  274. line = b.buf[b.off:end]
  275. b.off = end
  276. b.last_read = .Read
  277. return
  278. }
  279. buffer_read_string :: proc(b: ^Buffer, delim: byte) -> (line: string, err: io.Error) {
  280. slice: []byte
  281. slice, err = buffer_read_bytes(b, delim)
  282. return string(slice), err
  283. }
  284. buffer_write_to :: proc(b: ^Buffer, w: io.Writer) -> (n: i64, err: io.Error) {
  285. b.last_read = .Invalid
  286. if byte_count := buffer_length(b); byte_count > 0 {
  287. m, e := io.write(w, b.buf[b.off:])
  288. if m > byte_count {
  289. panic("bytes.buffer_write_to: invalid io.write count")
  290. }
  291. b.off += m
  292. n = i64(m)
  293. if e != nil {
  294. err = e
  295. return
  296. }
  297. if m != byte_count {
  298. err = .Short_Write
  299. return
  300. }
  301. }
  302. buffer_reset(b)
  303. return
  304. }
  305. buffer_read_from :: proc(b: ^Buffer, r: io.Reader) -> (n: i64, err: io.Error) #no_bounds_check {
  306. b.last_read = .Invalid
  307. for {
  308. i := _buffer_grow(b, MIN_READ)
  309. resize(&b.buf, i)
  310. m, e := io.read(r, b.buf[i:cap(b.buf)])
  311. if m < 0 {
  312. err = .Negative_Read
  313. return
  314. }
  315. resize(&b.buf, i+m)
  316. n += i64(m)
  317. if e == .EOF {
  318. return
  319. }
  320. if e != nil {
  321. err = e
  322. return
  323. }
  324. }
  325. return
  326. }
  327. buffer_to_stream :: proc(b: ^Buffer) -> (s: io.Stream) {
  328. s.stream_data = b
  329. s.stream_vtable = _buffer_vtable
  330. return
  331. }
  332. @(private)
  333. _buffer_vtable := &io.Stream_VTable{
  334. impl_size = proc(s: io.Stream) -> i64 {
  335. b := (^Buffer)(s.stream_data)
  336. return i64(buffer_capacity(b))
  337. },
  338. impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
  339. b := (^Buffer)(s.stream_data)
  340. return buffer_read(b, p)
  341. },
  342. impl_read_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
  343. b := (^Buffer)(s.stream_data)
  344. return buffer_read_at(b, p, int(offset))
  345. },
  346. impl_read_byte = proc(s: io.Stream) -> (byte, io.Error) {
  347. b := (^Buffer)(s.stream_data)
  348. return buffer_read_byte(b)
  349. },
  350. impl_read_rune = proc(s: io.Stream) -> (r: rune, size: int, err: io.Error) {
  351. b := (^Buffer)(s.stream_data)
  352. return buffer_read_rune(b)
  353. },
  354. impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
  355. b := (^Buffer)(s.stream_data)
  356. return buffer_write(b, p)
  357. },
  358. impl_write_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
  359. b := (^Buffer)(s.stream_data)
  360. return buffer_write_at(b, p, int(offset))
  361. },
  362. impl_write_byte = proc(s: io.Stream, c: byte) -> io.Error {
  363. b := (^Buffer)(s.stream_data)
  364. return buffer_write_byte(b, c)
  365. },
  366. impl_write_rune = proc(s: io.Stream, r: rune) -> (int, io.Error) {
  367. b := (^Buffer)(s.stream_data)
  368. return buffer_write_rune(b, r)
  369. },
  370. impl_unread_byte = proc(s: io.Stream) -> io.Error {
  371. b := (^Buffer)(s.stream_data)
  372. return buffer_unread_byte(b)
  373. },
  374. impl_unread_rune = proc(s: io.Stream) -> io.Error {
  375. b := (^Buffer)(s.stream_data)
  376. return buffer_unread_rune(b)
  377. },
  378. impl_destroy = proc(s: io.Stream) -> io.Error {
  379. b := (^Buffer)(s.stream_data)
  380. buffer_destroy(b)
  381. return nil
  382. },
  383. impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
  384. b := (^Buffer)(s.stream_data)
  385. return buffer_write_to(b, w)
  386. },
  387. impl_read_from = proc(s: io.Stream, r: io.Reader) -> (n: i64, err: io.Error) {
  388. b := (^Buffer)(s.stream_data)
  389. return buffer_read_from(b, r)
  390. },
  391. }