]> git.mxchange.org Git - simgear.git/blobdiff - simgear/io/sg_file.cxx
Use the new SGPath::create_dir function
[simgear.git] / simgear / io / sg_file.cxx
index ed74027576fa1ee99ec7fb7eda80596ccc7ad9fe..dace6454060c5e7bad2b100587f0ef2e6e3f84ab 100644 (file)
@@ -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
 
 #include STL_STRING
 
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__MINGW32__)
 #  include <io.h>
 #endif
 
+#include <simgear/misc/stdint.hxx>
 #include <simgear/debug/logstream.hxx>
 
 #include "sg_file.hxx"
@@ -39,6 +40,7 @@ SG_USING_STD(string);
 SGFile::SGFile( const string &file) {
     set_type( sgFileType );
     file_name = file;
+    eof_flag = true;
 }
 
 
@@ -51,7 +53,7 @@ bool SGFile::open( const SGProtocolDir d ) {
     set_dir( d );
 
     if ( get_dir() == SG_IO_OUT ) {
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__MINGW32__)
         int mode = 00666;
 #else
         mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
@@ -60,16 +62,17 @@ bool SGFile::open( const SGProtocolDir d ) {
     } 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;
 }
 
@@ -77,7 +80,11 @@ 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 ) {
+        eof_flag = true;
+    }
+    return result;
 }
 
 
@@ -87,7 +94,10 @@ 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 ) {
+        eof_flag = true;
+    }
 
     // find the end of line and reset position
     int i;
@@ -110,7 +120,7 @@ int SGFile::readline( char *buf, int length ) {
 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;
@@ -130,5 +140,6 @@ bool SGFile::close() {
        return false;
     }
 
+    eof_flag = true;
     return true;
 }