file_stream.odin 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package os2
  2. import "core:io"
  3. file_to_stream :: proc(fd: Handle) -> (s: io.Stream) {
  4. s.stream_data = rawptr(uintptr(fd));
  5. s.stream_vtable = _file_stream_vtable;
  6. return;
  7. }
  8. @(private)
  9. error_to_io_error :: proc(ferr: Error) -> io.Error {
  10. #partial switch ferr {
  11. case .None: return .None;
  12. case .EOF: return .EOF;
  13. case .Unexpected_EOF: return .Unexpected_EOF;
  14. case .Short_Write: return .Short_Write;
  15. case .Invalid_Write: return .Invalid_Write;
  16. case .Short_Buffer: return .Short_Buffer;
  17. case .No_Progress: return .No_Progress;
  18. case .Invalid_Whence: return .Invalid_Whence;
  19. case .Invalid_Offset: return .Invalid_Offset;
  20. case .Invalid_Unread: return .Invalid_Unread;
  21. case .Negative_Read: return .Negative_Read;
  22. case .Negative_Write: return .Negative_Write;
  23. case .Negative_Count: return .Negative_Count;
  24. case .Buffer_Full: return .Buffer_Full;
  25. }
  26. return .Unknown;
  27. }
  28. @(private)
  29. _file_stream_vtable := &io.Stream_VTable{
  30. impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
  31. fd := Handle(uintptr(s.stream_data));
  32. ferr: Error;
  33. n, ferr = read(fd, p);
  34. err = error_to_io_error(ferr);
  35. return;
  36. },
  37. impl_read_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
  38. fd := Handle(uintptr(s.stream_data));
  39. ferr: Error;
  40. n, ferr = read_at(fd, p, offset);
  41. err = error_to_io_error(ferr);
  42. return;
  43. },
  44. impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
  45. fd := Handle(uintptr(s.stream_data));
  46. ferr: Error;
  47. n, ferr = write_to(fd, w);
  48. err = error_to_io_error(ferr);
  49. return;
  50. },
  51. impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
  52. fd := Handle(uintptr(s.stream_data));
  53. ferr: Error;
  54. n, ferr = write(fd, p);
  55. err = error_to_io_error(ferr);
  56. return;
  57. },
  58. impl_write_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
  59. fd := Handle(uintptr(s.stream_data));
  60. ferr: Error;
  61. n, ferr = write_at(fd, p, offset);
  62. err = error_to_io_error(ferr);
  63. return;
  64. },
  65. impl_read_from = proc(s: io.Stream, r: io.Reader) -> (n: i64, err: io.Error) {
  66. fd := Handle(uintptr(s.stream_data));
  67. ferr: Error;
  68. n, ferr = read_from(fd, r);
  69. err = error_to_io_error(ferr);
  70. return;
  71. },
  72. impl_seek = proc(s: io.Stream, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
  73. fd := Handle(uintptr(s.stream_data));
  74. n, ferr := seek(fd, offset, Seek_From(whence));
  75. err := error_to_io_error(ferr);
  76. return n, err;
  77. },
  78. impl_size = proc(s: io.Stream) -> i64 {
  79. fd := Handle(uintptr(s.stream_data));
  80. sz, _ := file_size(fd);
  81. return sz;
  82. },
  83. impl_flush = proc(s: io.Stream) -> io.Error {
  84. fd := Handle(uintptr(s.stream_data));
  85. ferr := flush(fd);
  86. return error_to_io_error(ferr);
  87. },
  88. impl_close = proc(s: io.Stream) -> io.Error {
  89. fd := Handle(uintptr(s.stream_data));
  90. ferr := close(fd);
  91. return error_to_io_error(ferr);
  92. },
  93. };