stream.odin 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package os
  2. import "core:io"
  3. stream_from_handle :: proc(fd: Handle) -> io.Stream {
  4. s: io.Stream
  5. s.data = rawptr(uintptr(fd))
  6. s.procedure = _file_stream_proc
  7. return s
  8. }
  9. @(private)
  10. _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
  11. fd := Handle(uintptr(stream_data))
  12. n_int: int
  13. os_err: Error
  14. switch mode {
  15. case .Close:
  16. os_err = close(fd)
  17. case .Flush:
  18. os_err = flush(fd)
  19. case .Read:
  20. if len(p) == 0 {
  21. return 0, nil
  22. }
  23. n_int, os_err = read(fd, p)
  24. n = i64(n_int)
  25. if n == 0 && os_err == nil {
  26. err = .EOF
  27. }
  28. case .Read_At:
  29. if len(p) == 0 {
  30. return 0, nil
  31. }
  32. n_int, os_err = read_at(fd, p, offset)
  33. n = i64(n_int)
  34. if n == 0 && os_err == nil {
  35. err = .EOF
  36. }
  37. case .Write:
  38. if len(p) == 0 {
  39. return 0, nil
  40. }
  41. n_int, os_err = write(fd, p)
  42. n = i64(n_int)
  43. if n == 0 && os_err == nil {
  44. err = .EOF
  45. }
  46. case .Write_At:
  47. if len(p) == 0 {
  48. return 0, nil
  49. }
  50. n_int, os_err = write_at(fd, p, offset)
  51. n = i64(n_int)
  52. if n == 0 && os_err == nil {
  53. err = .EOF
  54. }
  55. case .Seek:
  56. n, os_err = seek(fd, offset, int(whence))
  57. case .Size:
  58. n, os_err = file_size(fd)
  59. case .Destroy:
  60. err = .Empty
  61. case .Query:
  62. return io.query_utility({.Close, .Flush, .Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Query})
  63. }
  64. if err == nil && os_err != nil {
  65. err = error_to_io_error(os_err)
  66. }
  67. if err != nil {
  68. n = 0
  69. }
  70. return
  71. }