#endif
-// If Unix, replace all ":" with "/". In windoze, allow the
-// second character to be a ":" for things like c:\foo\bar
-
+// For windows, replace "\" by "/".
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 ( path[i] == sgDirPathSepBad ) {
- path[i] = sgDirPathSep;
+ string::size_type sz = path.size();
+ for ( string::size_type i = 0; i < sz; ++i ) {
+ if ( path[i] == sgDirPathSepBad ) {
+ path[i] = sgDirPathSep;
+ }
}
+ // drop trailing "/"
+ while ((sz>1)&&(path[sz-1]==sgDirPathSep))
+ {
+ path.resize(--sz);
}
}
// Get the file part of the path (everything after the last path sep)
-string SGPath::file() const {
- int index = path.rfind(sgDirPathSep);
- if (index >= 0) {
- return path.substr(index + 1);
+string SGPath::file() const
+{
+ string::size_type index = path.rfind(sgDirPathSep);
+ if (index != string::npos) {
+ return path.substr(index + 1);
} else {
- return "";
+ return path;
}
}
string SGPath::dir() const {
int index = path.rfind(sgDirPathSep);
if (index >= 0) {
- return path.substr(0, index);
+ return path.substr(0, index);
} else {
- return "";
+ return "";
}
}
// get the base part of the path (everything but the extension.)
-string SGPath::base() const {
- unsigned int index = path.rfind(sgDirPathSep);
- if (index == string::npos) {
- index = 0; // no separator in the name
- } else {
- ++index; // skip past the separator
- }
-
-// find the first dot after the final separator
- unsigned int firstDot = path.find(".", index);
- if (firstDot == string::npos) {
- return path; // no extension, return whole path
+string SGPath::base() const
+{
+ string::size_type index = path.rfind(".");
+ string::size_type lastSep = path.rfind(sgDirPathSep);
+
+// tolerate dots inside directory names
+ if ((lastSep != string::npos) && (index < lastSep)) {
+ return path;
}
- return path.substr(0, firstDot);
+ if (index != string::npos) {
+ return path.substr(0, index);
+ } else {
+ return path;
+ }
}
string SGPath::file_base() const
{
- unsigned int index = path.rfind(sgDirPathSep);
+ string::size_type index = path.rfind(sgDirPathSep);
if (index == string::npos) {
index = 0; // no separator in the name
} else {
++index; // skip past the separator
}
- unsigned int firstDot = path.find(".", index);
+ string::size_type firstDot = path.find(".", index);
if (firstDot == string::npos) {
return path.substr(index); // no extensions
}
string SGPath::complete_lower_extension() const
{
- unsigned int index = path.rfind(sgDirPathSep);
+ string::size_type index = path.rfind(sgDirPathSep);
if (index == string::npos) {
index = 0; // no separator in the name
} else {
++index; // skip past the separator
}
- int firstDot = path.find(".", index);
- if ((firstDot >= 0) && (path.find(sgDirPathSep, firstDot) == string::npos)) {
+ string::size_type firstDot = path.find(".", index);
+ if ((firstDot != string::npos) && (path.find(sgDirPathSep, firstDot) == string::npos)) {
return boost::to_lower_copy(path.substr(firstDot + 1));
} else {
return "";