/*************************************************************************** begin : Tue May 13 2003 copyright : (C) 2003 by John Birch email : jbb@kdevelop.org Adapted for ruby debugging -------------------------- begin : Mon Nov 1 2004 copyright : (C) 2004 by Richard Dale email : Richard_Dale@tipitina.demon.co.uk ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "breakpoint.h" #include #include #include #include #include #include #include /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ namespace RDBDebugger { static int BPKey_ = 0; /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ Breakpoint::Breakpoint(bool temporary, bool enabled) : s_pending_(true), s_actionAdd_(true), s_actionClear_(false), s_actionModify_(false), s_actionDie_(false), s_dbgProcessing_(false), s_enabled_(enabled), s_temporary_(temporary), s_changedEnable_(false), key_(BPKey_++), active_(-1) { } /***************************************************************************/ Breakpoint::~Breakpoint() { } /***************************************************************************/ TQString Breakpoint::dbgRemoveCommand() const { // if (dbgId_>0) // return TQString("delete %1").arg(dbgId_); // gdb command - not translatable return TQString(); } /***************************************************************************/ // called when debugger ends void Breakpoint::reset() { dbgId_ = -1; s_pending_ = true; s_actionAdd_ = true; // waiting for the debugger to start s_actionClear_ = false; s_changedEnable_ = !s_enabled_; s_actionModify_ = s_changedEnable_; s_dbgProcessing_ = false; // hits_ = 0; active_ = -1; } /***************************************************************************/ void Breakpoint::setActive(int active, int id) { active_ = active; dbgId_ = id; if (s_pending_ && !(s_actionAdd_ && s_actionModify_)) { s_pending_ = false; s_actionModify_ = false; } s_actionAdd_ = false; s_actionClear_ = false; s_actionDie_ = false; s_dbgProcessing_ = false; if (!s_actionModify_) { s_changedEnable_ = false; } } /***************************************************************************/ TQString Breakpoint::statusDisplay(int activeFlag) const { TQString status=""; if (!s_enabled_) status = i18n("Disabled"); else if (s_pending_) { if (s_actionAdd_) status = i18n("Pending (add)"); if (s_actionClear_) status = i18n("Pending (clear)"); if (s_actionModify_) status = i18n("Pending (modify)"); } else if (isActive(activeFlag)) status = i18n("Active"); return status; } /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ FilePosBreakpoint::FilePosBreakpoint(const TQString &fileName, int lineNum, bool temporary, bool enabled) : Breakpoint(temporary, enabled), fileName_(fileName), lineNo_(lineNum) { } /***************************************************************************/ FilePosBreakpoint::~FilePosBreakpoint() { } /***************************************************************************/ TQString FilePosBreakpoint::dbgSetCommand() const { TQString cmdStr; if (fileName_.isEmpty()) cmdStr = TQString("break %1").arg(lineNo_); // gdb command - not translatable else { cmdStr = TQString("break %1:%2").arg(fileName_).arg(lineNo_); } if (isTemporary()) cmdStr = "t"+cmdStr; // gdb command return cmdStr; } /***************************************************************************/ bool FilePosBreakpoint::match(const Breakpoint *brkpt) const { // simple case if (this == brkpt) return true; // Type case const FilePosBreakpoint* check = dynamic_cast(brkpt); if (!check) return false; // member case return ( (fileName_ == check->fileName_) && (lineNo_ == check->lineNo_)); } /***************************************************************************/ TQString FilePosBreakpoint::location(bool compact) { if (compact) return TQFileInfo(fileName_).fileName()+":"+TQString::number(lineNo_); return fileName_+":"+TQString::number(lineNo_); } /***************************************************************************/ void FilePosBreakpoint::setLocation(const TQString& location) { TQRegExp regExp1("(.*):(\\d+)$"); regExp1.setMinimal(true); if ( regExp1.search(location, 0) >= 0 ) { TQString t = regExp1.cap(1); TQString dirPath = TQFileInfo(t).dirPath(); if ( dirPath == "." ) fileName_ = TQFileInfo(fileName_).dirPath()+"/"+regExp1.cap(1); else fileName_ = regExp1.cap(1); lineNo_ = regExp1.cap(2).toInt(); } } /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ Watchpoint::Watchpoint(const TQString& varName, bool temporary, bool enabled) : Breakpoint(temporary, enabled), varName_(varName) { } /***************************************************************************/ Watchpoint::~Watchpoint() { } /***************************************************************************/ TQString Watchpoint::dbgSetCommand() const { return TQString("watch ")+varName_; // gdb command - not translatable } /***************************************************************************/ bool Watchpoint::match(const Breakpoint* brkpt) const { // simple case if (this == brkpt) return true; // Type case const Watchpoint *watch = dynamic_cast(brkpt); if (watch == 0) return false; // member case return (varName_ == watch->varName_); } /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ Catchpoint::Catchpoint(const TQString& varName, bool temporary, bool enabled) : Breakpoint(temporary, enabled), varName_(varName) { } /***************************************************************************/ Catchpoint::~Catchpoint() { } /***************************************************************************/ TQString Catchpoint::dbgSetCommand() const { return TQString("catch ")+varName_; // gdb command - not translatable } /***************************************************************************/ bool Catchpoint::match(const Breakpoint* brkpt) const { // simple case if (this == brkpt) return true; // Type case const Catchpoint *check = dynamic_cast(brkpt); if (check == 0) return false; // member case return (varName_ == check->varName_); } /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ FunctionBreakpoint::FunctionBreakpoint(const TQString& functionName, bool temporary, bool enabled) : Breakpoint(temporary, enabled), m_functionName(functionName) { } /***************************************************************************/ FunctionBreakpoint::~FunctionBreakpoint() { } /***************************************************************************/ TQString FunctionBreakpoint::dbgSetCommand() const { return TQString("break ")+m_functionName; // gdb command - not translatable } /***************************************************************************/ bool FunctionBreakpoint::match(const Breakpoint* brkpt) const { // simple case if (this == brkpt) return true; // Type case const FunctionBreakpoint *check = dynamic_cast(brkpt); if (!check) return false; // member case return (m_functionName == check->m_functionName); } }