]> git.zerfleddert.de Git - proxmark3-svn/blob - client/ui.c
Merge pull request #969 from pwpiwi/gcc10_fixes
[proxmark3-svn] / client / ui.c
1 //-----------------------------------------------------------------------------
2 // Copyright (C) 2009 Michael Gernoth <michael at gernoth.net>
3 // Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
4 //
5 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
6 // at your option, any later version. See the LICENSE.txt file for the text of
7 // the license.
8 //-----------------------------------------------------------------------------
9 // UI utilities
10 //-----------------------------------------------------------------------------
11
12 #include <stdbool.h>
13 #ifndef EXTERNAL_PRINTANDLOG
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include <stdarg.h>
18 #include <readline/readline.h>
19 #include <pthread.h>
20 #include "util.h"
21 #endif
22
23 #include "ui.h"
24
25 double CursorScaleFactor = 1;
26 int PlotGridX=0, PlotGridY=0, PlotGridXdefault= 64, PlotGridYdefault= 64, CursorCPos= 0, CursorDPos= 0;
27 bool flushAfterWrite = false; //buzzy
28 int GridOffset = 0;
29 bool GridLocked = false;
30 bool showDemod = true;
31
32 static char *logfilename = "proxmark3.log";
33
34 #ifndef EXTERNAL_PRINTANDLOG
35 static pthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;
36
37 void PrintAndLogEx(logLevel_t level, char *fmt, ...) {
38
39 // skip debug messages if client debugging is turned off i.e. 'DATA SETDEBUG 0'
40 // if (g_debugMode == 0 && level == DEBUG)
41 // return;
42
43 char buffer[MAX_PRINT_BUFFER] = {0};
44 char buffer2[MAX_PRINT_BUFFER] = {0};
45 char prefix[20] = {0};
46 char *token = NULL;
47 int size = 0;
48 // {NORMAL, SUCCESS, INFO, FAILED, WARNING, ERR, DEBUG}
49 static char *prefixes[7] = { "", "", "INFO: ", "FAILED: ", "WARNING: ", "ERROR: ", "#: "};
50
51 switch( level ) {
52 case FAILED:
53 strncpy(prefix,_RED_(FAILED: ), sizeof(prefix)-1);
54 break;
55 case DEBUG:
56 strncpy(prefix,_BLUE_(#: ), sizeof(prefix)-1);
57 break;
58 case SUCCESS:
59 strncpy(prefix,_GREEN_( ), sizeof(prefix)-1);
60 break;
61 case WARNING:
62 strncpy(prefix,_CYAN_(WARNING: ), sizeof(prefix)-1);
63 break;
64 default:
65 strncpy(prefix, prefixes[level], sizeof(prefix)-1);
66 break;
67 }
68
69 va_list args;
70 va_start(args, fmt);
71 vsnprintf(buffer, sizeof(buffer), fmt, args);
72 va_end(args);
73
74 // no prefixes for normal
75 if ( level == NORMAL ) {
76 PrintAndLog(buffer);
77 return;
78 }
79
80 if (strchr(buffer, '\n')) {
81
82 const char delim[2] = "\n";
83
84 // line starts with newline
85 if (buffer[0] == '\n')
86 PrintAndLog("");
87
88 token = strtok(buffer, delim);
89
90 while (token != NULL) {
91
92 size = strlen(buffer2);
93
94 if (strlen(token))
95 snprintf(buffer2+size, sizeof(buffer2)-size, "%s%s\n", prefix, token);
96 else
97 snprintf(buffer2+size, sizeof(buffer2)-size, "\n");
98
99 token = strtok(NULL, delim);
100 }
101 PrintAndLog(buffer2);
102 } else {
103 snprintf(buffer2, sizeof(buffer2), "%s%.*s", prefix, MAX_PRINT_BUFFER - 20, buffer);
104 PrintAndLog(buffer2);
105 }
106 }
107
108 void PrintAndLog(char *fmt, ...)
109 {
110 char *saved_line;
111 int saved_point;
112 va_list argptr, argptr2;
113 static FILE *logfile = NULL;
114 static int logging=1;
115
116 // lock this section to avoid interlacing prints from different threads
117 pthread_mutex_lock(&print_lock);
118
119 if (logging && !logfile) {
120 logfile=fopen(logfilename, "a");
121 if (!logfile) {
122 fprintf(stderr, "Can't open logfile, logging disabled!\n");
123 logging=0;
124 }
125 }
126
127 // If there is an incoming message from the hardware (eg: lf hid read) in
128 // the background (while the prompt is displayed and accepting user input),
129 // stash the prompt and bring it back later.
130 #ifdef RL_STATE_READCMD
131 // We are using GNU readline. libedit (OSX) doesn't support this flag.
132 int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0;
133
134 if (need_hack) {
135 saved_point = rl_point;
136 saved_line = rl_copy_text(0, rl_end);
137 rl_save_prompt();
138 rl_replace_line("", 0);
139 rl_redisplay();
140 }
141 #endif
142
143 va_start(argptr, fmt);
144 va_copy(argptr2, argptr);
145 vprintf(fmt, argptr);
146 printf(" "); // cleaning prompt
147 va_end(argptr);
148 printf("\n");
149
150 #ifdef RL_STATE_READCMD
151 // We are using GNU readline. libedit (OSX) doesn't support this flag.
152 if (need_hack) {
153 rl_restore_prompt();
154 rl_replace_line(saved_line, 0);
155 rl_point = saved_point;
156 rl_redisplay();
157 free(saved_line);
158 }
159 #endif
160
161 if (logging && logfile) {
162 vfprintf(logfile, fmt, argptr2);
163 fprintf(logfile,"\n");
164 fflush(logfile);
165 }
166 va_end(argptr2);
167
168 if (flushAfterWrite) //buzzy
169 {
170 fflush(NULL);
171 }
172 //release lock
173 pthread_mutex_unlock(&print_lock);
174 }
175 #endif
176
177 void SetLogFilename(char *fn)
178 {
179 logfilename = fn;
180 }
181
182 void SetFlushAfterWrite(bool flush_after_write) {
183 flushAfterWrite = flush_after_write;
184 }
185
Impressum, Datenschutz