added and documented SplitVolume() and GetPathTerminators(); corrected SetPath() to treat the volume part properly (patch 970580)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28468 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2004-07-25 13:59:47 +00:00
parent f095b1fc57
commit f1e7793361
3 changed files with 155 additions and 92 deletions

View File

@@ -312,84 +312,95 @@ void wxFileName::Assign(const wxString& volume,
m_name = name;
}
void wxFileName::SetPath( const wxString &path, wxPathFormat format )
void wxFileName::SetPath( const wxString& pathOrig, wxPathFormat format )
{
m_dirs.Clear();
if ( !path.empty() )
{
wxPathFormat my_format = GetFormat( format );
wxString my_path = path;
// 1) Determine if the path is relative or absolute.
wxChar leadingChar = my_path[0u];
switch (my_format)
{
case wxPATH_MAC:
m_relative = leadingChar == wxT(':');
// We then remove a leading ":". The reason is in our
// storage form for relative paths:
// ":dir:file.txt" actually means "./dir/file.txt" in
// DOS notation and should get stored as
// (relative) (dir) (file.txt)
// "::dir:file.txt" actually means "../dir/file.txt"
// stored as (relative) (..) (dir) (file.txt)
// This is important only for the Mac as an empty dir
// actually means <UP>, whereas under DOS, double
// slashes can be ignored: "\\\\" is the same as "\\".
if (m_relative)
my_path.erase( 0, 1 );
break;
case wxPATH_VMS:
// TODO: what is the relative path format here?
m_relative = false;
break;
default:
wxFAIL_MSG( _T("Unknown path format") );
// !! Fall through !!
case wxPATH_UNIX:
// the paths of the form "~" or "~username" are absolute
m_relative = leadingChar != wxT('/') && leadingChar != _T('~');
break;
case wxPATH_DOS:
m_relative = !IsPathSeparator(leadingChar, my_format);
break;
}
// 2) Break up the path into its members. If the original path
// was just "/" or "\\", m_dirs will be empty. We know from
// the m_relative field, if this means "nothing" or "root dir".
wxStringTokenizer tn( my_path, GetPathSeparators(my_format) );
while ( tn.HasMoreTokens() )
{
wxString token = tn.GetNextToken();
// Remove empty token under DOS and Unix, interpret them
// as .. under Mac.
if (token.empty())
{
if (my_format == wxPATH_MAC)
m_dirs.Add( wxT("..") );
// else ignore
}
else
{
m_dirs.Add( token );
}
}
}
else // no path at all
if ( pathOrig.empty() )
{
// no path at all
m_relative = true;
return;
}
format = GetFormat( format );
// 0) deal with possible volume part first
wxString volume,
path;
SplitVolume(pathOrig, &volume, &path, format);
if ( !volume.empty() )
{
m_relative = false;
SetVolume(volume);
}
// 1) Determine if the path is relative or absolute.
wxChar leadingChar = path[0u];
switch (format)
{
case wxPATH_MAC:
m_relative = leadingChar == wxT(':');
// We then remove a leading ":". The reason is in our
// storage form for relative paths:
// ":dir:file.txt" actually means "./dir/file.txt" in
// DOS notation and should get stored as
// (relative) (dir) (file.txt)
// "::dir:file.txt" actually means "../dir/file.txt"
// stored as (relative) (..) (dir) (file.txt)
// This is important only for the Mac as an empty dir
// actually means <UP>, whereas under DOS, double
// slashes can be ignored: "\\\\" is the same as "\\".
if (m_relative)
path.erase( 0, 1 );
break;
case wxPATH_VMS:
// TODO: what is the relative path format here?
m_relative = false;
break;
default:
wxFAIL_MSG( _T("Unknown path format") );
// !! Fall through !!
case wxPATH_UNIX:
// the paths of the form "~" or "~username" are absolute
m_relative = leadingChar != wxT('/') && leadingChar != _T('~');
break;
case wxPATH_DOS:
m_relative = !IsPathSeparator(leadingChar, format);
break;
}
// 2) Break up the path into its members. If the original path
// was just "/" or "\\", m_dirs will be empty. We know from
// the m_relative field, if this means "nothing" or "root dir".
wxStringTokenizer tn( path, GetPathSeparators(format) );
while ( tn.HasMoreTokens() )
{
wxString token = tn.GetNextToken();
// Remove empty token under DOS and Unix, interpret them
// as .. under Mac.
if (token.empty())
{
if (format == wxPATH_MAC)
m_dirs.Add( wxT("..") );
// else ignore
}
else
{
m_dirs.Add( token );
}
}
}
@@ -1244,6 +1255,16 @@ wxString wxFileName::GetPathSeparators(wxPathFormat format)
return seps;
}
/* static */
wxString wxFileName::GetPathTerminators(wxPathFormat format)
{
format = GetFormat(format);
// under VMS the end of the path is ']', not the path separator used to
// separate the components
return format == wxPATH_VMS ? wxString(_T(']')) : GetPathSeparators(format);
}
/* static */
bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format)
{
@@ -1618,22 +1639,16 @@ wxPathFormat wxFileName::GetFormat( wxPathFormat format )
// ----------------------------------------------------------------------------
/* static */
void wxFileName::SplitPath(const wxString& fullpathWithVolume,
wxString *pstrVolume,
wxString *pstrPath,
wxString *pstrName,
wxString *pstrExt,
wxPathFormat format)
void
wxFileName::SplitVolume(const wxString& fullpathWithVolume,
wxString *pstrVolume,
wxString *pstrPath,
wxPathFormat format)
{
format = GetFormat(format);
wxString fullpath = fullpathWithVolume;
// under VMS the end of the path is ']', not the path separator used to
// separate the components
wxString sepPath = format == wxPATH_VMS ? wxString(_T(']'))
: GetPathSeparators(format);
// special Windows UNC paths hack: transform \\share\path into share:path
if ( format == wxPATH_DOS )
{
@@ -1643,7 +1658,8 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume,
{
fullpath.erase(0, 2);
size_t posFirstSlash = fullpath.find_first_of(sepPath);
size_t posFirstSlash =
fullpath.find_first_of(GetPathTerminators(format));
if ( posFirstSlash != wxString::npos )
{
fullpath[posFirstSlash] = wxFILE_SEP_DSK;
@@ -1672,21 +1688,38 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume,
}
}
if ( pstrPath )
*pstrPath = fullpath;
}
/* static */
void wxFileName::SplitPath(const wxString& fullpathWithVolume,
wxString *pstrVolume,
wxString *pstrPath,
wxString *pstrName,
wxString *pstrExt,
wxPathFormat format)
{
format = GetFormat(format);
wxString fullpath;
SplitVolume(fullpathWithVolume, pstrVolume, &fullpath, format);
// find the positions of the last dot and last path separator in the path
size_t posLastDot = fullpath.find_last_of(wxFILE_SEP_EXT);
size_t posLastSlash = fullpath.find_last_of(sepPath);
size_t posLastSlash = fullpath.find_last_of(GetPathTerminators(format));
// check whether this dot occurs at the very beginning of a path component
if ( (posLastDot != wxString::npos) &&
(posLastDot == 0 ||
IsPathSeparator(fullpath[posLastDot - 1]) ||
(format == wxPATH_VMS && fullpath[posLastDot - 1] == _T(']'))) )
{
// dot may be (and commonly -- at least under Unix -- is) the first
// character of the filename, don't treat the entire filename as
// extension in this case
posLastDot = wxString::npos;
}
{
// dot may be (and commonly -- at least under Unix -- is) the first
// character of the filename, don't treat the entire filename as
// extension in this case
posLastDot = wxString::npos;
}
// if we do have a dot and a slash, check that the dot is in the name part
if ( (posLastDot != wxString::npos) &&