Fixed some issues related to normalization and de-normalization.

http://reviews.llvm.org/D4675

Files:
  include/lldb/Host/FileSpec.h
  include/lldb/Host/Host.h
  source/Host/common/FileSpec.cpp
  source/Host/common/Host.cpp
Index: include/lldb/Host/FileSpec.h
===================================================================
--- include/lldb/Host/FileSpec.h
+++ include/lldb/Host/FileSpec.h
@@ -51,13 +51,6 @@
         eFileTypeOther
     } FileType;
 
-    enum PathSyntax
-    {
-        ePathSyntaxPosix,
-        ePathSyntaxWindows,
-        ePathSyntaxHostNative
-    };
-
     FileSpec();
 
     //------------------------------------------------------------------
@@ -76,7 +69,7 @@
     ///
     /// @see FileSpec::SetFile (const char *path, bool resolve)
     //------------------------------------------------------------------
-    explicit FileSpec (const char *path, bool resolve_path, PathSyntax syntax = ePathSyntaxHostNative);
+    explicit FileSpec (const char *path, bool resolve_path);
 
     //------------------------------------------------------------------
     /// Copy constructor
@@ -298,12 +291,6 @@
     uint64_t
     GetByteSize() const;
 
-    PathSyntax
-    GetPathSyntax() const;
-
-    bool
-    IsDirectoryRoot() const;
-
     //------------------------------------------------------------------
     /// Directory string get accessor.
     ///
@@ -388,7 +375,7 @@
     ///     still NULL terminated).
     //------------------------------------------------------------------
     size_t
-    GetPath (char *path, size_t max_path_length, bool denormalize = true) const;
+    GetPath (char *path, size_t max_path_length) const;
 
     //------------------------------------------------------------------
     /// Extract the full path to the file.
@@ -400,7 +387,7 @@
     ///     concatenated.
     //------------------------------------------------------------------
     std::string
-    GetPath (bool denormalize = true) const;
+    GetPath () const;
 
     //------------------------------------------------------------------
     /// Extract the extension of the file.
@@ -572,10 +559,6 @@
     //------------------------------------------------------------------
     lldb::DataBufferSP
     ReadFileContentsAsCString(Error *error_ptr = NULL);
-
-    static void Normalize(llvm::StringRef path, llvm::SmallVectorImpl<char> &result, PathSyntax syntax);
-    static void DeNormalize(llvm::StringRef path, llvm::SmallVectorImpl<char> &result, PathSyntax syntax);
-
     //------------------------------------------------------------------
     /// Change the file specified with a new path.
     ///
@@ -591,7 +574,7 @@
     ///     the static FileSpec::Resolve.
     //------------------------------------------------------------------
     void
-    SetFile (const char *path, bool resolve_path, PathSyntax syntax = ePathSyntaxHostNative);
+    SetFile (const char *path, bool resolve_path);
 
     bool
     IsResolved () const
@@ -726,7 +709,6 @@
     ConstString m_directory;    ///< The uniqued directory path
     ConstString m_filename;     ///< The uniqued filename path
     mutable bool m_is_resolved; ///< True if this path has been resolved.
-    PathSyntax m_syntax;        ///< The syntax that this path uses (e.g. Windows / Posix)
 };
 
 //----------------------------------------------------------------------
Index: include/lldb/Host/Host.h
===================================================================
--- include/lldb/Host/Host.h
+++ include/lldb/Host/Host.h
@@ -362,15 +362,6 @@
     SetShortThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name, size_t len);
 
     //------------------------------------------------------------------
-    /// Gets the host environment's native path syntax (Windows / Posix).
-    ///
-    /// @return
-    ///     \b One of {FileSpec::ePathSyntaxWindows, FileSpec::ePathSyntaxPosix}
-    //------------------------------------------------------------------
-    static FileSpec::PathSyntax
-    GetHostPathSyntax();
-
-    //------------------------------------------------------------------
     /// Gets the FileSpec of the user profile directory.  On Posix-platforms
     /// this is ~, and on windows this is generally something like
     /// C:\Users\Alice.
