]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/ui.c
Fixed buffer corruption in iso1443a_select_card, affecting several operations, e...
[proxmark3-svn] / client / ui.c
index 99c9f17007240191a7da4f14fd6b6464385a096c..09479620a0afaefb1dd99b8cffe70204994fe38d 100644 (file)
@@ -1,22 +1,32 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2009 Michael Gernoth <michael at gernoth.net>
+// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
+//
+// This code is licensed to you under the terms of the GNU GPL, version 2 or,
+// at your option, any later version. See the LICENSE.txt file for the text of
+// the license.
+//-----------------------------------------------------------------------------
+// UI utilities
+//-----------------------------------------------------------------------------
+
 #include <stdarg.h>
+#include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
+#include <readline/readline.h>
 
 #include "ui.h"
 
 double CursorScaleFactor;
-int PlotGridX, PlotGridY;
+int PlotGridX, PlotGridY, PlotGridXdefault= 64, PlotGridYdefault= 64;
 int offline;
 
 static char *logfilename = "proxmark3.log";
 
-// FIXME: ifndef not really nice...
-// We should eventually get rid of it once
-// we fully factorize the code between *nix and windows
-// (using pthread and alikes...)
-#ifndef WIN32
 void PrintAndLog(char *fmt, ...)
 {
+       char *saved_line;
+       int saved_point;
   va_list argptr, argptr2;
   static FILE *logfile = NULL;
   static int logging=1;
@@ -28,12 +38,32 @@ void PrintAndLog(char *fmt, ...)
       logging=0;
     }
   }
+       
+       int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0;
 
+       if (need_hack) {
+               saved_point = rl_point;
+               saved_line = rl_copy_text(0, rl_end);
+               rl_save_prompt();
+               rl_replace_line("", 0);
+               rl_redisplay();
+       }
+       
   va_start(argptr, fmt);
   va_copy(argptr2, argptr);
   vprintf(fmt, argptr);
+  printf("          "); // cleaning prompt
   va_end(argptr);
   printf("\n");
+
+       if (need_hack) {
+               rl_restore_prompt();
+               rl_replace_line(saved_line, 0);
+               rl_point = saved_point;
+               rl_redisplay();
+               free(saved_line);
+       }
+       
   if (logging && logfile) {
     vfprintf(logfile, fmt, argptr2);
     fprintf(logfile,"\n");
@@ -41,7 +71,6 @@ void PrintAndLog(char *fmt, ...)
   }
   va_end(argptr2);
 }
-#endif
 
 void SetLogFilename(char *fn)
 {
Impressum, Datenschutz