X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Fsg_file.cxx;h=67fbda3eb9547f107a768cfaf64791a228a94742;hb=9f88b077ee5294c4ad898016b7d66682466bbafb;hp=cd7fa1d5b558ee0282eccd37bd572d3ae30c89bb;hpb=7fc8c026884b2d0a1b683765c089a9bef5ac47c8;p=simgear.git diff --git a/simgear/io/sg_file.cxx b/simgear/io/sg_file.cxx index cd7fa1d5..67fbda3e 100644 --- a/simgear/io/sg_file.cxx +++ b/simgear/io/sg_file.cxx @@ -16,29 +16,33 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ #include -#include STL_STRING +#include -#if defined(_MSC_VER) || defined(__MINGW32__) +#ifdef _WIN32 # include #endif +#include + +#include #include #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; } @@ -51,7 +55,7 @@ bool SGFile::open( const SGProtocolDir d ) { set_dir( d ); if ( get_dir() == SG_IO_OUT ) { -#if defined(_MSC_VER) || defined(__MINGW32__) +#ifdef _WIN32 int mode = 00666; #else mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; @@ -70,6 +74,7 @@ bool SGFile::open( const SGProtocolDir d ) { return false; } + eof_flag = false; return true; } @@ -77,7 +82,24 @@ bool SGFile::open( const SGProtocolDir d ) { // read a block of data of specified size int SGFile::read( char *buf, int length ) { // read a chunk - return ::read( fp, buf, length ); + ssize_t result = ::read( fp, buf, length ); + if ( length > 0 && result == 0 ) { + 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; } @@ -87,7 +109,16 @@ int SGFile::readline( char *buf, int length ) { int pos = lseek( fp, 0, SEEK_CUR ); // read a chunk - int result = ::read( fp, buf, length ); + ssize_t result = ::read( fp, buf, length ); + if ( length > 0 && result == 0 ) { + 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 int i; @@ -119,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 ); } @@ -130,5 +161,6 @@ bool SGFile::close() { return false; } + eof_flag = true; return true; }