stream.odin 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package os
  2. import "core:io"
  3. stream_from_handle :: proc(fd: Handle) -> io.Stream {
  4. s: io.Stream
  5. s.stream_data = rawptr(uintptr(fd))
  6. s.stream_vtable = _file_stream_vtable
  7. return s
  8. }
  9. @(private)
  10. _file_stream_vtable := &io.Stream_VTable{
  11. impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
  12. fd := Handle(uintptr(s.stream_data))
  13. os_err: Errno
  14. n, os_err = read(fd, p)
  15. return
  16. },
  17. impl_read_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
  18. when ODIN_OS == "windows" || ODIN_OS == "wasi" {
  19. fd := Handle(uintptr(s.stream_data))
  20. os_err: Errno
  21. n, os_err = read_at(fd, p, offset)
  22. }
  23. return
  24. },
  25. impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
  26. fd := Handle(uintptr(s.stream_data))
  27. os_err: Errno
  28. n, os_err = write(fd, p)
  29. return
  30. },
  31. impl_write_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
  32. when ODIN_OS == "windows" || ODIN_OS == "wasi" {
  33. fd := Handle(uintptr(s.stream_data))
  34. os_err: Errno
  35. n, os_err = write_at(fd, p, offset)
  36. _ = os_err
  37. }
  38. return
  39. },
  40. impl_seek = proc(s: io.Stream, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
  41. fd := Handle(uintptr(s.stream_data))
  42. n, os_err := seek(fd, offset, int(whence))
  43. _ = os_err
  44. return n, nil
  45. },
  46. impl_size = proc(s: io.Stream) -> i64 {
  47. fd := Handle(uintptr(s.stream_data))
  48. sz, _ := file_size(fd)
  49. return sz
  50. },
  51. impl_flush = proc(s: io.Stream) -> io.Error {
  52. when ODIN_OS == "windows" {
  53. fd := Handle(uintptr(s.stream_data))
  54. flush(fd)
  55. } else {
  56. // TOOD(bill): other operating systems
  57. }
  58. return nil
  59. },
  60. impl_close = proc(s: io.Stream) -> io.Error {
  61. fd := Handle(uintptr(s.stream_data))
  62. close(fd)
  63. return nil
  64. },
  65. }