Hi ki.stfu, clayborg,
For some time, eclipse (CDT) uses full path of the file in break-insert command
when putting breakpoint on a source line. On windows, a typical command looks
like the following.
56-break-insert -f F:\\work\\ws\\test\\main.c:49
Current implementation in lldb-mi have problem in 2 ways. It was assuming that
there will be only one : in the path which is wrong if full path is supplied.
Also CDT sends out path with double backslashes in windows which gives error on
resolution. I am replacing \\ with / to handle this issue.
Tested on both Windows and Linux using CDT and seems to work.
http://reviews.llvm.org/D7379
Files:
MICmdCmdBreak.cpp
Index: MICmdCmdBreak.cpp
===================================================================
--- MICmdCmdBreak.cpp
+++ MICmdCmdBreak.cpp
@@ -180,19 +180,24 @@
CMIUtilString fileName;
MIuint nFileLine = 0;
CMIUtilString strFileFn;
- const MIint nPosColon = m_brkName.find(cColon);
- if (nPosColon != (MIint)std::string::npos)
+ CMIUtilString rStrLineOrFn;
+ // Full path in windows can have : after drive letter. So look for the
+ // last colon
+ const size_t nPosColon = m_brkName.find_last_of(cColon);
+ if (nPosColon != std::string::npos)
{
- CMIUtilString::VecString_t vecFileAndLocation;
- const MIuint nSplits = m_brkName.Split(cColon, vecFileAndLocation);
- MIunused(nSplits);
- if (vecFileAndLocation.size() != 2)
+ // extract file name and line number from it
+ fileName = m_brkName.substr(0, nPosColon);
+ rStrLineOrFn = m_brkName.substr(nPosColon + 1, m_brkName.size() -
nPosColon - 1);
+
+ // Replace \\ with /
+ size_t pos = 0;
+ while ((pos = fileName.find("\\\\", pos)) != std::string::npos)
{
-
SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_FORMAT),
m_cmdData.strMiCmd.c_str(), m_brkName.c_str()));
- return MIstatus::failure;
+ fileName.replace(pos, 2, "/");
+ pos += 1;
}
- fileName = vecFileAndLocation.at(0);
- const CMIUtilString &rStrLineOrFn(vecFileAndLocation.at(1));
+
if (rStrLineOrFn.empty())
eBrkPtType = eBreakPoint_ByName;
else
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: MICmdCmdBreak.cpp
===================================================================
--- MICmdCmdBreak.cpp
+++ MICmdCmdBreak.cpp
@@ -180,19 +180,24 @@
CMIUtilString fileName;
MIuint nFileLine = 0;
CMIUtilString strFileFn;
- const MIint nPosColon = m_brkName.find(cColon);
- if (nPosColon != (MIint)std::string::npos)
+ CMIUtilString rStrLineOrFn;
+ // Full path in windows can have : after drive letter. So look for the
+ // last colon
+ const size_t nPosColon = m_brkName.find_last_of(cColon);
+ if (nPosColon != std::string::npos)
{
- CMIUtilString::VecString_t vecFileAndLocation;
- const MIuint nSplits = m_brkName.Split(cColon, vecFileAndLocation);
- MIunused(nSplits);
- if (vecFileAndLocation.size() != 2)
+ // extract file name and line number from it
+ fileName = m_brkName.substr(0, nPosColon);
+ rStrLineOrFn = m_brkName.substr(nPosColon + 1, m_brkName.size() - nPosColon - 1);
+
+ // Replace \\ with /
+ size_t pos = 0;
+ while ((pos = fileName.find("\\\\", pos)) != std::string::npos)
{
- SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_FORMAT), m_cmdData.strMiCmd.c_str(), m_brkName.c_str()));
- return MIstatus::failure;
+ fileName.replace(pos, 2, "/");
+ pos += 1;
}
- fileName = vecFileAndLocation.at(0);
- const CMIUtilString &rStrLineOrFn(vecFileAndLocation.at(1));
+
if (rStrLineOrFn.empty())
eBrkPtType = eBreakPoint_ByName;
else
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits