From 062c56f94b020429d730697b4206e5a9fa8b7863 Mon Sep 17 00:00:00 2001 From: Phil Dawes Date: Mon, 17 Aug 2009 21:37:07 +0100 Subject: [PATCH] moved io functions to vm --- vm/io.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++-------- vm/vm.hpp | 14 ++++++++++ 2 files changed, 86 insertions(+), 12 deletions(-) mode change 100644 => 100755 vm/io.cpp diff --git a/vm/io.cpp b/vm/io.cpp old mode 100644 new mode 100755 index 5bb5834691..570a9a2633 --- a/vm/io.cpp +++ b/vm/io.cpp @@ -14,14 +14,19 @@ The Factor library provides platform-specific code for Unix and Windows with many more capabilities so these words are not usually used in normal operation. */ -void init_c_io() +void factorvm::init_c_io() { userenv[STDIN_ENV] = allot_alien(F,(cell)stdin); userenv[STDOUT_ENV] = allot_alien(F,(cell)stdout); userenv[STDERR_ENV] = allot_alien(F,(cell)stderr); } -void io_error() +void init_c_io() +{ + return vm->init_c_io(); +} + +void factorvm::io_error() { #ifndef WINCE if(errno == EINTR) @@ -31,7 +36,12 @@ void io_error() general_error(ERROR_IO,tag_fixnum(errno),F,NULL); } -PRIMITIVE(fopen) +void io_error() +{ + return vm->io_error(); +} + +inline void factorvm::vmprim_fopen() { gc_root mode(dpop()); gc_root path(dpop()); @@ -52,7 +62,12 @@ PRIMITIVE(fopen) } } -PRIMITIVE(fgetc) +PRIMITIVE(fopen) +{ + PRIMITIVE_GETVM()->vmprim_fopen(); +} + +inline void factorvm::vmprim_fgetc() { FILE *file = (FILE *)unbox_alien(); @@ -77,7 +92,12 @@ PRIMITIVE(fgetc) } } -PRIMITIVE(fread) +PRIMITIVE(fgetc) +{ + PRIMITIVE_GETVM()->vmprim_fgetc(); +} + +inline void factorvm::vmprim_fread() { FILE *file = (FILE *)unbox_alien(); fixnum size = unbox_array_size(); @@ -117,7 +137,12 @@ PRIMITIVE(fread) } } -PRIMITIVE(fputc) +PRIMITIVE(fread) +{ + PRIMITIVE_GETVM()->vmprim_fread(); +} + +inline void factorvm::vmprim_fputc() { FILE *file = (FILE *)unbox_alien(); fixnum ch = to_fixnum(dpop()); @@ -135,7 +160,12 @@ PRIMITIVE(fputc) } } -PRIMITIVE(fwrite) +PRIMITIVE(fputc) +{ + PRIMITIVE_GETVM()->vmprim_fputc(); +} + +inline void factorvm::vmprim_fwrite() { FILE *file = (FILE *)unbox_alien(); byte_array *text = untag_check(dpop()); @@ -164,7 +194,12 @@ PRIMITIVE(fwrite) } } -PRIMITIVE(fseek) +PRIMITIVE(fwrite) +{ + PRIMITIVE_GETVM()->vmprim_fwrite(); +} + +inline void factorvm::vmprim_fseek() { int whence = to_fixnum(dpop()); FILE *file = (FILE *)unbox_alien(); @@ -189,7 +224,12 @@ PRIMITIVE(fseek) } } -PRIMITIVE(fflush) +PRIMITIVE(fseek) +{ + PRIMITIVE_GETVM()->vmprim_fseek(); +} + +inline void factorvm::vmprim_fflush() { FILE *file = (FILE *)unbox_alien(); for(;;) @@ -201,7 +241,12 @@ PRIMITIVE(fflush) } } -PRIMITIVE(fclose) +PRIMITIVE(fflush) +{ + PRIMITIVE_GETVM()->vmprim_fflush(); +} + +inline void factorvm::vmprim_fclose() { FILE *file = (FILE *)unbox_alien(); for(;;) @@ -213,17 +258,32 @@ PRIMITIVE(fclose) } } +PRIMITIVE(fclose) +{ + PRIMITIVE_GETVM()->vmprim_fclose(); +} + /* This function is used by FFI I/O. Accessing the errno global directly is not portable, since on some libc's errno is not a global but a funky macro that reads thread-local storage. */ -VM_C_API int err_no() +int factorvm::err_no() { return errno; } -VM_C_API void clear_err_no() +VM_C_API int err_no() +{ + return vm->err_no(); +} + +void factorvm::clear_err_no() { errno = 0; } +VM_C_API void clear_err_no() +{ + return vm->clear_err_no(); +} + } diff --git a/vm/vm.hpp b/vm/vm.hpp index 7df9386083..372908b697 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -316,6 +316,20 @@ struct factorvm { void overflow_fixnum_add(fixnum x, fixnum y); void overflow_fixnum_subtract(fixnum x, fixnum y); void overflow_fixnum_multiply(fixnum x, fixnum y); + + //io + void init_c_io(); + void io_error(); + inline void vmprim_fopen(); + inline void vmprim_fgetc(); + inline void vmprim_fread(); + inline void vmprim_fputc(); + inline void vmprim_fwrite(); + inline void vmprim_fseek(); + inline void vmprim_fflush(); + inline void vmprim_fclose(); + int err_no(); + void clear_err_no(); // next method here: