Implement <appender> on Windows

db4
U-SLAVA-DFB8FF805\Slava 2008-05-06 04:26:46 -05:00
parent 03998fc63b
commit 7f8ee64d28
5 changed files with 32 additions and 7 deletions

View File

@ -52,6 +52,10 @@ M: winnt CreateFile-flags ( DWORD -- DWORD )
M: winnt FileArgs-overlapped ( port -- overlapped )
make-overlapped ;
M: winnt open-append
[ dup file-info size>> ] [ drop 0 ] recover
>r (open-append) r> ;
: update-file-ptr ( n port -- )
port-handle
dup win32-file-ptr [

View File

@ -1,7 +1,7 @@
IN: io.windows.launcher.nt.tests
USING: io.launcher tools.test calendar accessors
namespaces kernel system arrays io io.files io.encodings.ascii
sequences parser assocs hashtables math ;
sequences parser assocs hashtables math continuations ;
[ ] [
<process>
@ -140,3 +140,18 @@ sequences parser assocs hashtables math ;
[ ] [ "dir.txt" temp-file delete-file ] unit-test
] times
[ "append-test" temp-file delete-file ] ignore-errors
[ "Hello appender\r\nHello appender\r\n" ] [
2 [
"resource:extra/io/windows/nt/launcher/test" [
<process>
vm "-script" "append.factor" 3array >>command
"append-test" temp-file <appender> >>stdout
try-process
] with-directory
] times
"append-test" temp-file ascii file-contents
] unit-test

View File

@ -51,6 +51,12 @@ IN: io.windows.nt.launcher
f ! template file
CreateFile dup invalid-handle? dup close-always ;
: redirect-append ( default path access-mode create-mode -- handle )
>r >r path>> r> r>
drop OPEN_ALWAYS
redirect-file
dup 0 FILE_END set-file-pointer ;
: set-inherit ( handle ? -- )
>r HANDLE_FLAG_INHERIT r> >BOOLEAN SetHandleInformation win32-error=0/f ;
@ -66,7 +72,7 @@ IN: io.windows.nt.launcher
{ [ pick not ] [ redirect-default ] }
{ [ pick +closed+ eq? ] [ redirect-closed ] }
{ [ pick string? ] [ redirect-file ] }
{ [ pick appender? ] [ redirect-file ] }
{ [ pick appender? ] [ redirect-append ] }
{ [ pick win32-file? ] [ redirect-handle ] }
[ redirect-stream ]
} cond ;

View File

@ -0,0 +1,2 @@
USE: io
"Hello appender" print

View File

@ -86,15 +86,13 @@ M: alien close-handle ( handle -- )
f CreateFileW dup win32-error=0/f
GetLastError ERROR_ALREADY_EXISTS = not ;
: set-file-pointer ( handle length -- )
dupd d>w/w <uint> FILE_BEGIN SetFilePointer
: set-file-pointer ( handle length method -- )
>r dupd d>w/w <uint> r> SetFilePointer
INVALID_SET_FILE_POINTER = [
CloseHandle "SetFilePointer failed" throw
] when drop ;
: open-append ( path -- handle length )
[ dup file-info size>> ] [ drop 0 ] recover
>r (open-append) r> 2dup set-file-pointer ;
HOOK: open-append os ( path -- handle length )
TUPLE: FileArgs
hFile lpBuffer nNumberOfBytesToRead