errors_windows.odin 1.6 KB

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