file.odin 963 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package mem_virtual
  2. import "core:os"
  3. Map_File_Error :: enum {
  4. None,
  5. Open_Failure,
  6. Stat_Failure,
  7. Negative_Size,
  8. Too_Large_Size,
  9. Map_Failure,
  10. }
  11. Map_File_Flag :: enum u32 {
  12. Read,
  13. Write,
  14. }
  15. Map_File_Flags :: distinct bit_set[Map_File_Flag; u32]
  16. map_file :: proc{
  17. map_file_from_path,
  18. map_file_from_file_descriptor,
  19. }
  20. map_file_from_path :: proc(filename: string, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) {
  21. fd, err := os.open(filename, os.O_RDWR)
  22. if err != 0 {
  23. return nil, .Open_Failure
  24. }
  25. defer os.close(fd)
  26. return map_file_from_file_descriptor(uintptr(fd), flags)
  27. }
  28. map_file_from_file_descriptor :: proc(fd: uintptr, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) {
  29. size, os_err := os.file_size(os.Handle(fd))
  30. if os_err != 0 {
  31. return nil, .Stat_Failure
  32. }
  33. if size < 0 {
  34. return nil, .Negative_Size
  35. }
  36. if size != i64(int(size)) {
  37. return nil, .Too_Large_Size
  38. }
  39. return _map_file(fd, size, flags)
  40. }