Distributed under the LGPL
*/
+#include <msp/core/except.h>
#include <msp/strings/utils.h>
#include "path.h"
#include "utils.h"
}
else
{
- for(Iterator i=--end();; --i)
+ for(Iterator i=end(); i!=begin();)
{
+ --i;
if(!++n)
return *i;
- if(i==begin())
- break;
}
}
- return string();
+ throw InvalidParameterValue("Path component index out of range");
}
bool Path::operator==(const Path &p) const
void Path::init(const string &p)
{
- unsigned start=0;
+ string::size_type start=0;
if(p[0]=='/' || p[0]=='\\')
add_component(string(1, DIRSEP));
while(1)
{
- unsigned slash=p.find_first_of("/\\", start);
+ string::size_type slash=p.find_first_of("/\\", start);
if(slash>start)
add_component(p.substr(start, slash-start));
if(slash==string::npos)
#endif
else if(comp=="..")
{
- if(path.empty())
+ if(path.empty() || path==".")
path=comp;
// .. in root directory is a no-op
else if(path.size()==1 && path[0]==DIRSEP)
#endif
else
{
- unsigned slash=path.rfind(DIRSEP);
- unsigned start=(slash==string::npos ? 0 : slash+1);
+ string::size_type slash=path.rfind(DIRSEP);
+ string::size_type start=(slash==string::npos ? 0 : slash+1);
if(!path.compare(start, string::npos, ".."))
{
// If the last component already is a .., add another
path+=DIRSEP;
path+=comp;
}
+ else if(slash==string::npos)
+ path=".";
else
+ {
+ if(slash==0)
+ slash=1;
// Otherwise, erase the last component
path.erase(slash, string::npos);
+ }
}
}
else if(comp!="." || path.empty())
{
- if(path==".")
- path="";
+ if(comp!="." && path.empty())
+ path=".";
if(path.size()>1 || (path.size()==1 && path[0]!=DIRSEP))
path+=DIRSEP;
path+=comp;