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" {
  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" {
  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. };