[
warm-boot
garbage-collection
- init-smart-terminal
run-user-init
"graphical" get [
start-console
] [
"interactive" get [
+ init-smart-terminal
print-banner listener
] when
] ifte
"libc" "msvcrt.dll" "cdecl" add-library
] when
+! FIXME: KLUDGE to get FFI-based IO going in Windows.
+os "win32" = [ "/library/bootstrap/win32-io.factor" run-resource ] when
+
"Compiling system..." print
"compile" get [ compile-all ] when
--- /dev/null
+! :folding=indent:collapseFolds=1:
+
+! $Id$
+!
+! Copyright (C) 2003, 2004 Slava Pestov.
+!
+! Redistribution and use in source and binary forms, with or without
+! modification, are permitted provided that the following conditions are met:
+!
+! 1. Redistributions of source code must retain the above copyright notice,
+! this list of conditions and the following disclaimer.
+!
+! 2. Redistributions in binary form must reproduce the above copyright notice,
+! this list of conditions and the following disclaimer in the documentation
+! and/or other materials provided with the distribution.
+!
+! THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+! DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+IN: threads
+USE: compiler
+USE: io-internals
+USE: kernel
+USE: win32-io-internals
+USE: win32-api
+
+: (yield) ( -- )
+ next-thread [
+ call
+ ] [
+ next-io-task [
+ call
+ ] [
+ win32-next-io-task
+ ] ifte*
+ ] ifte* ;
+
+IN: streams
+USE: compiler
+USE: namespaces
+USE: stdio
+USE: kernel
+USE: win32-io-internals
+USE: win32-stream
+USE: win32-api
+
+: <filecr> <win32-filecr> ;
+: <filecw> <win32-filecw> ;
+
+: init-stdio ( -- )
+ win32-init-stdio ;
+
USE: parser
USE: compiler
USE: win32-api
+USE: win32-stream
TRAITS: win32-console-stream
SYMBOL: handle
] bind ;
C: win32-console-stream ( stream -- stream )
- [ delegate set -11 GetStdHandle handle set ] extend ;
+ [ -11 GetStdHandle handle set delegate set ] extend ;
global [ [ <win32-console-stream> ] smart-term-hook set ] bind
: get-access ( -- file-mode )
"file-mode" get uncons
- [ GENERIC_WRITE ] [ 0 ] ifte >r
- [ GENERIC_READ ] [ 0 ] ifte r> bitor ;
+ GENERIC_WRITE 0 ? >r
+ GENERIC_READ 0 ? r> bitor ;
: get-sharemode ( -- share-mode )
- FILE_SHARE_READ FILE_SHARE_WRITE bitor FILE_SHARE_DELETE bitor ;
+ FILE_SHARE_READ FILE_SHARE_WRITE bitor ;
: get-create ( -- creation-disposition )
"file-mode" get uncons [
USE: win32-io-internals
TRAITS: win32-stream
+GENERIC: win32-stream-handle
SYMBOL: handle
SYMBOL: in-buffer
0 over set-overlapped-ext-event ;
: update-file-pointer ( whence -- )
- file-size get [ fileptr [ + ] change ] when ;
+ file-size get [ fileptr [ + ] change ] [ drop ] ifte ;
: flush-output ( -- )
[
alloc-io-task init-overlapped >r
handle get out-buffer get [ buffer-pos ] keep buffer-length
- NULL r> WriteFile [ handle-io-error ] unless win32-next-io-task
+ NULL r> WriteFile [ handle-io-error ] unless (yield)
] callcc1
- dup out-buffer get [ buffer-consume ] keep
- swap namespace update-file-pointer
+ dup update-file-pointer
+ out-buffer get [ buffer-consume ] keep
buffer-length 0 > [ flush-output ] when ;
+: maybe-flush-output ( -- )
+ out-buffer get buffer-length 0 > [ flush-output ] when ;
+
: do-write ( str -- )
dup str-length out-buffer get buffer-capacity <= [
out-buffer get buffer-append
handle get in-buffer get [ buffer-pos ] keep
buffer-capacity file-size get [ fileptr get - min ] when*
NULL r>
- ReadFile [ handle-io-error ] unless win32-next-io-task
+ ReadFile [ handle-io-error ] unless (yield)
] callcc1
- dup in-buffer get buffer-fill
- namespace update-file-pointer ;
+ dup in-buffer get buffer-fill update-file-pointer ;
: consume-input ( count -- str )
in-buffer get buffer-length 0 = [ fill-input ] when
dup in-buffer get buffer-first-n
swap in-buffer get buffer-consume ;
+: sbuf>str-or-f ( sbuf -- str-or-? )
+ dup sbuf-length 0 > [ sbuf>str ] [ drop f ] ifte ;
+
: do-read-count ( sbuf count -- str )
dup 0 = [
drop sbuf>str
] [
dup consume-input
dup str-length dup 0 = [
- 3drop dup sbuf-length 0 > [ sbuf>str ] [ drop f ] ifte
+ 3drop sbuf>str-or-f
] [
>r swap r> - >r swap [ sbuf-append ] keep r> do-read-count
] ifte
] ifte ;
+: peek-input ( -- str )
+ 1 in-buffer get buffer-first-n ;
+
+: do-read-line ( sbuf -- str )
+ 1 consume-input dup str-length 0 = [ drop sbuf>str-or-f ] [
+ dup "\r" = [
+ peek-input "\n" = [ 1 consume-input drop ] when
+ drop sbuf>str
+ ] [
+ dup "\n" = [
+ peek-input "\r" = [ 1 consume-input drop ] when
+ drop sbuf>str
+ ] [
+ over sbuf-append do-read-line
+ ] ifte
+ ] ifte
+ ] ifte ;
+
M: win32-stream fwrite-attr ( str style stream -- )
nip [ do-write ] bind ;
M: win32-stream freadln ( stream -- str )
- drop f ;
+ [ 80 <sbuf> do-read-line ] bind ;
M: win32-stream fread# ( count stream -- str )
[ dup <sbuf> swap do-read-count ] bind ;
M: win32-stream fflush ( stream -- )
- [ flush-output ] bind ;
+ [ maybe-flush-output ] bind ;
+
+M: win32-stream fauto-flush ( stream -- )
+ drop ;
M: win32-stream fclose ( stream -- )
[
- flush-output
+ maybe-flush-output
handle get CloseHandle drop
in-buffer get buffer-free
out-buffer get buffer-free
] bind ;
+M: win32-stream win32-stream-handle ( stream -- handle )
+ [ handle get ] bind ;
+
C: win32-stream ( handle -- stream )
[
- dup NULL GetFileSize dup INVALID_FILE_SIZE = not [
+ dup NULL GetFileSize dup -1 = not [
file-size set
] [ drop f file-size set ] ifte
handle set
: <win32-filecw> ( path -- stream )
f t win32-open-file <win32-stream> ;
+
+
SDL_EnableKeyRepeat drop ;
: console-loop ( -- )
- yield check-event [ console-loop ] when ;
+ check-event [ console-loop ] when ;
: console-quit ( -- )
redraw-continuation off
[
console get swap <console-stream>
- [ [ print-banner listener ] in-thread ] with-stream
+ [ print-banner listener ] with-stream
SDL_Quit
( return from start-console word )
escape-continuation get call
#include "../factor.h"
-DLL *ffi_dlopen (F_STRING *path)
+void ffi_dlopen (DLL *dll)
{
#ifdef FFI
HMODULE module;
- DLL *dll;
- module = LoadLibrary(to_c_string(path));
+ module = LoadLibrary(to_c_string(untag_string(dll->path)));
if (!module)
general_error(ERROR_FFI, tag_object(last_error()));
- dll = allot_object(DLL_TYPE, sizeof(DLL));
dll->dll = module;
-
- return dll;
#else
general_error(ERROR_FFI_DISABLED, F);
#endif