]> git.mxchange.org Git - simgear.git/commitdiff
Add repeat option to SGFile.
authortimoore <timoore>
Sat, 19 Jul 2008 16:01:20 +0000 (16:01 +0000)
committertimoore <timoore>
Sat, 19 Jul 2008 16:01:20 +0000 (16:01 +0000)
This supports auto-looping over a playback file, for demos and such.

simgear/io/sg_file.cxx
simgear/io/sg_file.hxx

index 1f978b1df79722996202a809e5281fbbed38b55b..60d553cd10d36152962850e277aea7c020b41aab 100644 (file)
 SG_USING_STD(string);
 
 
-SGFile::SGFile( const string &file) {
+SGFile::SGFile(const string &file, bool repeat_)
+    : file_name(file), fp(-1), eof_flag(true), repeat(repeat_)
+{
     set_type( sgFileType );
-    file_name = file;
-    eof_flag = true;
 }
 
 
@@ -84,7 +84,19 @@ 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) {
+            // 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;
 }
@@ -98,7 +110,12 @@ 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 && pos != 0) {
+            pos = ::lseek(fp, 0, SEEK_SET);
+            result = ::read(fp, buf, length);
+        } else {
+            eof_flag = true;
+        }
     }
 
     // find the end of line and reset position
index 9f91af347b9b75dc89df65e373a6d3e9b5964719..2eb87d42215f62284a6c8395bbb164251b9e1cc5 100644 (file)
@@ -55,6 +55,7 @@ class SGFile : public SGIOChannel {
     string file_name;
     int fp;
     bool eof_flag;
+    bool repeat;
 
 public:
 
@@ -64,8 +65,9 @@ public:
      * name. This file is not opened immediately, but instead will be
      * opened when the open() method is called.
      * @param file name of file to open
+     * @param repeat On eof restart at the beginning of the file
      */
-    SGFile( const string& file );
+    SGFile( const string& file, bool repeat_ = false );
 
     /** Destructor */
     ~SGFile();