From 4c666e3832aad5d6b6dbeb0a1d72cd99715a604f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 17 Mar 2018 14:35:34 +0100 Subject: [PATCH] add: OSX readline fixes ( @micolous ) https://github.com/Proxmark/proxmark3/pull/585/commits/07632393630729d2e3bd0a3d36cdb401b934d88a --- client/proxmark3.c | 3 +++ client/ui.c | 27 ++++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/client/proxmark3.c b/client/proxmark3.c index 551262afa..5cc181e06 100644 --- a/client/proxmark3.c +++ b/client/proxmark3.c @@ -378,6 +378,9 @@ int main(int argc, char* argv[]) { bool addLuaExec = false; char *script_cmds_file = NULL; char *script_cmd = NULL; + + // Must be before the first PrintAndLog call, for rl_redisplay + rl_initialize(); if (argc < 2) { show_help(true, argv[0]); diff --git a/client/ui.c b/client/ui.c index 68fedeeca..6c99c0cba 100644 --- a/client/ui.c +++ b/client/ui.c @@ -81,16 +81,17 @@ void PrintAndLogEx(logLevel_t level, char *fmt, ...) { vsnprintf(buffer, sizeof(buffer), fmt, args); va_end(args); - if(strchr(buffer, '\n')) - { + if(strchr(buffer, '\n')) { + token = strtok(buffer,"\n"); - while (token != NULL) - { - size=strlen(buffer2); - if(strlen(token)) + + while (token != NULL) { + size = strlen(buffer2); + if (strlen(token)) snprintf(buffer2+size, sizeof(buffer2)-size, "%s%s\n", prefix, token); else snprintf(buffer2+size, sizeof(buffer2)-size, "\n"); + token = strtok(NULL, "\n"); } PrintAndLog(buffer2); @@ -116,9 +117,13 @@ void PrintAndLog(char *fmt, ...) { logging=0; } } - + + +// If there is an incoming message from the hardware (eg: lf hid read) in +// the background (while the prompt is displayed and accepting user input), +// stash the prompt and bring it back later. #ifdef RL_STATE_READCMD - // We are using GNU readline. + // We are using GNU readline. libedit (OSX) doesn't support this flag. int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0; if (need_hack) { @@ -128,9 +133,6 @@ void PrintAndLog(char *fmt, ...) { rl_replace_line("", 0); rl_redisplay(); } -#else - // We are using libedit (OSX), which doesn't support this flag. - int need_hack = 0; #endif va_start(argptr, fmt); @@ -140,6 +142,8 @@ void PrintAndLog(char *fmt, ...) { va_end(argptr); printf("\n"); +#ifdef RL_STATE_READCMD + // We are using GNU readline. libedit (OSX) doesn't support this flag. if (need_hack) { rl_restore_prompt(); rl_replace_line(saved_line, 0); @@ -147,6 +151,7 @@ void PrintAndLog(char *fmt, ...) { rl_redisplay(); free(saved_line); } +#endif if (logging && logfile) { vfprintf(logfile, fmt, argptr2);