errors_windows.odin 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //+private
  2. package os2
  3. import "base:runtime"
  4. import "core:slice"
  5. import win32 "core:sys/windows"
  6. _error_string :: proc(errno: i32) -> string {
  7. e := win32.DWORD(errno)
  8. if e == 0 {
  9. return ""
  10. }
  11. err := runtime.Type_Info_Enum_Value(e)
  12. ti := &runtime.type_info_base(type_info_of(win32.System_Error)).variant.(runtime.Type_Info_Enum)
  13. if idx, ok := slice.binary_search(ti.values, err); ok {
  14. return ti.names[idx]
  15. }
  16. return "<unknown platform error>"
  17. }
  18. _get_platform_error :: proc() -> Error {
  19. err := win32.GetLastError()
  20. if err == 0 {
  21. return nil
  22. }
  23. switch err {
  24. case win32.ERROR_ACCESS_DENIED, win32.ERROR_SHARING_VIOLATION:
  25. return .Permission_Denied
  26. case win32.ERROR_FILE_EXISTS, win32.ERROR_ALREADY_EXISTS:
  27. return .Exist
  28. case win32.ERROR_FILE_NOT_FOUND, win32.ERROR_PATH_NOT_FOUND:
  29. return .Not_Exist
  30. case win32.ERROR_NO_DATA:
  31. return .Closed
  32. case win32.ERROR_TIMEOUT, win32.WAIT_TIMEOUT:
  33. return .Timeout
  34. case win32.ERROR_NOT_SUPPORTED:
  35. return .Unsupported
  36. case win32.ERROR_HANDLE_EOF:
  37. return .EOF
  38. case win32.ERROR_INVALID_HANDLE:
  39. return .Invalid_File
  40. case
  41. win32.ERROR_BAD_ARGUMENTS,
  42. win32.ERROR_INVALID_PARAMETER,
  43. win32.ERROR_NOT_ENOUGH_MEMORY,
  44. win32.ERROR_NO_MORE_FILES,
  45. win32.ERROR_LOCK_VIOLATION,
  46. win32.ERROR_BROKEN_PIPE,
  47. win32.ERROR_CALL_NOT_IMPLEMENTED,
  48. win32.ERROR_INSUFFICIENT_BUFFER,
  49. win32.ERROR_INVALID_NAME,
  50. win32.ERROR_LOCK_FAILED,
  51. win32.ERROR_ENVVAR_NOT_FOUND,
  52. win32.ERROR_OPERATION_ABORTED,
  53. win32.ERROR_IO_PENDING,
  54. win32.ERROR_NO_UNICODE_TRANSLATION:
  55. // fallthrough
  56. }
  57. return Platform_Error(err)
  58. }