factor/native/fd.c

87 lines
1.5 KiB
C
Raw Normal View History

#include "factor.h"
2004-07-24 00:54:57 -04:00
void init_io(void)
{
env.user[STDIN_ENV] = handle(HANDLE_FD,0);
env.user[STDOUT_ENV] = handle(HANDLE_FD,1);
env.user[STDERR_ENV] = handle(HANDLE_FD,2);
}
void primitive_close_fd(void)
{
HANDLE* h = untag_handle(HANDLE_FD,env.dt);
close(h->object);
env.dt = dpop();
}
void primitive_read_line_fd_8(void)
{
HANDLE* h = untag_handle(HANDLE_FD,env.dt);
int fd = h->object;
2004-07-24 00:54:57 -04:00
int amount;
int i;
int ch;
/* finished line, unicode */
SBUF* line = sbuf(LINE_SIZE);
/* read ascii from fd */
2004-07-24 00:54:57 -04:00
STRING* buf;
if(h->buffer == F)
h->buffer = tag_object(string(BUF_SIZE,'\0'));
buf = untag_string(h->buffer);
for(;;)
{
2004-07-24 00:54:57 -04:00
if(h->buf_pos >= h->buf_fill)
{
2004-07-24 00:54:57 -04:00
amount = read(fd,buf + 1,buf->capacity * 2);
if(amount <= 0) /* error or EOF */
{
2004-07-24 00:54:57 -04:00
if(line->top == 0)
/* didn't read anything before EOF */
env.dt = F;
else
2004-07-24 00:54:57 -04:00
env.dt = tag_object(line);
return;
}
2004-07-24 00:54:57 -04:00
h->buf_fill = amount;
h->buf_pos = 0;
}
2004-07-24 00:54:57 -04:00
for(i = h->buf_pos; i < h->buf_fill; i++)
{
ch = bget((CELL)buf + sizeof(STRING) + i);
if(ch == '\n')
{
h->buf_pos = i + 1;
env.dt = tag_object(line);
return;
}
else
set_sbuf_nth(line,line->top,ch);
}
}
}
void primitive_write_fd_8(void)
{
HANDLE* h = untag_handle(HANDLE_FD,env.dt);
int fd = h->object;
STRING* str = untag_string(dpop());
char* c_str = to_c_string(str);
write(fd,c_str,str->capacity);
env.dt = dpop();
}
void primitive_flush_fd(void)
{
HANDLE* h = untag_handle(HANDLE_FD,env.dt);
int fd = h->object;
fsync(fd);
env.dt = dpop();
}