Fix MSYS2 issues
[xonotic/netradiant.git] / libs / fs_path.h
1 /*
2    Copyright (C) 2001-2006, William Joseph.
3    All Rights Reserved.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #if !defined( INCLUDED_FS_PATH_H )
23 #define INCLUDED_FS_PATH_H
24
25 #include "stream/stringstream.h"
26
27 /// \brief A unix-style path string which can be modified at runtime.
28 ///
29 /// - Maintains a path ending in a path-separator.
30 /// - Provides a limited STL-style interface to push and pop file or directory names at the end of the path.
31 class UnixPath
32 {
33 StringBuffer m_string;
34
35 void check_separator(){
36         if ( !empty() && m_string.back() != '/' ) {
37                 m_string.push_back( '/' );
38         }
39 }
40
41 public:
42 /// \brief Constructs with the directory \p root.
43 UnixPath( const char* root )
44         : m_string( root ){
45         check_separator();
46 }
47
48 bool empty() const {
49         return m_string.empty();
50 }
51
52 const char* c_str() const {
53         return m_string.c_str();
54 }
55
56 /// \brief Appends the directory \p name.
57 void push( const char* name ){
58         m_string.push_string( name );
59         check_separator();
60 }
61 /// \brief Appends the directory [\p first, \p last).
62 void push( const char* first, const char* last ){
63         m_string.push_range( first, last );
64         check_separator();
65 }
66 /// \brief Appends the filename \p name.
67 void push_filename( const char* name ){
68         m_string.push_string( name );
69 }
70 /// \brief Removes the last directory or filename appended.
71 void pop(){
72         if ( m_string.back() == '/' ) {
73                 m_string.pop_back();
74         }
75         while ( !empty() && m_string.back() != '/' )
76         {
77                 m_string.pop_back();
78         }
79 }
80 };
81
82 #endif