VM: safe_fread needs to return an int so you can return -1 on error

db4
Björn Lindqvist 2015-06-01 00:21:32 +02:00
parent a0e7bb8770
commit 0713f28bdb
3 changed files with 12 additions and 13 deletions

View File

@ -13,18 +13,18 @@ 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. */
size_t raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) { int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) {
size_t items_read = 0; size_t items_read = 0;
size_t ret = 0;
do { do {
ret = fread((void*)((int*)ptr + items_read * size), size, size_t ret = fread((void*)((int*)ptr + items_read * size), size,
nitems - items_read, stream); nitems - items_read, stream);
if (ret == 0) { if (ret == 0) {
if (feof(stream)) if (feof(stream)) {
break; break;
}
else if (errno != EINTR) { else if (errno != EINTR) {
return 0; return -1;
} }
} }
items_read += ret; items_read += ret;
@ -82,10 +82,10 @@ int factor_vm::safe_fgetc(FILE* stream) {
return c; return c;
} }
size_t factor_vm::safe_fread(void* ptr, size_t size, size_t nitems, int factor_vm::safe_fread(void* ptr, size_t size, size_t nitems,
FILE* stream) { FILE* stream) {
size_t ret = raw_fread(ptr, size, nitems, stream); int ret = raw_fread(ptr, size, nitems, stream);
if (!ret) if (ret == -1)
io_error_if_not_EINTR(); io_error_if_not_EINTR();
return ret; return ret;
} }
@ -199,8 +199,7 @@ void factor_vm::primitive_fread() {
ctx->push(from_unsigned_cell(0)); ctx->push(from_unsigned_cell(0));
return; return;
} }
int c = safe_fread(buf, 1, size, file);
size_t c = safe_fread(buf, 1, size, file);
if (c == 0 || feof(file)) if (c == 0 || feof(file))
clearerr(file); clearerr(file);
ctx->push(from_unsigned_cell(c)); ctx->push(from_unsigned_cell(c));

View File

@ -2,7 +2,7 @@ namespace factor {
/* Safe IO functions that does not throw Factor errors. */ /* Safe IO functions that does not throw Factor errors. */
int raw_fclose(FILE* stream); int raw_fclose(FILE* stream);
size_t raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream); int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream);
/* Platform specific primitives */ /* Platform specific primitives */

View File

@ -540,7 +540,7 @@ struct factor_vm {
void io_error_if_not_EINTR(); void io_error_if_not_EINTR();
FILE* safe_fopen(char* filename, char* mode); FILE* safe_fopen(char* filename, char* mode);
int safe_fgetc(FILE* stream); int safe_fgetc(FILE* stream);
size_t safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream); int safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream);
void safe_fputc(int c, FILE* stream); void safe_fputc(int c, FILE* stream);
size_t safe_fwrite(void* ptr, size_t size, size_t nitems, FILE* stream); size_t safe_fwrite(void* ptr, size_t size, size_t nitems, FILE* stream);
int safe_ftell(FILE* stream); int safe_ftell(FILE* stream);