disassemblewidget.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "disassemblewidget.h"
00017
00018 #include <kdebug.h>
00019 #include <kdeversion.h>
00020 #if KDE_VERSION > 305
00021 # include <ktextedit.h>
00022 #endif
00023 #include <kglobalsettings.h>
00024
00025 #include <qdict.h>
00026 #include <qheader.h>
00027 #include <qtextedit.h>
00028
00029 #include <stdlib.h>
00030
00031 namespace GDBDebugger
00032 {
00033
00034
00035
00036
00037
00038 DisassembleWidget::DisassembleWidget(QWidget *parent, const char *name)
00039 : QTextEdit(parent, name),
00040 active_(false),
00041 lower_(0),
00042 upper_(0),
00043 address_(0)
00044 {
00045 setFont(KGlobalSettings::fixedFont());
00046 setReadOnly(true);
00047 }
00048
00049
00050
00051 DisassembleWidget::~DisassembleWidget()
00052 {}
00053
00054
00055
00056 bool DisassembleWidget::displayCurrent()
00057 {
00058 Q_ASSERT(address_ >= lower_ || address_ <= upper_);
00059
00060 int line;
00061 for (line=0; line < paragraphs(); line++)
00062 {
00063 int address = strtol(text(line).latin1(), 0, 0);
00064 if (address == address_)
00065 {
00066
00067 setCursorPosition(line, 0);
00068 setSelection(line,0,line+1,0,0);
00069 return true;
00070 }
00071 }
00072
00073 return false;
00074 }
00075
00076
00077
00078 void DisassembleWidget::slotBPState(const Breakpoint&)
00079 {
00080 if (!active_)
00081 return;
00082 }
00083
00084
00085
00086 void DisassembleWidget::slotDisassemble(char *buf)
00087 {
00088 if (!active_)
00089 return;
00090
00091 clear();
00092
00093 char *start = strchr(buf, '\n');
00094
00095
00096 if (start)
00097 {
00098 append(start+1);
00099
00100 removeParagraph(paragraphs()-1);
00101 removeParagraph(paragraphs()-1);
00102
00103 if (paragraphs())
00104 {
00105 lower_ = strtol(text(0).latin1(), 0, 0);
00106 upper_ = strtol(text(paragraphs()-1).latin1(), 0, 0);
00107 displayCurrent();
00108 }
00109 else
00110 {
00111 lower_ = 0;
00112 upper_ = 0;
00113 }
00114 }
00115 }
00116
00117
00118
00119 void DisassembleWidget::slotActivate(bool activate)
00120 {
00121 kdDebug(9012) << "Disassemble widget active: " << activate << endl;
00122
00123 if (active_ != activate)
00124 {
00125 active_ = activate;
00126 if (active_ && address_)
00127 {
00128 if (address_ < lower_ || address_ > upper_ || !displayCurrent())
00129 getNextDisplay();
00130 }
00131 }
00132 }
00133
00134
00135
00136 void DisassembleWidget::slotShowStepInSource( const QString &, int,
00137 const QString ¤tAddress)
00138 {
00139 kdDebug(9012) << "DisasssembleWidget::slotShowStepInSource()" << endl;
00140
00141 currentAddress_ = currentAddress;
00142 address_ = strtol(currentAddress.latin1(), 0, 0);
00143 if (!active_)
00144 return;
00145
00146 if (address_ < lower_ || address_ > upper_ || !displayCurrent())
00147 getNextDisplay();
00148 }
00149
00150
00151
00152 void DisassembleWidget::getNextDisplay()
00153 {
00154 kdDebug(9012) << "DisasssembleWidget::getNextDisplay()" << endl;
00155
00156 if (address_)
00157 {
00158 Q_ASSERT(!currentAddress_.isNull());
00159
00160
00161 QString endAddress;
00162 endAddress.sprintf("0x%x", (uint)address_+128);
00163 emit disassemble(currentAddress_, endAddress);
00164 }
00165 else
00166 emit disassemble("", "");
00167 }
00168
00169
00170 void DisassembleWidget::showEvent(QShowEvent*)
00171 {
00172 slotActivate(true);
00173 }
00174
00175
00176 void DisassembleWidget::hideEvent(QHideEvent*)
00177 {
00178 slotActivate(false);
00179 }
00180
00181
00182
00183 }
00184
00185 #include "disassemblewidget.moc"
This file is part of the documentation for KDevelop Version 3.1.2.