/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined( INCLUDED_FS_PATH_H ) #define INCLUDED_FS_PATH_H #include "stream/stringstream.h" /// \brief A unix-style path string which can be modified at runtime. /// /// - Maintains a path ending in a path-separator. /// - Provides a limited STL-style interface to push and pop file or directory names at the end of the path. class UnixPath { StringBuffer m_string; void check_separator(){ if ( !empty() && m_string.back() != '/' ) { m_string.push_back( '/' ); } } public: /// \brief Constructs with the directory \p root. UnixPath( const char* root ) : m_string( root ){ check_separator(); } bool empty() const { return m_string.empty(); } const char* c_str() const { return m_string.c_str(); } /// \brief Appends the directory \p name. void push( const char* name ){ m_string.push_string( name ); check_separator(); } /// \brief Appends the directory [\p first, \p last). void push( const char* first, const char* last ){ m_string.push_range( first, last ); check_separator(); } /// \brief Appends the filename \p name. void push_filename( const char* name ){ m_string.push_string( name ); } /// \brief Removes the last directory or filename appended. void pop(){ if ( m_string.back() == '/' ) { m_string.pop_back(); } while ( !empty() && m_string.back() != '/' ) { m_string.pop_back(); } } }; #endif