X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fpath.cpp;h=353c63eca182d97ed1c5daa5e2c15bab7857665e;hp=4db7f0cc140185d46234aa54eebfb1042af4e160;hb=20c897ece781e18ba54c41fd68e232ce566a938d;hpb=d6a72ed8ba181dc35bd750811bf4a10a5583d472 diff --git a/source/fs/path.cpp b/source/fs/path.cpp index 4db7f0c..353c63e 100644 --- a/source/fs/path.cpp +++ b/source/fs/path.cpp @@ -7,8 +7,8 @@ using namespace std; namespace { -#ifdef WIN32 -inline bool is_windows_drive(const std::string &p) +#ifdef _WIN32 +inline bool is_windows_drive(const string &p) { return (p.size()==2 && ((p[0]>='A' && p[0]<='Z') || (p[0]>='a' && p[0]<='z')) && p[1]==':'); } #endif @@ -58,8 +58,8 @@ unsigned Path::size() const bool Path::is_absolute() const { -#ifdef WIN32 - if(is_windows_drive((*this)[0])) +#ifdef _WIN32 + if(!empty() && is_windows_drive((*this)[0])) return true; #endif return path[0]==DIRSEP; @@ -103,7 +103,7 @@ void Path::add_component(const string &comp) if(comp.size()==1 && (comp[0]=='/' || comp[0]=='\\')) { // Replace the path with the root directory -#ifdef WIN32 +#ifdef _WIN32 string::size_type slash = (separators.empty() ? string::npos : separators.front()); if(is_windows_drive(path.substr(0, slash))) { @@ -118,7 +118,7 @@ void Path::add_component(const string &comp) separators.push_back(0); } } -#ifdef WIN32 +#ifdef _WIN32 else if(is_windows_drive(comp)) { path = comp; @@ -132,7 +132,7 @@ void Path::add_component(const string &comp) // .. in root directory is a no-op else if(path.size()==1 && path[0]==DIRSEP) ; -#ifdef WIN32 +#ifdef _WIN32 else if(is_windows_drive(path)) ; #endif @@ -192,7 +192,7 @@ string Path::operator[](int n) const bool Path::operator==(const Path &other) const { -#ifdef WIN32 +#ifdef _WIN32 return strcasecmp(path, other.path)==0; #else return path==other.path; @@ -201,7 +201,7 @@ bool Path::operator==(const Path &other) const bool Path::operator<(const Path &other) const { -#ifdef WIN32 +#ifdef _WIN32 return strcasecmp(path, other.path)<0; #else return path(const Path &other) const { -#ifdef WIN32 +#ifdef _WIN32 return strcasecmp(path, other.path)>0; #else return path>other.path; @@ -222,7 +222,9 @@ Path::Iterator::Iterator(const Path &p, bool e): path(&p), iter(e ? path->separators.end() : path->separators.begin()), end(e || path->path.empty()) -{ } +{ + update(); +} Path::Iterator &Path::Iterator::operator++() { @@ -234,6 +236,7 @@ Path::Iterator &Path::Iterator::operator++() if(path->path.size()==1 && path->separators.size()==1) end = true; } + update(); return *this; } @@ -247,13 +250,17 @@ Path::Iterator &Path::Iterator::operator--() } else if(iter!=path->separators.begin()) --iter; + update(); return *this; } -string Path::Iterator::operator*() const +void Path::Iterator::update() { if(end) - throw logic_error("Path::Iterator::operator*"); + { + current.clear(); + return; + } string::size_type start = 0; if(iter!=path->separators.begin()) @@ -267,8 +274,9 @@ string Path::Iterator::operator*() const slash = *iter; if(slash==0) - return path->path.substr(start, 1); - return path->path.substr(start, slash-start); + current = path->path.substr(start, 1); + else + current = path->path.substr(start, slash-start); } } // namespace FS