//
// 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>
-#if defined(_MSC_VER) || defined(__MINGW32__)
+#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;
- eof_flag = true;
}
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;
// read a chunk
ssize_t result = ::read( fp, buf, length );
if ( length > 0 && result == 0 ) {
- eof_flag = true;
+ 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;
}
// read a chunk
ssize_t result = ::read( fp, buf, length );
if ( length > 0 && result == 0 ) {
- eof_flag = true;
+ 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
// 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 );
}