X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fio%2Fsg_file.cxx;h=250518d847f5f99f6d26d7070c4521b2d5f10290;hb=bc9b3f6ff1fcc5caa67c07ad99f971c0faacf91a;hp=4707c3976da9e187b259c5dbeaf6abf9f778cdbf;hpb=9325ec681e8bb61e6a5d15e42f61d10aa7a483e5;p=simgear.git diff --git a/simgear/io/sg_file.cxx b/simgear/io/sg_file.cxx index 4707c397..250518d8 100644 --- a/simgear/io/sg_file.cxx +++ b/simgear/io/sg_file.cxx @@ -2,7 +2,7 @@ // // 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 @@ -16,64 +16,80 @@ // // 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 -#ifdef _MSC_VER +#ifdef _WIN32 # include #endif +#include + +#include +#include +#include + +#if !defined(_MSC_VER) +# include +#endif + +#include #include #include "sg_file.hxx" -FG_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; } +SGFile::SGFile( int existingFd ) : + fp(existingFd), + eof_flag(false), + repeat(1), + iteration(0) +{ + set_type( sgFileType ); +} SGFile::~SGFile() { } // open the file based on specified direction -bool SGFile::open( SGProtocolDir dir ) { - if ( dir == SG_IO_OUT ) { -#ifdef _MSC_VER - fp = _open( file_name.c_str(), O_WRONLY | O_CREAT | O_TRUNC, - 00666 ); -#else - fp = std::open( file_name.c_str(), O_WRONLY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | - S_IROTH | S_IWOTH ); -#endif - } else if ( dir == SG_IO_IN ) { -#ifdef _MSC_VER - fp = _open( file_name.c_str(), O_RDONLY ); +bool SGFile::open( const SGProtocolDir d ) { + set_dir( d ); + + if ( get_dir() == SG_IO_OUT ) { +#ifdef _WIN32 + int mode = 00666; #else - fp = std::open( file_name.c_str(), O_RDONLY ); + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; #endif + fp = ::open( file_name.c_str(), O_WRONLY | O_CREAT | O_TRUNC, mode ); + } 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; } @@ -81,12 +97,23 @@ bool SGFile::open( SGProtocolDir dir ) { // read a block of data of specified size int SGFile::read( char *buf, int length ) { // read a chunk -#ifdef _MSC_VER - int result = _read( fp, buf, length ); -#else - int result = std::read( fp, buf, length ); -#endif - + 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; } @@ -97,11 +124,16 @@ int SGFile::readline( char *buf, int length ) { int pos = lseek( fp, 0, SEEK_CUR ); // read a chunk -#ifdef _MSC_VER - int result = _read( fp, buf, length ); -#else - int result = std::read( fp, buf, length ); -#endif + 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; @@ -121,14 +153,10 @@ int SGFile::readline( char *buf, int length ) { // write data to a file -int SGFile::write( char *buf, int length ) { -#ifdef _MSC_VER - int result = _write( fp, buf, length ); -#else - int result = std::write( fp, buf, length ); -#endif +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; @@ -136,21 +164,18 @@ int SGFile::write( char *buf, int length ) { // write null terminated string to a file -int SGFile::writestring( char *str ) { - int length = strlen( str ); +int SGFile::writestring( const char *str ) { + int length = std::strlen( str ); return write( str, length ); } // close the port bool SGFile::close() { -#ifdef _MSC_VER - if ( _close( fp ) == -1 ) { -#else - if ( std::close( fp ) == -1 ) { -#endif + if ( ::close( fp ) == -1 ) { return false; } + eof_flag = true; return true; }