Filename.cpp
Go to the documentation of this file.00001 //*** Filename.cpp *** 00002 00003 #include "Filename.h" 00004 #include "Debug.h" 00005 #include "StandardLibrary.h" 00006 00007 00008 //*** Default Constructor *** 00009 00010 Filename::Filename(): 00011 filenameString_(0) 00012 { 00013 00014 } 00015 00016 00017 //*** Constructor (c-style string) *** 00018 00019 Filename::Filename(const char* filename): 00020 filenameString_(0) 00021 { 00022 // Make sure filename conforms to standard format 00023 Assert(VerifyFilename(filename), 00024 "Paths and filenames must use forward slash '/' as path separator, must not end with a path separator and must not be of zero length."); 00025 filenameString_=CorrectFilename(filename); 00026 } 00027 00028 00029 //*** Constructor (StringId) *** 00030 00031 Filename::Filename(const StringId& filename): 00032 filenameString_(0) 00033 { 00034 // Make sure filename conforms to standard format 00035 Assert(VerifyFilename(filename.GetString()), 00036 "Paths and filenames must use forward slash '/' as path separator, must not end with a path separator and must not be of zero length."); 00037 filenameId_=CorrectFilename(filename); 00038 } 00039 00040 00041 //*** Copy Constructor *** 00042 00043 Filename::Filename(const Filename& filename): 00044 filenameString_(0), 00045 filenameId_(filename.filenameId_) 00046 { 00047 if (filename.filenameString_) 00048 { 00049 filenameString_=StrDup(filename.filenameString_); 00050 } 00051 } 00052 00053 00054 //*** Destructor *** 00055 00056 Filename::~Filename() 00057 { 00058 if (filenameString_) 00059 { 00060 Free(filenameString_); 00061 filenameString_=0; 00062 } 00063 } 00064 00065 00066 //*** Assignment Operator *** 00067 00068 const Filename& Filename::operator=(const Filename& filename) 00069 { 00070 if (filenameString_) 00071 { 00072 Free(filenameString_); 00073 filenameString_=0; 00074 } 00075 00076 filenameId_=filename.filenameId_; 00077 if (filename.filenameString_) 00078 { 00079 filenameString_=StrDup(filename.filenameString_); 00080 } 00081 00082 return *this; 00083 } 00084 00085 00086 //*** Comparison Operator (equality) *** 00087 00088 bool Filename::operator==(const Filename& filename) const 00089 { 00090 if (filenameString_ || filename.filenameString_) 00091 { 00092 if (GetString()==0 || filename.GetString()==0) 00093 { 00094 return false; 00095 } 00096 return StrICmp(GetString(),filename.GetString())==0; 00097 } 00098 00099 return filenameId_==filename.filenameId_; 00100 } 00101 00102 00103 //*** Comparison Operator (inequality) *** 00104 00105 bool Filename::operator!=(const Filename& filename) const 00106 { 00107 return !(*this==filename); 00108 } 00109 00110 00111 //*** GetString *** 00112 00113 const char* Filename::GetString() const 00114 { 00115 if (filenameString_) 00116 { 00117 return filenameString_; 00118 } 00119 00120 return filenameId_.GetString(); 00121 } 00122 00123 00124 //*** GetStringId *** 00125 00126 StringId Filename::GetStringId() const 00127 { 00128 if (filenameString_) 00129 { 00130 filenameId_=StringId(filenameString_); 00131 Free(filenameString_); 00132 filenameString_=0; 00133 } 00134 00135 return filenameId_; 00136 } 00137 00138 00139 //*** VerifyFilename *** 00140 00141 bool Filename::VerifyFilename(const char* filename) 00142 { 00143 // Empty strings are not valid filenames 00144 if (filename==0) 00145 { 00146 return false; 00147 } 00148 00149 // Filenames can't have backslash 00150 const char* backslash=StrChr(filename,'\\'); 00151 if (backslash) 00152 { 00153 return false; 00154 } 00155 00156 // If it's a path, it may not have a trailing path separator 00157 if (filename[StrLen(filename)-1]=='/') 00158 { 00159 return false; 00160 } 00161 00162 // String is a correctly formated filename or path 00163 return true; 00164 } 00165 00166 00167 //*** CorrectFilename *** 00168 00169 StringId Filename::CorrectFilename(StringId filename) 00170 { 00171 // If it's already a valid filename, just use as is 00172 if (VerifyFilename(filename.GetString())) 00173 { 00174 return filename; 00175 } 00176 00177 // Empty string is interpreted as the current path 00178 if (filename.GetString()==0) 00179 { 00180 return StringId("."); 00181 } 00182 00183 // Create a correct copy of the string 00184 char* string=CorrectFilename(filename.GetString()); 00185 StringId returnValue(string); 00186 Free(string); 00187 00188 return returnValue; 00189 } 00190 00191 00192 //*** CorrectFilename *** 00193 00194 char* Filename::CorrectFilename(const char* filename) 00195 { 00196 // If it's already a valid filename, just use as is 00197 if (VerifyFilename(filename)) 00198 { 00199 return StrDup(filename); 00200 } 00201 00202 // Empty string is interpreted as the current path 00203 if (filename==0 || filename[0]==0) 00204 { 00205 return StrDup("."); 00206 } 00207 00208 // Create a copy of the string 00209 char* string=StrDup(filename); 00210 int length=StrLen(string); 00211 00212 // Replace all backslash separators with forward slash 00213 for (int i=0; i<length; i++) 00214 { 00215 if (string[i]=='\\') 00216 { 00217 string[i]='/'; 00218 } 00219 } 00220 00221 // If there's a trailing path separator, remove it 00222 if (string[length-1]=='/') 00223 { 00224 string[length-1]=0; 00225 } 00226 00227 return string; 00228 } 00229
Reproduction/republishing of any material on this site without permission is strictly prohibited.
