]> git.mxchange.org Git - simgear.git/commitdiff
Return eof after a number of reptetitions of file input.
authortimoore <timoore>
Thu, 7 Aug 2008 22:24:01 +0000 (22:24 +0000)
committertimoore <timoore>
Thu, 7 Aug 2008 22:24:01 +0000 (22:24 +0000)
simgear/io/sg_file.cxx
simgear/io/sg_file.hxx

index 213a17908a66fa5320f9d5b84a750fd441782a50..bbfc324707b4d132ec8344f1719df9bbf218900f 100644 (file)
@@ -39,8 +39,8 @@
 using std::string;
 
 
-SGFile::SGFile(const string &file, bool repeat_)
-    : file_name(file), fp(-1), eof_flag(true), repeat(repeat_)
+SGFile::SGFile(const string &file, int repeat_)
+    : file_name(file), fp(-1), eof_flag(true), repeat(repeat_), iteration(0)
 {
     set_type( sgFileType );
 }
@@ -84,7 +84,8 @@ int SGFile::read( char *buf, int length ) {
     // read a chunk
     ssize_t result = ::read( fp, buf, length );
     if ( length > 0 && result == 0 ) {
-        if (repeat) {
+        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) {
@@ -110,7 +111,8 @@ int SGFile::readline( char *buf, int length ) {
     // read a chunk
     ssize_t result = ::read( fp, buf, length );
     if ( length > 0 && result == 0 ) {
-        if (repeat && pos != 0) {
+        if ((repeat < 0 || iteration < repeat - 1) && pos != 0) {
+            iteration++;
             pos = ::lseek(fp, 0, SEEK_SET);
             result = ::read(fp, buf, length);
         } else {
index a64dd6eeba97a21772d0c01ff0293ecc8f834452..1bf3800de6fcfafd252556b878795982d175d5fa 100644 (file)
@@ -55,7 +55,10 @@ class SGFile : public SGIOChannel {
     string file_name;
     int fp;
     bool eof_flag;
-    bool repeat;
+    // Number of repetitions to play. -1 means loop infinitely.
+    const int repeat;
+    int iteration;              // number of current repetition,
+                                // starting at 0
 
 public:
 
@@ -67,7 +70,7 @@ public:
      * @param file name of file to open
      * @param repeat On eof restart at the beginning of the file
      */
-    SGFile( const string& file, bool repeat_ = false );
+    SGFile( const string& file, int repeat_ = 1 );
 
     /** Destructor */
     ~SGFile();