SBFileSpec.cpp revision ec2d9787bed36e9eda6eac1996c7bed76c8d3da4
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBFileSpec.cpp ------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10ec2d9787bed36e9eda6eac1996c7bed76c8d3da4Stephen Wilson#include <limits.h>
11ec2d9787bed36e9eda6eac1996c7bed76c8d3da4Stephen Wilson
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBFileSpec.h"
1398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice#include "lldb/API/SBStream.h"
145f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
157826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::SBFileSpec () :
2363094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap()
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::SBFileSpec (const SBFileSpec &rhs) :
2863094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ap()
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3161ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice
3261ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice    if (rhs.m_opaque_ap.get())
3361ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice        m_opaque_ap.reset (new FileSpec (rhs.get()));
347826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
357826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
367826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
377826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        SBStream sstr;
3861ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice        GetDescription (sstr);
3949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        log->Printf ("SBFileSpec::SBFileSpec (const SBFileSpec rhs.ap=%p) => SBFileSpec(%p): %s",
4061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     rhs.m_opaque_ap.get(), m_opaque_ap.get(), sstr.GetData());
417826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton// Deprected!!!
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::SBFileSpec (const char *path) :
46537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    m_opaque_ap(new FileSpec (path, true))
47537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton{
48537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton}
49537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton
50537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonSBFileSpec::SBFileSpec (const char *path, bool resolve) :
51537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    m_opaque_ap(new FileSpec (path, resolve))
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
547826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
557826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
5649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        log->Printf ("SBFileSpec::SBFileSpec (path=\"%s\", resolve=%i) => SBFileSpec(%p)", path,
573f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     resolve, m_opaque_ap.get());
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::~SBFileSpec ()
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst SBFileSpec &
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::operator = (const SBFileSpec &rhs)
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (rhs.IsValid())
7063094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_opaque_ap.reset (new lldb_private::FileSpec(*rhs.m_opaque_ap.get()));
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::IsValid() const
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7863094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ap.get() != NULL;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::Exists () const
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
857826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
867826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    bool result = false;
8763094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
887826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        result = m_opaque_ap->Exists();
897826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
907826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
913f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton        log->Printf ("SBFileSpec(%p)::Exists () => %s", m_opaque_ap.get(), (result ? "true" : "false"));
927826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
937826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return result;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96eddffe93d2c9ebb575e7b03fe1c5e71f9ecaf9f1Caroline Ticebool
97eddffe93d2c9ebb575e7b03fe1c5e71f9ecaf9f1Caroline TiceSBFileSpec::ResolveExecutableLocation ()
98eddffe93d2c9ebb575e7b03fe1c5e71f9ecaf9f1Caroline Tice{
99eddffe93d2c9ebb575e7b03fe1c5e71f9ecaf9f1Caroline Tice    if (m_opaque_ap.get())
100eddffe93d2c9ebb575e7b03fe1c5e71f9ecaf9f1Caroline Tice        return m_opaque_ap->ResolveExecutableLocation ();
101eddffe93d2c9ebb575e7b03fe1c5e71f9ecaf9f1Caroline Tice    return false;
102eddffe93d2c9ebb575e7b03fe1c5e71f9ecaf9f1Caroline Tice}
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return lldb_private::FileSpec::Resolve (src_path, dst_path, dst_len);
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
1114ead2e9a5a74f465d00b0301c165fbebf4ee4ff3Johnny ChenSBFileSpec::GetFilename() const
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
113a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    const char *s = NULL;
11463094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
115a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        s = m_opaque_ap->GetFilename().AsCString();
1167826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
117e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1187826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
11949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
12049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (s)
12149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBFileSpec(%p)::GetFilename () => \"%s\"", m_opaque_ap.get(), s);
12249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
12349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBFileSpec(%p)::GetFilename () => NULL", m_opaque_ap.get());
12449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
1257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
126a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    return s;
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::GetDirectory() const
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
132a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    const char *s = NULL;
13363094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
134a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        s = m_opaque_ap->GetDirectory().AsCString();
135e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
136a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
13749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
13849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (s)
13949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBFileSpec(%p)::GetDirectory () => \"%s\"", m_opaque_ap.get(), s);
14049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
14149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBFileSpec(%p)::GetDirectory () => NULL", m_opaque_ap.get());
14249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
143a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    return s;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::GetPath (char *dst_path, size_t dst_len) const
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
149e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1507826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
15149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    uint32_t result = 0;
15263094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
1537826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        result = m_opaque_ap->GetPath (dst_path, dst_len);
1547826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
1557826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
15649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        log->Printf ("SBFileSpec(%p)::GetPath (dst_path=\"%.*s\", dst_len=%zu) => %u",
15749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                     m_opaque_ap.get(), result, dst_path, dst_len, result);
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (result == 0 && dst_path && dst_len > 0)
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *dst_path = '\0';
16149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return result;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::FileSpec *
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::operator->() const
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16863094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ap.get();
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::FileSpec *
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::get() const
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17463094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ap.get();
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::FileSpec &
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::operator*() const
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18163094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_ap.get();
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb_private::FileSpec &
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::ref() const
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18763094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_ap.get();
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFileSpec::SetFileSpec (const lldb_private::FileSpec& fs)
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19463094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ap.get())
19563094e0bb161580564954dee512955c1c79d3476Greg Clayton        *m_opaque_ap = fs;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
19763094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ap.reset (new FileSpec (fs));
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20098f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool
2017826c8894803dc729f29789ebc038956a94d3e7aCaroline TiceSBFileSpec::GetDescription (SBStream &description) const
2027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
2037826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (m_opaque_ap.get())
2047826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
20549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        char path[PATH_MAX];
20649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (m_opaque_ap->GetPath(path, sizeof(path)))
20749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            description.Printf ("%s", path);
2087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
2097826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    else
2107826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        description.Printf ("No value");
2117826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2127826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return true;
2137826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
214