VM: fixes so that raw_fread and safe_fread returns a size_t again

db4
Björn Lindqvist 2015-06-05 02:11:28 +02:00
parent 428937dbeb
commit 40b7805e0a
3 changed files with 9 additions and 8 deletions

View File

@ -13,7 +13,8 @@ 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. */
int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) { size_t raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) {
FACTOR_ASSERT(nitems > 0);
size_t items_read = 0; size_t items_read = 0;
do { do {
@ -24,7 +25,7 @@ int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) {
break; break;
} }
else if (errno != EINTR) { else if (errno != EINTR) {
return -1; return 0;
} }
} }
items_read += ret; items_read += ret;
@ -82,10 +83,10 @@ int factor_vm::safe_fgetc(FILE* stream) {
return c; return c;
} }
int factor_vm::safe_fread(void* ptr, size_t size, size_t nitems, size_t factor_vm::safe_fread(void* ptr, size_t size, size_t nitems,
FILE* stream) { FILE* stream) {
int ret = raw_fread(ptr, size, nitems, stream); size_t ret = raw_fread(ptr, size, nitems, stream);
if (ret == -1) if (ret == 0 && !feof(stream))
io_error_if_not_EINTR(); io_error_if_not_EINTR();
return ret; return ret;
} }
@ -199,7 +200,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);
int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream); size_t 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);
int safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream); size_t 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);