Index: source/Host/common/FileSpec.cpp
===================================================================
--- source/Host/common/FileSpec.cpp
+++ source/Host/common/FileSpec.cpp
@@ -237,13 +237,13 @@
 // Default constructor that can take an optional full path to a
 // file on disk.
 //------------------------------------------------------------------
-FileSpec::FileSpec(const char *pathname, bool resolve_path, PathSyntax syntax) :
+FileSpec::FileSpec(const char *pathname, bool resolve_path) :
     m_directory(),
     m_filename(),
     m_is_resolved(false)
 {
     if (pathname && pathname[0])
-        SetFile(pathname, resolve_path, syntax);
+        SetFile(pathname, resolve_path);
 }
 
 //------------------------------------------------------------------
@@ -289,66 +289,42 @@
     return *this;
 }
 
-void FileSpec::Normalize(llvm::StringRef path, llvm::SmallVectorImpl<char> &result, PathSyntax syntax)
-{
-    result.clear();
-    result.append(path.begin(), path.end());
-    if (syntax == ePathSyntaxPosix || (syntax == ePathSyntaxHostNative && Host::GetHostPathSyntax() == ePathSyntaxPosix))
-        return;
-
-    std::replace(result.begin(), result.end(), '\\', '/');
-}
-
-void FileSpec::DeNormalize(llvm::StringRef path, llvm::SmallVectorImpl<char> &result, PathSyntax syntax)
-{
-    result.clear();
-    result.append(path.begin(), path.end());
-    if (syntax == ePathSyntaxPosix || (syntax == ePathSyntaxHostNative && Host::GetHostPathSyntax() == ePathSyntaxPosix))
-        return;
-
-    std::replace(result.begin(), result.end(), '/', '\\');
-}
-
 //------------------------------------------------------------------
 // Update the contents of this object with a new path. The path will
 // be split up into a directory and filename and stored as uniqued
 // string values for quick comparison and efficient memory usage.
 //------------------------------------------------------------------
 void
-FileSpec::SetFile (const char *pathname, bool resolve, PathSyntax syntax)
+FileSpec::SetFile (const char *pathname, bool resolve)
 {
     m_filename.Clear();
     m_directory.Clear();
     m_is_resolved = false;
-    m_syntax = (syntax == ePathSyntaxHostNative) ? Host::GetHostPathSyntax() : syntax;
-
     if (pathname == NULL || pathname[0] == '\0')
         return;
 
-    llvm::SmallString<64> normalized;
-    Normalize(pathname, normalized, syntax);
-
-    std::vector<char> resolved_path(PATH_MAX);
+    char resolved_path[PATH_MAX];
     bool path_fit = true;
     
     if (resolve)
     {
-        path_fit = (FileSpec::Resolve (normalized.c_str(), &resolved_path[0], resolved_path.size()) < resolved_path.size() - 1);
+        path_fit = (FileSpec::Resolve (pathname, resolved_path, sizeof(resolved_path)) < sizeof(resolved_path) - 1);
         m_is_resolved = path_fit;
     }
     else
     {
         // Copy the path because "basename" and "dirname" want to muck with the
         // path buffer
-        if (normalized.size() > resolved_path.size() - 1)
+        if (::strlen (pathname) > sizeof(resolved_path) - 1)
             path_fit = false;
         else
-            ::strcpy (&resolved_path[0], normalized.c_str());
+            ::strcpy (resolved_path, pathname);
     }
+
     
     if (path_fit)
     {
-        llvm::StringRef resolve_path_ref(&resolved_path[0]);
+        llvm::StringRef resolve_path_ref(resolved_path);
         llvm::StringRef filename_ref = llvm::sys::path::filename(resolve_path_ref);
         if (!filename_ref.empty())
         {
@@ -358,7 +334,7 @@
                 m_directory.SetString(directory_ref);
         }
         else
-            m_directory.SetCString(&resolved_path[0]);
+            m_directory.SetCString(resolved_path);
     }
 }
 
@@ -604,7 +580,7 @@
         return true;    // We have already resolved this path
 
     char path_buf[PATH_MAX];    
