From 0ff748987b4d26cf3f110729bd645d64cb2d3ca0 Mon Sep 17 00:00:00 2001 From: curt Date: Mon, 4 Feb 2002 20:23:41 +0000 Subject: [PATCH] Pass strings by const reference instead of by value, Made fix_path() a private member function, SGPath::fix(), Added bool SGPath::exists(), Added an assignment operator that acts like SGPath::append(). --- simgear/misc/props.cxx | 2 +- simgear/misc/sg_path.cxx | 59 ++++++++++++++++++++++------------------ simgear/misc/sg_path.hxx | 24 ++++++++++++---- 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/simgear/misc/props.cxx b/simgear/misc/props.cxx index 83a2ef32..359519ef 100644 --- a/simgear/misc/props.cxx +++ b/simgear/misc/props.cxx @@ -1159,7 +1159,7 @@ SGPropertyNode::tie (const SGRawValue &rawValue, bool useDefault) if (_type == ALIAS || _tied) return false; - long old_val; + long old_val = 0; if (useDefault) old_val = getLongValue(); diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index 7d70a6fe..6398424e 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -24,6 +24,7 @@ #include +#include #include "sg_path.hxx" @@ -33,37 +34,35 @@ // should be used in file or directory names. In windoze, allow the // second character to be a ":" for things like c:\foo\bar -static string fix_path( const string path ) { - string result = path; - - for ( int i = 0; i < (int)path.size(); ++i ) { +void +SGPath::fix() +{ + for ( string::size_type i = 0; i < path.size(); ++i ) { #if defined( WIN32 ) // for windoze, don't replace the ":" for the second character if ( i == 1 ) { continue; } #endif - if ( result[i] == SG_BAD_PATH_SEP ) { - result[i] = SG_PATH_SEP; + if ( path[i] == SG_BAD_PATH_SEP ) { + path[i] = SG_PATH_SEP; } } - - return result; } // default constructor -SGPath::SGPath() : - path("") +SGPath::SGPath() + : path("") { } // create a path based on "path" -SGPath::SGPath( const string p ) : - path("") +SGPath::SGPath( const std::string& p ) + : path(p) { - set( p ); + fix(); } @@ -73,36 +72,35 @@ SGPath::~SGPath() { // set path -void SGPath::set( const string p ) { - path = fix_path( p ); +void SGPath::set( const string& p ) { + path = p; + fix(); } // append another piece to the existing path -void SGPath::append( const string p ) { - string part = fix_path( p ); - +void SGPath::append( const string& p ) { if ( path.size() == 0 ) { - path = part; + path = p; } else { - if ( part[0] != SG_PATH_SEP ) { + if ( p[0] != SG_PATH_SEP ) { path += SG_PATH_SEP; } - path += part; + path += p; } + fix(); } // concatenate a string to the end of the path without inserting a // path separator -void SGPath::concat( const string p ) { - string part = fix_path( p ); - +void SGPath::concat( const string& p ) { if ( path.size() == 0 ) { - path = part; + path = p; } else { - path += part; + path += p; } + fix(); } @@ -115,3 +113,12 @@ string SGPath::dir() { return ""; } } + +bool SGPath::exists() const { + FILE* fp = fopen( path.c_str(), "r"); + if (fp == 0) { + return false; + } + fclose(fp); + return true; +} diff --git a/simgear/misc/sg_path.hxx b/simgear/misc/sg_path.hxx index 3bc67224..4b92f033 100644 --- a/simgear/misc/sg_path.hxx +++ b/simgear/misc/sg_path.hxx @@ -69,7 +69,7 @@ public: * Construct a path based on the starting path provided. * @param p initial path */ - SGPath( const string p ); + SGPath( const string& p ); /** Destructor */ ~SGPath(); @@ -78,20 +78,21 @@ public: * Set path to a new value * @param p new path */ - void set( const string p ); + void set( const string& p ); + SGPath& operator= ( const char* p ) { this->set(p); return *this; } /** * Append another piece to the existing path. Inserts a path * separator between the existing component and the new component. * @param p additional path component */ - void append( const string p ); + void append( const string& p ); /** * Concatenate a string to the end of the path without inserting a * path separator. * @param p addtional path suffix */ - void concat( const string p ); + void concat( const string& p ); /** * Get the directory part of the path. @@ -102,12 +103,23 @@ public: /** Get the path string * @return path string */ - inline string str() const { return path; } + string str() const { return path; } /** Get the path string * @return path in "C" string (ptr to char array) form. */ - inline const char *c_str() { return path.c_str(); } + const char* c_str() { return path.c_str(); } + + /** + * Determine if file exists by attempting to fopen it. + * @return true if file exists, otherwise returns false. + */ + bool exists() const; + +private: + + void fix(); + }; -- 2.39.5