]> git.saurik.com Git - wxWidgets.git/commitdiff
basic wxFileName functions seem to work under Windows
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 28 Mar 2002 00:29:13 +0000 (00:29 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 28 Mar 2002 00:29:13 +0000 (00:29 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14829 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/console/console.cpp
src/common/filename.cpp

index 96f432813c70f876958462c944dc3374239efa4c..f155e4b05094370a19b2a62eef53733106ee2b8b 100644 (file)
@@ -91,7 +91,7 @@
     #undef TEST_ALL
     static const bool TEST_ALL = TRUE;
 #else
-    #define TEST_VOLUME
+    #define TEST_FILENAME
 
     static const bool TEST_ALL = FALSE;
 #endif
@@ -802,6 +802,8 @@ static struct FileNameInfo
     { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE, wxPATH_DOS },
     { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS },
 
+    // wxFileName support for Mac file names is broken crurently
+#if 0
     // Mac file names
     { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE, wxPATH_MAC },
     { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE, wxPATH_MAC },
@@ -809,6 +811,7 @@ static struct FileNameInfo
     { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE, wxPATH_MAC },
     { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC },
     { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC },
+#endif // 0
 
     // VMS file names
     { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE, wxPATH_VMS },
@@ -831,7 +834,7 @@ static void TestFileNameConstruction()
             printf("ERROR: fullname should be '%s'\n", fni.fullname);
         }
 
-        bool isAbsolute = fn.IsAbsolute();
+        bool isAbsolute = fn.IsAbsolute(fni.format);
         printf("'%s' is %s (%s)\n\t",
                fullname.c_str(),
                isAbsolute ? "absolute" : "relative",
@@ -884,11 +887,14 @@ static void TestFileNameTemp()
 
     static const char *tmpprefixes[] =
     {
+        "",
         "foo",
-        "/tmp/foo",
         "..",
         "../bar",
+#ifdef __UNIX__
+        "/tmp/foo",
         "/tmp/foo/bar", // this one must be an error
+#endif // __UNIX__
     };
 
     for ( size_t n = 0; n < WXSIZEOF(tmpprefixes); n++ )
@@ -5693,7 +5699,7 @@ int main(int argc, char **argv)
 #endif // TEST_FILE
 
 #ifdef TEST_FILENAME
-    if ( 1 )
+    if ( 0 )
     {
         wxFileName fn;
         fn.Assign("c:\\foo", "bar.baz");
@@ -5701,7 +5707,7 @@ int main(int argc, char **argv)
         DumpFileName(fn);
     }
 
-    if ( TEST_ALL )
+    if ( 1 )
     {
         TestFileNameConstruction();
         TestFileNameMakeRelative();
index 439490514f4a5d1497179c7ea0ba69dda6d96a10..08bebb725b3283e42cb268509444a76cb1cfba99 100644 (file)
@@ -252,7 +252,7 @@ void wxFileName::Assign( const wxFileName &filepath )
     m_dirs = filepath.GetDirs();
     m_name = filepath.GetName();
     m_ext = filepath.GetExt();
-    m_relative = filepath.IsRelative();
+    m_relative = filepath.m_relative;
 }
 
 void wxFileName::Assign(const wxString& volume,
@@ -270,19 +270,21 @@ void wxFileName::Assign(const wxString& volume,
 
 void wxFileName::SetPath( const wxString &path, wxPathFormat format )
 {
-    wxPathFormat my_format = GetFormat( format );
-    wxString my_path = path;
-
     m_dirs.Clear();
 
-    if (!my_path.empty())
+    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 = ( my_path[0u] == wxT(':') );
+                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
@@ -294,18 +296,23 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
                 // actually means <UP>, whereas under DOS, double
                 // slashes can be ignored: "\\\\" is the same as "\\".
                 if (m_relative)
-                    my_path.Remove( 0, 1 );
+                    my_path.erase( 0, 1 );
                 break;
+
             case wxPATH_VMS:
                 // TODO: what is the relative path format here?
                 m_relative = FALSE;
                 break;
+
             case wxPATH_UNIX:
-                m_relative = ( my_path[0u] != wxT('/') );
+                // the paths of the form "~" or "~username" are absolute
+                m_relative = leadingChar != wxT('/') && leadingChar != _T('~');
                 break;
+
             case wxPATH_DOS:
-                m_relative = ( (my_path[0u] != wxT('/')) && (my_path[0u] != wxT('\\')) );
+                m_relative = !IsPathSeparator(leadingChar, my_format);
                 break;
+
             default:
                 wxFAIL_MSG( wxT("error") );
                 break;
@@ -335,7 +342,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
             }
         }
     }
-    else
+    else // no path at all
     {
         m_relative = TRUE;
     }
@@ -531,6 +538,12 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp)
             dir = _T('.');
         }
     }
