]> git.mxchange.org Git - simgear.git/blobdiff - simgear/io/sg_file.cxx
remove CopyPolicy from ModelRegistry
[simgear.git] / simgear / io / sg_file.cxx
index 0505cac46679a24403536829481de70a735154df..bbfc324707b4d132ec8344f1719df9bbf218900f 100644 (file)
 
 #include <simgear/compiler.h>
 
-#include STL_STRING
+#include <string>
 
 #if defined(_MSC_VER) || defined(__MINGW32__)
 #  include <io.h>
 #endif
 
+#include <cstring>
+
 #include <simgear/misc/stdint.hxx>
 #include <simgear/debug/logstream.hxx>
 
 #include "sg_file.hxx"
 
-SG_USING_STD(string);
+using std::string;
 
 
-SGFile::SGFile( const string &file) {
+SGFile::SGFile(const string &file, int repeat_)
+    : file_name(file), fp(-1), eof_flag(true), repeat(repeat_), iteration(0)
+{
     set_type( sgFileType );
-    file_name = file;
-    eof_flag = true;
 }
 
 
@@ -82,7 +84,20 @@ int SGFile::read( char *buf, int length ) {
     // read a chunk
     ssize_t result = ::read( fp, buf, length );
     if ( length > 0 && result == 0 ) {
-        eof_flag = true;
+        if (repeat < 0 || iteration < repeat - 1) {
+            iteration++;
+            // loop reading the file, unless it is empty
+            off_t fileLen = ::lseek(fp, 0, SEEK_CUR);
+            if (fileLen == 0) {
+                eof_flag = true;
+                return 0;
+            } else {
+                ::lseek(fp, 0, SEEK_SET);
+                return ::read(fp, buf, length);
+            }
+        } else {
+            eof_flag = true;
+        }
     }
     return result;
 }
@@ -96,7 +111,13 @@ int SGFile::readline( char *buf, int length ) {
     // read a chunk
     ssize_t result = ::read( fp, buf, length );
     if ( length > 0 && result == 0 ) {
-        eof_flag = true;
+        if ((repeat < 0 || iteration < repeat - 1) && pos != 0) {
+            iteration++;
+            pos = ::lseek(fp, 0, SEEK_SET);
+            result = ::read(fp, buf, length);
+        } else {
+            eof_flag = true;
+        }
     }
 
     // find the end of line and reset position
@@ -129,7 +150,7 @@ int SGFile::write( const char *buf, const int length ) {
 
 // write null terminated string to a file
 int SGFile::writestring( const char *str ) {
-    int length = strlen( str );
+    int length = std::strlen( str );
     return write( str, length );
 }