//
// Written by Curtis Olson, started November 1999.
//
-// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
//
// 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 <simgear/compiler.h>
-#include STL_STRING
+#include <string>
-#ifdef _MSC_VER
+#ifdef _WIN32
# include <io.h>
#endif
+#include <cstring>
+
+#include <simgear/misc/stdint.hxx>
#include <simgear/debug/logstream.hxx>
#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;
}
set_dir( d );
if ( get_dir() == SG_IO_OUT ) {
-#ifdef _MSC_VER
+#ifdef _WIN32
int mode = 00666;
#else
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
} else if ( get_dir() == SG_IO_IN ) {
fp = ::open( file_name.c_str(), O_RDONLY );
} else {
- FG_LOG( FG_IO, FG_ALERT,
+ SG_LOG( SG_IO, SG_ALERT,
"Error: bidirection mode not available for files." );
return false;
}
if ( fp == -1 ) {
- FG_LOG( FG_IO, FG_ALERT, "Error opening file: " << file_name );
+ SG_LOG( SG_IO, SG_ALERT, "Error opening file: " << file_name );
return false;
}
+ eof_flag = false;
return true;
}
// 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;
}
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;
int SGFile::write( const char *buf, const int length ) {
int result = ::write( fp, buf, length );
if ( result != length ) {
- FG_LOG( FG_IO, FG_ALERT, "Error writing data: " << file_name );
+ SG_LOG( SG_IO, SG_ALERT, "Error writing data: " << file_name );
}
return result;
// 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 );
}
return false;
}
+ eof_flag = true;
return true;
}