-    if (!GetPath (path_buf, PATH_MAX, false))
+    if (!GetPath (path_buf, PATH_MAX))
         return false;
     // SetFile(...) will set m_is_resolved correctly if it can resolve the path
     SetFile (path_buf, true);
@@ -620,35 +596,6 @@
     return 0;
 }
 
-FileSpec::PathSyntax
-FileSpec::GetPathSyntax() const
-{
-    return m_syntax;
-}
-
-bool
-FileSpec::IsDirectoryRoot() const
-{
-    return llvm::sys::path::has_parent_path(m_directory.AsCString());
-    //if (m_syntax == ePathSyntaxPosix)
-    //{
-    //    if (m_directory.GetLength() == 1 && m_directory == ConstString("/"))
-    //        return true;
-    //    if (m_directory.GetLength() == 0)
-    //        return true;
-    //}
-    //else
-    //{
-    //    if (m_directory.GetLength() == 1 && m_directory == ConstString("/"))
-    //        return true;
-    //    if ((m_directory.GetLength() == 2 || m_directory.GetLength() == 3) && m_directory[1] == ":")
-    //        return true;
-    //}
-
-    return false;
-}
-
-
 FileSpec::FileType
 FileSpec::GetFileType () const
 {
@@ -734,31 +681,45 @@
 // values.
 //------------------------------------------------------------------
 size_t
-FileSpec::GetPath(char *path, size_t path_max_len, bool denormalize) const
+FileSpec::GetPath(char *path, size_t path_max_len) const
 {
-    std::string result = GetPath(denormalize);
-
-    size_t result_length = std::min(path_max_len-1, result.length());
-    ::strncpy(path, result.c_str(), result_length + 1);
-    return result_length;
+    if (path_max_len)
+    {
+        const char *dirname = m_directory.GetCString();
+        const char *filename = m_filename.GetCString();
+        if (dirname)
+        {
+            if (filename)
+                return ::snprintf (path, path_max_len, "%s/%s", dirname, filename);
+            else
+                return ::snprintf (path, path_max_len, "%s", dirname);
+        }
+        else if (filename)
+        {
+            return ::snprintf (path, path_max_len, "%s", filename);
+        }
+    }
+    if (path)
+        path[0] = '\0';
+    return 0;
 }
 
 std::string
-FileSpec::GetPath (bool denormalize) const
+FileSpec::GetPath (void) const
 {
-    llvm::SmallString<64> result;
-    if (m_directory)
-        result.append(m_directory.GetCString());
-    if (m_filename)
-        llvm::sys::path::append(result, m_filename.GetCString());
-    if (denormalize && !result.empty())
+    static ConstString g_slash_only ("/");
+    std::string path;
+    const char *dirname = m_directory.GetCString();
+    const char *filename = m_filename.GetCString();
+    if (dirname)
     {
-        llvm::SmallString<64> denormalized;
-        DeNormalize(result.c_str(), denormalized, m_syntax);
-        result = denormalized;
+        path.append (dirname);
+        if (filename && m_directory != g_slash_only)
+            path.append ("/");
     }
-
-    return std::string(result.begin(), result.end());
+    if (filename)
+        path.append (filename);
+    return path;
 }
 
 ConstString
Index: source/Host/common/Host.cpp
===================================================================
--- source/Host/common/Host.cpp
+++ source/Host/common/Host.cpp
@@ -825,16 +825,6 @@
 
 #endif
 
-FileSpec::PathSyntax
-Host::GetHostPathSyntax()
-{
-#if defined(_WIN32)
-    return FileSpec::ePathSyntaxWindows;
-#else
-    return FileSpec::ePathSyntaxPosix;
-#endif
-}
-
 FileSpec
 Host::GetUserProfileFileSpec ()
 {
@@ -891,7 +881,7 @@
 #elif defined(_WIN32)
         std::vector<char> buffer(PATH_MAX);
         ::GetModuleFileName(NULL, &buffer[0], buffer.size());
-        g_program_filespec.SetFile(&buffer[0], false);
+        g_program_filespec.SetFile(&buffer[0], false, FileSpec::ePathSyntaxWindows);
 #endif
     }
     return g_program_filespec;
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to