]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: fixes so that raw_fread and safe_fread returns a size_t again 1334/head
authorBjörn Lindqvist <bjourne@gmail.com>
Fri, 5 Jun 2015 00:11:28 +0000 (02:11 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Fri, 5 Jun 2015 00:14:49 +0000 (02:14 +0200)
vm/io.cpp
vm/io.hpp
vm/vm.hpp

index 7d640a18a085b4ad1920a89f5622219f30bc68e9..1e862cd109a5b090a1764a586dae877a1b785dcc 100644 (file)
--- a/vm/io.cpp
+++ b/vm/io.cpp
@@ -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
 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;
 
   do {
@@ -24,7 +25,7 @@ int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) {
         break;
       }
       else if (errno != EINTR) {
-        return -1;
+        return 0;
       }
     }
     items_read += ret;
@@ -82,10 +83,10 @@ int factor_vm::safe_fgetc(FILE* stream) {
   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) {
-  int ret = raw_fread(ptr, size, nitems, stream);
-  if (ret == -1)
+  size_t ret = raw_fread(ptr, size, nitems, stream);
+  if (ret == 0 && !feof(stream))
     io_error_if_not_EINTR();
   return ret;
 }
@@ -199,7 +200,7 @@ void factor_vm::primitive_fread() {
     ctx->push(from_unsigned_cell(0));
     return;
   }
-  int c = safe_fread(buf, 1, size, file);
+  size_t c = safe_fread(buf, 1, size, file);
   if (c == 0 || feof(file))
     clearerr(file);
   ctx->push(from_unsigned_cell(c));
index 57f7b19f8306faf78fa42cfd718d6576581e9bed..59b847159d499a47ccd6603ce89dc47b219f379f 100644 (file)
--- a/vm/io.hpp
+++ b/vm/io.hpp
@@ -2,7 +2,7 @@ namespace factor {
 
 /* Safe IO functions that does not throw Factor errors. */
 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 */
 
index 1d68ed4a61ec12475fc5c8b87dc68049a63f7d64..a0a9a142d42d860f29edb45083b5b4504909e7ab 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -540,7 +540,7 @@ struct factor_vm {
   void io_error_if_not_EINTR();
   FILE* safe_fopen(char* filename, char* mode);
   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);
   size_t safe_fwrite(void* ptr, size_t size, size_t nitems, FILE* stream);
   int safe_ftell(FILE* stream);