From 90714a38311ec79500c0257670985bfe5d6c9a1b Mon Sep 17 00:00:00 2001 From: Jimmi Holst Christensen Date: Fri, 19 Jan 2018 21:30:57 +0100 Subject: [PATCH] Implemented windows versions of seekTo and getPos --- std/io.zig | 30 ++++++++++++++++++++++++++++++ std/os/windows/index.zig | 8 ++++++++ 2 files changed, 38 insertions(+) diff --git a/std/io.zig b/std/io.zig index 605553b0ea..5121fd0c21 100644 --- a/std/io.zig +++ b/std/io.zig @@ -204,6 +204,15 @@ pub const File = struct { }; } }, + Os.windows => { + if (system.SetFilePointerEx(self.handle, amount, null, system.FILE_CURRENT) == 0) { + const err = system.GetLastError(); + return switch (err) { + system.ERROR.INVALID_PARAMETER => error.BadFd, + else => os.unexpectedErrorPosix(err), + }; + } + }, else => @compileError("unsupported OS"), } } @@ -224,6 +233,15 @@ pub const File = struct { }; } }, + Os.windows => { + if (system.SetFilePointerEx(self.handle, @bitCast(isize, pos), null, system.FILE_BEGIN) == 0) { + const err = system.GetLastError(); + return switch (err) { + system.ERROR.INVALID_PARAMETER => error.BadFd, + else => os.unexpectedErrorWindows(err), + }; + } + }, else => @compileError("unsupported OS: " ++ @tagName(builtin.os)), } } @@ -245,6 +263,18 @@ pub const File = struct { } return result; }, + Os.windows => { + var pos : usize = undefined; + if (system.SetFilePointerEx(self.handle, 0, @ptrCast(system.PLARGE_INTEGER, &pos), system.FILE_CURRENT) == 0) { + const err = system.GetLastError(); + return switch (err) { + system.ERROR.INVALID_PARAMETER => error.BadFd, + else => os.unexpectedErrorWindows(err), + }; + } + + return pos; + }, else => @compileError("unsupported OS"), } } diff --git a/std/os/windows/index.zig b/std/os/windows/index.zig index d460e94f64..b10d373d78 100644 --- a/std/os/windows/index.zig +++ b/std/os/windows/index.zig @@ -74,6 +74,9 @@ pub extern "kernel32" stdcallcc fn ReadFile(in_hFile: HANDLE, out_lpBuffer: LPVO in_nNumberOfBytesToRead: DWORD, out_lpNumberOfBytesRead: &DWORD, in_out_lpOverlapped: ?&OVERLAPPED) -> BOOL; +pub extern "kernel32" stdcallcc fn SetFilePointerEx(in_fFile: HANDLE, in_liDistanceToMove: LARGE_INTEGER, + out_opt_ldNewFilePointer: ?PLARGE_INTEGER, in_dwMoveMethod: DWORD) -> BOOL; + pub extern "kernel32" stdcallcc fn SetHandleInformation(hObject: HANDLE, dwMask: DWORD, dwFlags: DWORD) -> BOOL; pub extern "kernel32" stdcallcc fn Sleep(dwMilliseconds: DWORD); @@ -126,6 +129,7 @@ pub const UNICODE = false; pub const WCHAR = u16; pub const WORD = u16; pub const LARGE_INTEGER = i64; +pub const PLARGE_INTEGER = &LARGE_INTEGER; pub const TRUE = 1; pub const FALSE = 0; @@ -289,3 +293,7 @@ pub const MOVEFILE_DELAY_UNTIL_REBOOT = 4; pub const MOVEFILE_FAIL_IF_NOT_TRACKABLE = 32; pub const MOVEFILE_REPLACE_EXISTING = 1; pub const MOVEFILE_WRITE_THROUGH = 8; + +pub const FILE_BEGIN = 0; +pub const FILE_CURRENT = 1; +pub const FILE_END = 2; \ No newline at end of file