From 74d3bdc68cb86f734c9de11a5d179960384b22b7 Mon Sep 17 00:00:00 2001 From: timoore Date: Thu, 7 Aug 2008 22:24:01 +0000 Subject: [PATCH] Return eof after a number of reptetitions of file input. --- simgear/io/sg_file.cxx | 10 ++++++---- simgear/io/sg_file.hxx | 7 +++++-- 2 files changed, 11 insertions(+), 6 deletions(-) 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(); -- 2.39.5