From e2b11e937f0e2167cbf40236c7d58f2269eed66c Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Mon, 2 Mar 2026 12:50:34 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/cmdhw.c | 2 +- client/src/ui.c | 62 ++++++++++++++++++++++++---------------------- include/ansi.h | 2 ++ 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/client/src/cmdhw.c b/client/src/cmdhw.c index 19490bbc9..553f63fb8 100644 --- a/client/src/cmdhw.c +++ b/client/src/cmdhw.c @@ -1759,7 +1759,7 @@ int CmdHW(const char *Cmd) { void pm3_version_short(void) { // PrintAndLogEx(NORMAL, " [ " _CYAN_("Proxmark3 RFID instrument") " ]"); - PrintAndLogEx(NORMAL, " [ " _CYAN_("Proxmark3") " ]"); + PrintAndLogEx(NORMAL, " [ " _CYAN_(_URL_("https://github.com/RfidResearchGroup/proxmark3", "Proxmark3")) " ]"); PrintAndLogEx(NORMAL, ""); if (g_session.pm3_present) { diff --git a/client/src/ui.c b/client/src/ui.c index 1901ac9ef..c08f6808e 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -527,40 +527,42 @@ void memcpy_filter_rlmarkers(void *dest, const void *src, size_t n) { } void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) { - if (filter) { - // Filter out ANSI sequences on these OS - uint8_t *rdest = (uint8_t *)dest; - uint8_t *rsrc = (uint8_t *)src; - uint16_t si = 0; - for (size_t i = 0; i < n; i++) { - if ((i < n - 1) - && (rsrc[i] == '\x1b') - && (rsrc[i + 1] >= 0x40) - && (rsrc[i + 1] <= 0x5F)) { // entering ANSI sequence - - i++; - if ((i < n - 1) && (rsrc[i] == '[')) { // entering CSI sequence - i++; - - while ((i < n - 1) && (rsrc[i] >= 0x30) && (rsrc[i] <= 0x3F)) { // parameter bytes - i++; - } - - while ((i < n - 1) && (rsrc[i] >= 0x20) && (rsrc[i] <= 0x2F)) { // intermediate bytes - i++; - } - - if ((rsrc[i] >= 0x40) && (rsrc[i] <= 0x7F)) { // final byte - continue; - } - } else { + if (!filter) { + memcpy(dest, src, n); + return; + } + uint8_t *rdest = (uint8_t *)dest; + const uint8_t *rsrc = (const uint8_t *)src; + size_t si = 0; + for (size_t i = 0; i < n; i++) { + if (rsrc[i] == '\x1b' && i < n - 1) { + /* ----- CSI sequence ----- */ + if (rsrc[i + 1] == '[') { + i += 2; + while (i < n && rsrc[i] >= 0x30 && rsrc[i] <= 0x3F) i++; + while (i < n && rsrc[i] >= 0x20 && rsrc[i] <= 0x2F) i++; + if (i < n && rsrc[i] >= 0x40 && rsrc[i] <= 0x7F) { continue; } } - rdest[si++] = rsrc[i]; + + /* ----- OSC sequence (used for hyperlinks) ----- */ + else if (rsrc[i + 1] == ']') { + i += 2; + /* OSC terminates with BEL or ESC \ */ + while (i < n) { + if (rsrc[i] == '\x07') // BEL + break; + if (rsrc[i] == '\x1b' && i + 1 < n && rsrc[i + 1] == '\\') { + i++; // consume '\' + break; + } + i++; + } + continue; + } } - } else { - memcpy(dest, src, n); + rdest[si++] = rsrc[i]; } } diff --git a/include/ansi.h b/include/ansi.h index b791741f5..af28520fe 100644 --- a/include/ansi.h +++ b/include/ansi.h @@ -79,4 +79,6 @@ #define _RL_BOLD_RED_(s) RL_ESC("\x1b[1;31m") s RL_ESC(AEND) #define _RL_BOLD_GREEN_(s) RL_ESC("\x1b[1;32m") s RL_ESC(AEND) +#define _URL_(url, text) "\x1b]8;;" url "\x1b\\" text "\x1b]8;;\x1b\\" + #endif