From 44a4c20f230920da2b6b6b6fe45535b6dd476d2d Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sat, 7 Feb 2009 11:00:16 -0600 Subject: [PATCH] update stream seeking on windows for new api --- basis/io/backend/windows/nt/nt.factor | 12 +++++++++++- basis/io/buffers/buffers.factor | 6 +++--- basis/io/ports/ports.factor | 2 +- basis/windows/kernel32/kernel32.factor | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/basis/io/backend/windows/nt/nt.factor b/basis/io/backend/windows/nt/nt.factor index 52ab06e753..7479c0a0bb 100755 --- a/basis/io/backend/windows/nt/nt.factor +++ b/basis/io/backend/windows/nt/nt.factor @@ -82,7 +82,17 @@ M: winnt init-io ( -- ) H{ } clone pending-overlapped set-global windows.winsock:init-winsock ; -M: winnt (stream-seek) ( n stream -- ) 2drop ; +ERROR: invalid-file-size n ; + +: handle>file-size ( handle -- n ) + 0 [ GetFileSizeEx win32-error=0/f ] keep *ulonglong ; + +M: winnt (stream-seek) ( n seek-type stream -- ) + swap { + { seek-absolute [ handle>> (>>ptr) ] } + { seek-relative [ handle>> [ + ] change-ptr drop ] } + { seek-end [ handle>> [ handle>> handle>file-size + ] keep (>>ptr) ] } + } case ; : file-error? ( n -- eof? ) zero? [ diff --git a/basis/io/buffers/buffers.factor b/basis/io/buffers/buffers.factor index bfb6c08471..a647f27dfc 100644 --- a/basis/io/buffers/buffers.factor +++ b/basis/io/buffers/buffers.factor @@ -21,15 +21,15 @@ M: buffer dispose* ptr>> free ; : buffer-reset ( n buffer -- ) swap >>fill 0 >>pos drop ; +: buffer-reset-hard ( buffer -- ) + 0 >>fill 0 >>pos drop ; + : buffer-capacity ( buffer -- n ) [ size>> ] [ fill>> ] bi - ; inline : buffer-empty? ( buffer -- ? ) fill>> zero? ; inline -: buffer-seek ( n buffer -- ) - 0 >>fill 0 >>pos 2drop ; inline - : buffer-consume ( n buffer -- ) [ + ] change-pos dup [ pos>> ] [ fill>> ] bi < diff --git a/basis/io/ports/ports.factor b/basis/io/ports/ports.factor index 4b0336ed26..1f7fc5f115 100644 --- a/basis/io/ports/ports.factor +++ b/basis/io/ports/ports.factor @@ -124,7 +124,7 @@ HOOK: (stream-seek) os ( n seek-type stream -- ) M: port stream-seek ( n seek-type stream -- ) dup check-disposed - [ nip buffer>> buffer-seek ] [ (stream-seek) ] 3bi ; + [ buffer>> buffer-reset-hard 2drop ] [ (stream-seek) ] 3bi ; GENERIC: shutdown ( handle -- ) diff --git a/basis/windows/kernel32/kernel32.factor b/basis/windows/kernel32/kernel32.factor index d3e823f844..3494e83e83 100755 --- a/basis/windows/kernel32/kernel32.factor +++ b/basis/windows/kernel32/kernel32.factor @@ -1235,7 +1235,7 @@ ALIAS: GetFileAttributesEx GetFileAttributesExW FUNCTION: BOOL GetFileInformationByHandle ( HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation ) ; FUNCTION: DWORD GetFileSize ( HANDLE hFile, LPDWORD lpFileSizeHigh ) ; -! FUNCTION: GetFileSizeEx +FUNCTION: BOOL GetFileSizeEx ( HANDLE hFile, PLARGE_INTEGER lpFileSize ) ; FUNCTION: BOOL GetFileTime ( HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, LPFILETIME lpLastWriteTime ) ; FUNCTION: DWORD GetFileType ( HANDLE hFile ) ; ! FUNCTION: GetFirmwareEnvironmentVariableA