|
@@ -15,6 +15,7 @@ using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text;
|
|
|
|
+using System.Text.RegularExpressions;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms;
|
|
|
|
|
|
namespace MainNs
|
|
namespace MainNs
|
|
@@ -400,6 +401,7 @@ namespace MainNs
|
|
{
|
|
{
|
|
this.DisassemblyTextBox.Font = this.CodeBox.Font;
|
|
this.DisassemblyTextBox.Font = this.CodeBox.Font;
|
|
this.ASTDumpBox.Font = this.CodeBox.Font;
|
|
this.ASTDumpBox.Font = this.CodeBox.Font;
|
|
|
|
+ SelectionHighlightData.ClearAnyFromRtb(this.CodeBox);
|
|
|
|
|
|
var library = this.Library;
|
|
var library = this.Library;
|
|
|
|
|
|
@@ -1073,6 +1075,65 @@ namespace MainNs
|
|
font.BackColor = ColorToCOLORREF(color);
|
|
font.BackColor = ColorToCOLORREF(color);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void HandleDebugMetadata(string dbgLine)
|
|
|
|
+ {
|
|
|
|
+ Regex lineRE = new Regex(@"line: (\d+)");
|
|
|
|
+ Match lineMatch = lineRE.Match(dbgLine);
|
|
|
|
+ if (!lineMatch.Success)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int lineVal = Int32.Parse(lineMatch.Groups[1].Value) - 1;
|
|
|
|
+ int targetStart = this.CodeBox.GetFirstCharIndexFromLine(lineVal);
|
|
|
|
+ int targetEnd = this.CodeBox.GetFirstCharIndexFromLine(lineVal + 1);
|
|
|
|
+ var highlights = SelectionHighlightData.FromRtb(CodeBox);
|
|
|
|
+ highlights.ClearFromRtb(CodeBox);
|
|
|
|
+ highlights.Add(targetStart, targetEnd - targetStart);
|
|
|
|
+ highlights.ApplyToRtb(CodeBox, Color.Yellow);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void HandleDebugTokenOnDisassemblyLine(RichTextBox rtb)
|
|
|
|
+ {
|
|
|
|
+ // Get the line.
|
|
|
|
+ string[] lines = rtb.Lines;
|
|
|
|
+ string line = lines[rtb.GetLineFromCharIndex(rtb.SelectionStart)];
|
|
|
|
+ Regex re = new Regex(@"!dbg !(\d+)");
|
|
|
|
+ Match m = re.Match(line);
|
|
|
|
+ if (!m.Success)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ string val = m.Groups[1].Value;
|
|
|
|
+ int dbgMetadata = Int32.Parse(val);
|
|
|
|
+ for (int dbgLineIndex = lines.Length - 1; dbgLineIndex >= 0;)
|
|
|
|
+ {
|
|
|
|
+ string dbgLine = lines[dbgLineIndex];
|
|
|
|
+ if (dbgLine.StartsWith("!"))
|
|
|
|
+ {
|
|
|
|
+ int dbgIdx = Int32.Parse(dbgLine.Substring(1, dbgLine.IndexOf(' ') - 1));
|
|
|
|
+ if (dbgIdx == dbgMetadata)
|
|
|
|
+ {
|
|
|
|
+ HandleDebugMetadata(dbgLine);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ else if (dbgIdx < dbgMetadata)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dbgLineIndex -= (dbgIdx - dbgMetadata);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ --dbgLineIndex;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private void DisassemblyTextBox_SelectionChanged(object sender, EventArgs e)
|
|
private void DisassemblyTextBox_SelectionChanged(object sender, EventArgs e)
|
|
{
|
|
{
|
|
// We use [) ranges for selection
|
|
// We use [) ranges for selection
|
|
@@ -1081,10 +1142,17 @@ namespace MainNs
|
|
SelectionExpandResult expand = SelectionExpandResult.Expand(rtb);
|
|
SelectionExpandResult expand = SelectionExpandResult.Expand(rtb);
|
|
if (expand.IsEmpty)
|
|
if (expand.IsEmpty)
|
|
return;
|
|
return;
|
|
- if (data.SelectedToken == expand.Token)
|
|
|
|
|
|
+
|
|
|
|
+ string token = expand.Token;
|
|
|
|
+
|
|
|
|
+ if (token == "dbg")
|
|
|
|
+ {
|
|
|
|
+ HandleDebugTokenOnDisassemblyLine(rtb);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (data.SelectedToken == token)
|
|
return;
|
|
return;
|
|
string text = expand.Text;
|
|
string text = expand.Text;
|
|
- string token = expand.Token;
|
|
|
|
|
|
|
|
// OK, time to do work.
|
|
// OK, time to do work.
|
|
using (new RichTextBoxEditAction(rtb))
|
|
using (new RichTextBoxEditAction(rtb))
|
|
@@ -1287,6 +1355,7 @@ namespace MainNs
|
|
});
|
|
});
|
|
rtb.SelectionChanged += DisassemblyTextBox_SelectionChanged;
|
|
rtb.SelectionChanged += DisassemblyTextBox_SelectionChanged;
|
|
form.Controls.Add(rtb);
|
|
form.Controls.Add(rtb);
|
|
|
|
+ form.StartPosition = FormStartPosition.CenterParent;
|
|
form.Show(this);
|
|
form.Show(this);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1636,6 +1705,13 @@ namespace MainNs
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public static void ClearAnyFromRtb(RichTextBox rtb)
|
|
|
|
+ {
|
|
|
|
+ SelectionHighlightData data = (SelectionHighlightData)rtb.Tag;
|
|
|
|
+ if (data != null)
|
|
|
|
+ data.ClearFromRtb(rtb);
|
|
|
|
+ }
|
|
|
|
+
|
|
public void Add(int start, int length)
|
|
public void Add(int start, int length)
|
|
{
|
|
{
|
|
this.StartLengthHighlights.Add(new Tuple<int, int>(start, length));
|
|
this.StartLengthHighlights.Add(new Tuple<int, int>(start, length));
|
|
@@ -1809,6 +1885,7 @@ namespace MainNs
|
|
form.Controls.Add(container);
|
|
form.Controls.Add(container);
|
|
form.Controls.Add(statusBar);
|
|
form.Controls.Add(statusBar);
|
|
binaryView.Bytes = bytes;
|
|
binaryView.Bytes = bytes;
|
|
|
|
+ form.StartPosition = FormStartPosition.CenterParent;
|
|
form.Show(this);
|
|
form.Show(this);
|
|
}
|
|
}
|
|
|
|
|