Commit 20c2dbdbd3

Andrew Kelley <superjoe30@gmail.com>
2017-11-10 20:36:03
add windows implementation of io.File.getEndPos
1 parent 1ac46fa
Changed files (2)
std
os
windows
std/os/windows/index.zig
@@ -46,6 +46,8 @@ pub extern "kernel32" stdcallcc fn GetEnvironmentVariableA(lpName: LPCSTR, lpBuf
 
 pub extern "kernel32" stdcallcc fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: &DWORD) -> BOOL;
 
+pub extern "kernel32" stdcallcc fn GetFileSizeEx(hFile: HANDLE, lpFileSize: &LARGE_INTEGER) -> BOOL;
+
 pub extern "kernel32" stdcallcc fn GetLastError() -> DWORD;
 
 pub extern "kernel32" stdcallcc fn GetFileInformationByHandleEx(in_hFile: HANDLE,
@@ -115,6 +117,7 @@ pub const ULONG_PTR = usize;
 pub const UNICODE = false;
 pub const WCHAR = u16;
 pub const WORD = u16;
+pub const LARGE_INTEGER = i64;
 
 pub const TRUE = 1;
 pub const FALSE = 0;
std/io.zig
@@ -253,17 +253,30 @@ pub const File = struct {
     }
 
     pub fn getEndPos(self: &File) -> %usize {
-        var stat: system.Stat = undefined;
-        const err = system.getErrno(system.fstat(self.handle, &stat));
-        if (err > 0) {
-            return switch (err) {
-                system.EBADF => error.BadFd,
-                system.ENOMEM => error.OutOfMemory,
-                else => os.unexpectedErrorPosix(err),
+        if (is_posix) {
+            var stat: system.Stat = undefined;
+            const err = system.getErrno(system.fstat(self.handle, &stat));
+            if (err > 0) {
+                return switch (err) {
+                    system.EBADF => error.BadFd,
+                    system.ENOMEM => error.OutOfMemory,
+                    else => os.unexpectedErrorPosix(err),
+                }
             }
-        }
 
-        return usize(stat.size);
+            return usize(stat.size);
+        } else if (is_windows) {
+            var file_size: system.LARGE_INTEGER = undefined;
+            if (system.GetFileSizeEx(self.handle, &file_size) == 0) {
+                const err = system.GetLastError();
+                return switch (err) {
+                    else => os.unexpectedErrorWindows(err),
+                };
+            }
+            return @bitCast(usize, file_size);
+        } else {
+            unreachable;
+        }
     }
 
     pub fn read(self: &File, buffer: []u8) -> %usize {