VM: safe_fread needs to return an int so you can return -1 on error
parent
a0e7bb8770
commit
0713f28bdb
21
vm/io.cpp
21
vm/io.cpp
|
@ -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));
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue