mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Redesign os2.Error to work with the new extended union behaviour
This commit is contained in:
+18
-47
@@ -1,11 +1,8 @@
|
|||||||
package os2
|
package os2
|
||||||
|
|
||||||
Platform_Error_Min_Bits :: 32;
|
import "core:io"
|
||||||
|
|
||||||
Error :: enum u64 {
|
General_Error :: enum u32 {
|
||||||
None = 0,
|
|
||||||
|
|
||||||
// General Errors
|
|
||||||
Invalid_Argument,
|
Invalid_Argument,
|
||||||
|
|
||||||
Permission_Denied,
|
Permission_Denied,
|
||||||
@@ -13,43 +10,20 @@ Error :: enum u64 {
|
|||||||
Not_Exist,
|
Not_Exist,
|
||||||
Closed,
|
Closed,
|
||||||
|
|
||||||
// Timeout Errors
|
|
||||||
Timeout,
|
Timeout,
|
||||||
|
|
||||||
// I/O Errors
|
|
||||||
// EOF is the error returned by `read` when no more input is available
|
|
||||||
EOF,
|
|
||||||
|
|
||||||
// Unexpected_EOF means that EOF was encountered in the middle of reading a fixed-sized block of data
|
|
||||||
Unexpected_EOF,
|
|
||||||
|
|
||||||
// Short_Write means that a write accepted fewer bytes than requested but failed to return an explicit error
|
|
||||||
Short_Write,
|
|
||||||
|
|
||||||
// Invalid_Write means that a write returned an impossible count
|
|
||||||
Invalid_Write,
|
|
||||||
|
|
||||||
// Short_Buffer means that a read required a longer buffer than was provided
|
|
||||||
Short_Buffer,
|
|
||||||
|
|
||||||
// No_Progress is returned by some implementations of `io.Reader` when many calls
|
|
||||||
// to `read` have failed to return any data or error.
|
|
||||||
// This is usually a signed of a broken `io.Reader` implementation
|
|
||||||
No_Progress,
|
|
||||||
|
|
||||||
Invalid_Whence,
|
|
||||||
Invalid_Offset,
|
|
||||||
Invalid_Unread,
|
|
||||||
|
|
||||||
Negative_Read,
|
|
||||||
Negative_Write,
|
|
||||||
Negative_Count,
|
|
||||||
Buffer_Full,
|
|
||||||
|
|
||||||
// Platform Specific Errors
|
|
||||||
Platform_Minimum = 1<<Platform_Error_Min_Bits,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Platform_Error :: struct {
|
||||||
|
err: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
Error :: union {
|
||||||
|
General_Error,
|
||||||
|
io.Error,
|
||||||
|
Platform_Error,
|
||||||
|
}
|
||||||
|
#assert(size_of(Error) == size_of(u64));
|
||||||
|
|
||||||
Path_Error :: struct {
|
Path_Error :: struct {
|
||||||
op: string,
|
op: string,
|
||||||
path: string,
|
path: string,
|
||||||
@@ -83,20 +57,17 @@ link_error_delete :: proc(lerr: Maybe(Link_Error)) {
|
|||||||
|
|
||||||
|
|
||||||
is_platform_error :: proc(ferr: Error) -> (err: i32, ok: bool) {
|
is_platform_error :: proc(ferr: Error) -> (err: i32, ok: bool) {
|
||||||
if ferr >= .Platform_Minimum {
|
v: Platform_Error;
|
||||||
err = i32(u64(ferr)>>Platform_Error_Min_Bits);
|
if v, ok = ferr.(Platform_Error); ok {
|
||||||
ok = true;
|
err = v.err;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_from_platform_error :: proc(errno: i32) -> Error {
|
|
||||||
return Error(u64(errno) << Platform_Error_Min_Bits);
|
|
||||||
}
|
|
||||||
|
|
||||||
error_string :: proc(ferr: Error) -> string {
|
error_string :: proc(ferr: Error) -> string {
|
||||||
#partial switch ferr {
|
switch ferr {
|
||||||
case .None: return "";
|
case nil: return "";
|
||||||
case .Invalid_Argument: return "invalid argument";
|
case .Invalid_Argument: return "invalid argument";
|
||||||
case .Permission_Denied: return "permission denied";
|
case .Permission_Denied: return "permission denied";
|
||||||
case .Exist: return "file already exists";
|
case .Exist: return "file already exists";
|
||||||
|
|||||||
@@ -10,23 +10,11 @@ file_to_stream :: proc(fd: Handle) -> (s: io.Stream) {
|
|||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
error_to_io_error :: proc(ferr: Error) -> io.Error {
|
error_to_io_error :: proc(ferr: Error) -> io.Error {
|
||||||
#partial switch ferr {
|
err, ok := ferr.(io.Error);
|
||||||
case .None: return .None;
|
if !ok {
|
||||||
case .EOF: return .EOF;
|
err = .Unknown;
|
||||||
case .Unexpected_EOF: return .Unexpected_EOF;
|
|
||||||
case .Short_Write: return .Short_Write;
|
|
||||||
case .Invalid_Write: return .Invalid_Write;
|
|
||||||
case .Short_Buffer: return .Short_Buffer;
|
|
||||||
case .No_Progress: return .No_Progress;
|
|
||||||
case .Invalid_Whence: return .Invalid_Whence;
|
|
||||||
case .Invalid_Offset: return .Invalid_Offset;
|
|
||||||
case .Invalid_Unread: return .Invalid_Unread;
|
|
||||||
case .Negative_Read: return .Negative_Read;
|
|
||||||
case .Negative_Write: return .Negative_Write;
|
|
||||||
case .Negative_Count: return .Negative_Count;
|
|
||||||
case .Buffer_Full: return .Buffer_Full;
|
|
||||||
}
|
}
|
||||||
return .Unknown;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package os2
|
package os2
|
||||||
|
|
||||||
import "core:mem"
|
import "core:mem"
|
||||||
|
import "core:io"
|
||||||
import "core:strconv"
|
import "core:strconv"
|
||||||
import "core:unicode/utf8"
|
import "core:unicode/utf8"
|
||||||
|
|
||||||
|
|||||||
@@ -5,19 +5,19 @@ import "core:io"
|
|||||||
import "core:time"
|
import "core:time"
|
||||||
|
|
||||||
_create :: proc(name: string) -> (Handle, Error) {
|
_create :: proc(name: string) -> (Handle, Error) {
|
||||||
return 0, .None;
|
return 0, nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_open :: proc(name: string) -> (Handle, Error) {
|
_open :: proc(name: string) -> (Handle, Error) {
|
||||||
return 0, .None;
|
return 0, nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_open_file :: proc(name: string, flag: int, perm: File_Mode) -> (Handle, Error) {
|
_open_file :: proc(name: string, flag: int, perm: File_Mode) -> (Handle, Error) {
|
||||||
return 0, .None;
|
return 0, nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_close :: proc(fd: Handle) -> Error {
|
_close :: proc(fd: Handle) -> Error {
|
||||||
return .None;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_name :: proc(fd: Handle, allocator := context.allocator) -> string {
|
_name :: proc(fd: Handle, allocator := context.allocator) -> string {
|
||||||
@@ -58,11 +58,11 @@ _file_size :: proc(fd: Handle) -> (n: i64, err: Error) {
|
|||||||
|
|
||||||
|
|
||||||
_sync :: proc(fd: Handle) -> Error {
|
_sync :: proc(fd: Handle) -> Error {
|
||||||
return .None;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_flush :: proc(fd: Handle) -> Error {
|
_flush :: proc(fd: Handle) -> Error {
|
||||||
return .None;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_truncate :: proc(fd: Handle, size: i64) -> Maybe(Path_Error) {
|
_truncate :: proc(fd: Handle, size: i64) -> Maybe(Path_Error) {
|
||||||
@@ -92,20 +92,20 @@ _read_link :: proc(name: string) -> (string, Maybe(Path_Error)) {
|
|||||||
|
|
||||||
|
|
||||||
_chdir :: proc(fd: Handle) -> Error {
|
_chdir :: proc(fd: Handle) -> Error {
|
||||||
return .None;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_chmod :: proc(fd: Handle, mode: File_Mode) -> Error {
|
_chmod :: proc(fd: Handle, mode: File_Mode) -> Error {
|
||||||
return .None;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_chown :: proc(fd: Handle, uid, gid: int) -> Error {
|
_chown :: proc(fd: Handle, uid, gid: int) -> Error {
|
||||||
return .None;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
_lchown :: proc(name: string, uid, gid: int) -> Error {
|
_lchown :: proc(name: string, uid, gid: int) -> Error {
|
||||||
return .None;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import win32 "core:sys/windows"
|
|||||||
_pipe :: proc() -> (r, w: Handle, err: Error) {
|
_pipe :: proc() -> (r, w: Handle, err: Error) {
|
||||||
p: [2]win32.HANDLE;
|
p: [2]win32.HANDLE;
|
||||||
if !win32.CreatePipe(&p[0], &p[1], nil, 0) {
|
if !win32.CreatePipe(&p[0], &p[1], nil, 0) {
|
||||||
return 0, 0, error_from_platform_error(i32(win32.GetLastError()));
|
return 0, 0, Platform_Error{i32(win32.GetLastError())};
|
||||||
}
|
}
|
||||||
return Handle(p[0]), Handle(p[1]), nil;
|
return Handle(p[0]), Handle(p[1]), nil;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ _same_file :: proc(fi1, fi2: File_Info) -> bool {
|
|||||||
|
|
||||||
|
|
||||||
_stat_errno :: proc(errno: win32.DWORD) -> Path_Error {
|
_stat_errno :: proc(errno: win32.DWORD) -> Path_Error {
|
||||||
return Path_Error{err = error_from_platform_error(i32(errno))};
|
return Path_Error{err = Platform_Error{i32(errno)}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ internal_stat :: proc(name: string, create_file_attributes: u32, allocator := co
|
|||||||
fd: win32.WIN32_FIND_DATAW;
|
fd: win32.WIN32_FIND_DATAW;
|
||||||
sh := win32.FindFirstFileW(wname, &fd);
|
sh := win32.FindFirstFileW(wname, &fd);
|
||||||
if sh == win32.INVALID_HANDLE_VALUE {
|
if sh == win32.INVALID_HANDLE_VALUE {
|
||||||
e = Path_Error{err = error_from_platform_error(i32(win32.GetLastError()))};
|
e = Path_Error{err = Platform_Error{i32(win32.GetLastError())}};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
win32.FindClose(sh);
|
win32.FindClose(sh);
|
||||||
@@ -99,7 +99,7 @@ internal_stat :: proc(name: string, create_file_attributes: u32, allocator := co
|
|||||||
|
|
||||||
h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil);
|
h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil);
|
||||||
if h == win32.INVALID_HANDLE_VALUE {
|
if h == win32.INVALID_HANDLE_VALUE {
|
||||||
e = Path_Error{err = error_from_platform_error(i32(win32.GetLastError()))};
|
e = Path_Error{err = Platform_Error{i32(win32.GetLastError())}};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
defer win32.CloseHandle(h);
|
defer win32.CloseHandle(h);
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ package os2
|
|||||||
import win32 "core:sys/windows"
|
import win32 "core:sys/windows"
|
||||||
|
|
||||||
_create_temp :: proc(dir, pattern: string) -> (Handle, Error) {
|
_create_temp :: proc(dir, pattern: string) -> (Handle, Error) {
|
||||||
return 0, .None;
|
return 0, nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_mkdir_temp :: proc(dir, pattern: string, allocator := context.allocator) -> (string, Error) {
|
_mkdir_temp :: proc(dir, pattern: string, allocator := context.allocator) -> (string, Error) {
|
||||||
return "", .None;
|
return "", nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
_temp_dir :: proc(allocator := context.allocator) -> string {
|
_temp_dir :: proc(allocator := context.allocator) -> string {
|
||||||
|
|||||||
Reference in New Issue
Block a user