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
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();
}
}

View File

@ -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: