From: timoore Date: Thu, 7 Aug 2008 22:24:01 +0000 (+0000) Subject: Return eof after a number of reptetitions of file input. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=74d3bdc68cb86f734c9de11a5d179960384b22b7;p=simgear.git Return eof after a number of reptetitions of file input. --- diff --git a/simgear/io/sg_file.cxx b/simgear/io/sg_file.cxx index 213a1790..bbfc3247 100644 --- a/simgear/io/sg_file.cxx +++ b/simgear/io/sg_file.cxx @@ -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 { diff --git a/simgear/io/sg_file.hxx b/simgear/io/sg_file.hxx index a64dd6ee..1bf3800d 100644 --- a/simgear/io/sg_file.hxx +++ b/simgear/io/sg_file.hxx @@ -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();