moved io functions to vm

db4
Phil Dawes 2009-08-17 21:37:07 +01:00
parent 10e5dc9b3c
commit 062c56f94b
2 changed files with 86 additions and 12 deletions

84
vm/io.cpp Normal file → Executable file
View File

@ -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 with many more capabilities so these words are not usually used in
normal operation. */ normal operation. */
void init_c_io() void factorvm::init_c_io()
{ {
userenv[STDIN_ENV] = allot_alien(F,(cell)stdin); userenv[STDIN_ENV] = allot_alien(F,(cell)stdin);
userenv[STDOUT_ENV] = allot_alien(F,(cell)stdout); userenv[STDOUT_ENV] = allot_alien(F,(cell)stdout);
userenv[STDERR_ENV] = allot_alien(F,(cell)stderr); 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 #ifndef WINCE
if(errno == EINTR) if(errno == EINTR)
@ -31,7 +36,12 @@ void io_error()
general_error(ERROR_IO,tag_fixnum(errno),F,NULL); 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> mode(dpop());
gc_root<byte_array> path(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(); 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(); FILE *file = (FILE *)unbox_alien();
fixnum size = unbox_array_size(); 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(); FILE *file = (FILE *)unbox_alien();
fixnum ch = to_fixnum(dpop()); 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(); FILE *file = (FILE *)unbox_alien();
byte_array *text = untag_check<byte_array>(dpop()); 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()); int whence = to_fixnum(dpop());
FILE *file = (FILE *)unbox_alien(); 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(); FILE *file = (FILE *)unbox_alien();
for(;;) 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(); FILE *file = (FILE *)unbox_alien();
for(;;) 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 /* 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 not portable, since on some libc's errno is not a global but a funky macro that
reads thread-local storage. */ reads thread-local storage. */
VM_C_API int err_no() int factorvm::err_no()
{ {
return errno; 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; errno = 0;
} }
VM_C_API void clear_err_no()
{
return vm->clear_err_no();
}
} }

View File

@ -316,6 +316,20 @@ struct factorvm {
void overflow_fixnum_add(fixnum x, fixnum y); void overflow_fixnum_add(fixnum x, fixnum y);
void overflow_fixnum_subtract(fixnum x, fixnum y); void overflow_fixnum_subtract(fixnum x, fixnum y);
void overflow_fixnum_multiply(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: // next method here: