From 1501a1542c861baa2fcf70d96bd01001bec35865 Mon Sep 17 00:00:00 2001 From: IChooseYou Date: Sat, 14 Mar 2026 11:57:32 -0600 Subject: [PATCH] feat: symbol double-click navigation, tree icons, and module.dll address parsing - Double-click symbol in Symbols tab navigates to moduleBase + RVA - Add symbol-method.svg icon for function symbols, symbol-structure.svg for modules - Force-populate all modules on search so filter works without expanding first - Parse module.dll/exe/sys as identifiers in address bar (e.g. client.dll + 0xFF) --- src/addressparser.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/addressparser.cpp b/src/addressparser.cpp index 7b3902e..0f57c0e 100644 --- a/src/addressparser.cpp +++ b/src/addressparser.cpp @@ -31,6 +31,7 @@ namespace rcx { // // All numeric literals are hexadecimal (base 16). // Identifiers: [a-zA-Z_][a-zA-Z0-9_]* containing at least one non-hex char. +// Module names with extensions (e.g. "client.dll") are scanned as one token. // Pure hex-digit words (e.g. "DEAD") are treated as hex literals. class ExpressionParser { @@ -285,6 +286,20 @@ private: hasNonHex = true; advance(); } + // Handle module.dll / module.exe / module.sys extensions + // e.g. "client.dll + 0xFF" should parse "client.dll" as one token + if (!atEnd() && peek() == '.' && m_pos > start) { + int dotPos = m_pos; + advance(); // skip '.' + int extStart = m_pos; + while (!atEnd() && isIdentChar(peek())) + advance(); + if (m_pos > extStart) { + hasNonHex = true; // '.' makes it definitively an identifier + } else { + m_pos = dotPos; // backtrack — '.' at end isn't an extension + } + } // If we hit '!' and the next char is an identifier start, extend the token // to include the second part (WinDbg module!symbol syntax) if (!atEnd() && peek() == '!' && m_pos > start) {