+    else // we have a dir to create the file in
+    {
+        // ensure we use only the back slashes as GetTempFileName(), unlike all
+        // the other APIs, is picky and doesn't accept the forward ones
+        dir.Replace(_T("/"), _T("\\"));
+    }
 
     if ( !::GetTempFileName(dir, name, 0, wxStringBuffer(path, MAX_PATH + 1)) )
     {
@@ -766,7 +779,7 @@ bool wxFileName::Normalize(int flags,
     format = GetFormat(format);
 
     // make the path absolute
-    if ( (flags & wxPATH_NORM_ABSOLUTE) && m_relative )
+    if ( (flags & wxPATH_NORM_ABSOLUTE) && !IsAbsolute(format) )
     {
         if ( cwd.empty() )
         {
@@ -777,7 +790,6 @@ bool wxFileName::Normalize(int flags,
             curDir.AssignDir(cwd);
         }
 
-#if 0
         // the path may be not absolute because it doesn't have the volume name
         // but in this case we shouldn't modify the directory components of it
         // but just set the current volume
@@ -785,14 +797,12 @@ bool wxFileName::Normalize(int flags,
         {
             SetVolume(curDir.GetVolume());
 
-            if ( IsAbsolute() )
+            if ( !m_relative )
             {
                 // yes, it was the case - we don't need curDir then
                 curDir.Clear();
             }
         }
-#endif
-        m_relative = FALSE;
     }
 
     // handle ~ stuff under Unix only
@@ -880,6 +890,31 @@ bool wxFileName::Normalize(int flags,
     }
 #endif // Win32
 
+    // we do have the path now
+    m_relative = FALSE;
+
+    return TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// absolute/relative paths
+// ----------------------------------------------------------------------------
+
+bool wxFileName::IsAbsolute(wxPathFormat format) const
+{
+    // if our path doesn't start with a path separator, it's not an absolute
+    // path
+    if ( m_relative )
+        return FALSE;
+
+    if ( !GetVolumeSeparator(format).empty() )
+    {
+        // this format has volumes and an absolute path must have one, it's not
+        // enough to have the full path to bean absolute file under Windows
+        if ( GetVolume().empty() )
+            return FALSE;
+    }
+
     return TRUE;
 }
 
@@ -1012,11 +1047,10 @@ bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format)
     return GetPathSeparators(format).Find(ch) != wxNOT_FOUND;
 }
 
-bool wxFileName::IsWild( wxPathFormat format )
+bool wxFileName::IsWild( wxPathFormat WXUNUSED(format) )
 {
     // FIXME: this is probably false for Mac and this is surely wrong for most
     //        of Unix shells (think about "[...]")
-    (void)format;
     return m_name.find_first_of(_T("*?")) != wxString::npos;
 }
 
@@ -1064,10 +1098,8 @@ wxString wxFileName::GetFullName() const
     return fullname;
 }
 
-wxString wxFileName::GetPath( bool, wxPathFormat format ) const
+wxString wxFileName::GetPath( bool add_separator, wxPathFormat format ) const
 {
-    // Should add_seperator parameter be used?
-
     format = GetFormat( format );
 
     wxString fullpath;
@@ -1143,7 +1175,10 @@ wxString wxFileName::GetPath( bool, wxPathFormat format ) const
         }
     }
 
-
+    if ( add_separator && !fullpath.empty() )
+    {
+        fullpath += GetPathSeparators(format)[0u];
+    }
 
     return fullpath;
 }
@@ -1175,19 +1210,27 @@ wxString wxFileName::GetFullPath( wxPathFormat format ) const
     }
 
     // the leading character
-    if ( format == wxPATH_MAC && m_relative )
+    if ( format == wxPATH_MAC )
     {
-         fullpath += wxFILE_SEP_PATH_MAC;
+        if ( m_relative )
+            fullpath += wxFILE_SEP_PATH_MAC;
     }
     else if ( format == wxPATH_DOS )
     {
-         if (!m_relative)
-             fullpath += wxFILE_SEP_PATH_DOS;
+        if ( !m_relative )
+            fullpath += wxFILE_SEP_PATH_DOS;
     }
     else if ( format == wxPATH_UNIX )
     {
-         if (!m_relative)
-             fullpath += wxFILE_SEP_PATH_UNIX;
+        if ( !m_relative )
+        {
+            // normally the absolute file names starts with a slash with one
+            // exception: file names like "~/foo.bar" don't have it
+            if ( m_dirs.IsEmpty() || m_dirs[0u] != _T('~') )
+            {
+                fullpath += wxFILE_SEP_PATH_UNIX;
+            }
+        }
     }
 
     // then concatenate all the path components using the path separator
@@ -1287,7 +1330,7 @@ wxString wxFileName::GetLongPath() const
 #if defined(__WIN32__) && !defined(__WXMICROWIN__)
     bool success = FALSE;
 
-    // VZ: this code was disabled, why?
+    // VZ: why was this code disabled?
 #if 0 // wxUSE_DYNAMIC_LOADER
     typedef DWORD (*GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD);