diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor index f7fb28c8f4..f42ab779f4 100644 --- a/core/bootstrap/primitives.factor +++ b/core/bootstrap/primitives.factor @@ -486,6 +486,7 @@ tuple { "fputc" "io.streams.c" (( ch alien -- )) } { "fwrite" "io.streams.c" (( string alien -- )) } { "fflush" "io.streams.c" (( alien -- )) } + { "ftell" "io.streams.c" (( alien -- n )) } { "fseek" "io.streams.c" (( alien offset whence -- )) } { "fclose" "io.streams.c" (( alien -- )) } { "" "kernel" (( obj -- wrapper )) } diff --git a/vm/io.cpp b/vm/io.cpp index 18a553af89..8e6eff730e 100755 --- a/vm/io.cpp +++ b/vm/io.cpp @@ -164,6 +164,17 @@ void factor_vm::primitive_fwrite() } } +void factor_vm::primitive_ftell() +{ + FILE *file = (FILE *)unbox_alien(); + off_t offset; + + if((offset = FTELL(file)) == -1) + io_error(); + + box_signed_8(offset); +} + void factor_vm::primitive_fseek() { int whence = to_fixnum(dpop()); diff --git a/vm/os-unix.hpp b/vm/os-unix.hpp index dc8acc445e..0afdbb200a 100644 --- a/vm/os-unix.hpp +++ b/vm/os-unix.hpp @@ -23,6 +23,7 @@ typedef char symbol_char; #define STRNCMP strncmp #define STRDUP strdup +#define FTELL ftello #define FSEEK fseeko #define FIXNUM_FORMAT "%ld" diff --git a/vm/os-windows.hpp b/vm/os-windows.hpp index d1db3c26ac..319ad6c42a 100644 --- a/vm/os-windows.hpp +++ b/vm/os-windows.hpp @@ -19,7 +19,8 @@ typedef wchar_t vm_char; #define STRNCMP wcsncmp #define STRDUP _wcsdup #define MIN(a,b) ((a)>(b)?(b):(a)) -#define FSEEK fseek +#define FTELL _ftelli64 +#define FSEEK _fseeki64 #ifdef WIN64 #define CELL_FORMAT "%Iu" diff --git a/vm/primitives.cpp b/vm/primitives.cpp index f8552ab635..e2e663333f 100644 --- a/vm/primitives.cpp +++ b/vm/primitives.cpp @@ -128,6 +128,7 @@ const primitive_type primitives[] = { primitive_fputc, primitive_fwrite, primitive_fflush, + primitive_ftell, primitive_fseek, primitive_fclose, primitive_wrapper, @@ -254,6 +255,7 @@ PRIMITIVE_FORWARD(fread) PRIMITIVE_FORWARD(fputc) PRIMITIVE_FORWARD(fwrite) PRIMITIVE_FORWARD(fflush) +PRIMITIVE_FORWARD(ftell) PRIMITIVE_FORWARD(fseek) PRIMITIVE_FORWARD(fclose) PRIMITIVE_FORWARD(wrapper) diff --git a/vm/primitives.hpp b/vm/primitives.hpp index 983d2589b2..dd264869b2 100644 --- a/vm/primitives.hpp +++ b/vm/primitives.hpp @@ -136,6 +136,7 @@ PRIMITIVE(fread); PRIMITIVE(fputc); PRIMITIVE(fwrite); PRIMITIVE(fflush); +PRIMITIVE(ftell); PRIMITIVE(fseek); PRIMITIVE(fclose); PRIMITIVE(wrapper); diff --git a/vm/vm.hpp b/vm/vm.hpp index 8f2b96944f..4bd137289d 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -510,6 +510,7 @@ struct factor_vm void primitive_fread(); void primitive_fputc(); void primitive_fwrite(); + void primitive_ftell(); void primitive_fseek(); void primitive_fflush(); void primitive_fclose();