if ( dir == wxT("..") )
{
- if ( m_dirs.IsEmpty() )
+ if ( m_dirs.empty() )
{
- wxLogError(_("The path '%s' contains too many \"..\"!"),
- GetFullPath().c_str());
- return false;
- }
+ // We have more ".." than directory components so far.
+ // Don't treat this as an error as the path could have been
+ // entered by user so try to handle it reasonably: if the
+ // path is absolute, just ignore the extra ".." because
+ // "/.." is the same as "/". Otherwise, i.e. for relative
+ // paths, keep ".." unchanged because removing it would
+ // modify the file a relative path refers to.
+ if ( !m_relative )
+ continue;
- m_dirs.RemoveAt(m_dirs.GetCount() - 1);
- continue;
+ }
+ else // Normal case, go one step up.
+ {
+ m_dirs.pop_back();
+ continue;
+ }
}
}
// test wxPATH_NORM_DOTS
{ "a/.././b/c/../../", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
- { "./", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
- { "b/../", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
+ { "", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
+ { "./foo", wxPATH_NORM_DOTS, "foo", wxPATH_UNIX },
+ { "b/../bar", wxPATH_NORM_DOTS, "bar", wxPATH_UNIX },
+ { "c/../../quux", wxPATH_NORM_DOTS, "../quux", wxPATH_UNIX },
+ { "/c/../../quux", wxPATH_NORM_DOTS, "/quux", wxPATH_UNIX },
// test wxPATH_NORM_TILDE: notice that ~ is only interpreted specially
// when it is the first character in the file name