return;
std::replace(path.begin(), path.end(), '\\', '/');
+ // Windows path can have \\ slashes which can be changed by replace
+ // call above to //. Here we remove the duplicate.
+ auto iter = std::unique ( path.begin(), path.end(),
+ []( char &c1, char &c2 ){
+ return (c1 == '/' && c2 == '/');});
+ path.erase(iter, path.end());
}
void FileSpec::DeNormalize(llvm::SmallVectorImpl<char> &path, PathSyntax syntax)
break_results = lldbutil.run_break_set_command (self, "b %s:%d" % (self.source, self.line))
lldbutil.check_breakpoint_result (self, break_results, file_name='main.c', line_number=self.line, num_locations=1)
+ # Check breakpoint with full file path.
+ full_path = os.path.join(os.getcwd(), self.source)
+ break_results = lldbutil.run_break_set_command (self, "b %s:%d" % (full_path, self.line))
+ lldbutil.check_breakpoint_result (self, break_results, file_name='main.c', line_number=self.line, num_locations=1)
+
self.runCmd("run", RUN_SUCCEEDED)
# The stop reason of the thread should be breakpoint.
f = lldb.SBHostOS.GetLLDBPath(path_type);
# No directory path types should have the filename set
self.assertTrue (f.GetFilename() == None);
-
+
+ @unittest2.skipUnless(sys.platform.startswith("win32"), "Test for windows only")
+ def test_windows_double_slash (self):
+ '''Test to check the path with double slash is handled correctly '''
+ # Create a path and see if lldb gets the directory and file right
+ fspec = lldb.SBFileSpec("C:\\dummy1\\dummy2//unknown_file", True);
+ self.assertTrue (fspec.GetDirectory() == "C:/dummy1/dummy2");
+ self.assertTrue (fspec.GetFilename() == "unknown_file");
if __name__ == '__main__':
import atexit
self.runCmd("-break-insert main.c:%d" % line)
self.expect("\^done,bkpt={number=\"3\"")
+ # Check with full path. TODO, figure out why this commands fails
+ # if -f is not given
+ line = line_number('main.c', '// BP_doloop')
+ full_path = os.path.join(os.getcwd(), "main.c")
+ self.runCmd("-break-insert -f %s:%d" % (full_path, line))
+ self.expect("\^done,bkpt={number=\"4\"")
+
+ self.runCmd("-exec-continue")
+ self.expect("\^running")
+ self.expect("\*stopped,reason=\"breakpoint-hit\"")
+
self.runCmd("-exec-continue")
self.expect("\^running")
self.expect("\*stopped,reason=\"breakpoint-hit\"")
a = a_MyFunction(); //BP_a_MyFunction_call
b = b_MyFunction(); //BP_b_MyFunction_call
//BP_localstest -- it must be at line #24 (or fix it in main*.micmds)
- if (doloop)
+ if (doloop) // BP_doloop
infloop();
if (argc > 1 && *argv[1] == 'l') {
a++;
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)
- {
- SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_FORMAT), m_cmdData.strMiCmd.c_str(), m_brkName.c_str()));
- return MIstatus::failure;
- }
- fileName = vecFileAndLocation.at(0);
- const CMIUtilString &rStrLineOrFn(vecFileAndLocation.at(1));
+ // 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);
+
if (rStrLineOrFn.empty())
eBrkPtType = eBreakPoint_ByName;
else