moved io functions to vm
parent
10e5dc9b3c
commit
062c56f94b
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
14
vm/vm.hpp
14
vm/vm.hpp
|
@ -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:
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue