FILE *factor_vm::safe_fopen(char *filename, char *mode)
{
FILE *file;
- do {
+ for(;;)
+ {
file = fopen(filename,mode);
if(file == NULL)
io_error();
else
break;
- } while(errno == EINTR);
+ }
return file;
}
int factor_vm::safe_fgetc(FILE *stream)
{
int c;
- do {
+ for(;;)
+ {
c = fgetc(stream);
if(c == EOF)
{
}
else
break;
- } while(errno == EINTR);
+ }
return c;
}
size_t factor_vm::safe_fread(void *ptr, size_t size, size_t nitems, FILE *stream)
{
size_t items_read = 0;
+ size_t ret = 0;
- do {
- items_read += fread((void*)((int*)ptr+items_read*size),size,nitems-items_read,stream);
- } while(items_read != nitems && errno == EINTR);
+ do
+ {
+ ret = fread((void*)((int*)ptr+items_read*size),size,nitems-items_read,stream);
+ if(ret == 0)
+ {
+ if(feof(stream))
+ break;
+ else
+ io_error();
+ }
+ items_read += ret;
+ } while(items_read != nitems);
return items_read;
}
void factor_vm::safe_fputc(int c, FILE *stream)
{
- do {
+ for(;;)
+ {
if(fputc(c,stream) == EOF)
io_error();
else
break;
- } while(errno == EINTR);
+ }
}
size_t factor_vm::safe_fwrite(void *ptr, size_t size, size_t nitems, FILE *stream)
{
size_t items_written = 0;
+ size_t ret = 0;
do {
- items_written += fwrite((void*)((int*)ptr+items_written*size),size,nitems-items_written,stream);
- } while(items_written != nitems && errno == EINTR);
+ ret = fwrite((void*)((int*)ptr+items_written*size),size,nitems-items_written,stream);
+ if(ret == 0)
+ io_error();
+ items_written += ret;
+ } while(items_written != nitems);
return items_written;
}
int factor_vm::safe_ftell(FILE *stream)
{
off_t offset;
- do {
+ for(;;)
+ {
if((offset = FTELL(stream)) == -1)
io_error();
else
break;
- } while(errno == EINTR);
+ }
return offset;
}
critical_error("Bad value for whence",whence);
}
- do {
+ for(;;)
+ {
if(FSEEK(stream,offset,whence) == -1)
io_error();
else
break;
- } while(errno == EINTR);
+ }
}
void factor_vm::safe_fflush(FILE *stream)
{
- do {
+ for(;;)
+ {
if(fflush(stream) == EOF)
io_error();
else
break;
- } while(errno == EINTR);
+ }
}
void factor_vm::safe_fclose(FILE *stream)
{
- do {
+ for(;;)
+ {
if(fclose(stream) == EOF)
io_error();
else
break;
- } while(errno == EINTR);
+ }
}
void factor_vm::primitive_fopen()
int c = safe_fread(buf.untagged() + 1,1,size,file);
if(c == 0)
- {
- if(feof(file))
- ctx->push(false_object);
- else
- io_error();
- }
+ ctx->push(false_object);
else
{
if(feof(file))