]> gitweb.factorcode.org Git - factor.git/commitdiff
moved io functions to vm
authorPhil Dawes <phil@phildawes.net>
Mon, 17 Aug 2009 20:37:07 +0000 (21:37 +0100)
committerPhil Dawes <phil@phildawes.net>
Wed, 16 Sep 2009 07:16:20 +0000 (08:16 +0100)
vm/io.cpp [changed mode: 0644->0755]
vm/vm.hpp

old mode 100644 (file)
new mode 100755 (executable)
index 5bb5834..570a9a2
--- 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<byte_array> mode(dpop());
        gc_root<byte_array> 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<byte_array>(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();
+}
+
 }
index 7df9386083c035a28381ec3d65d4497aee2303b8..372908b6972e732d2edc6df12cc97ab3f6079261 100644 (file)
--- 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: