1
1
#ifndef CPP_LOGTRACER_H
2
2
#define CPP_LOGTRACER_H
3
3
4
- #include < regex>
5
4
#include < stdarg.h>
6
5
#include " Tracer.h"
7
6
@@ -22,46 +21,51 @@ class LogTracer : public Tracer {
22
21
command (" println" , {message});
23
22
}
24
23
25
- void printf (const string format, ...) {
24
+ void printf (const char * format, ...) {
26
25
arguments traceArgs = {format};
27
26
28
27
va_list args;
29
28
va_start (args, format);
30
- string::const_iterator searchStart (format.cbegin ());
31
- const std::regex exp (
32
- R"RAW( (?:[^\x25]|^)(?:\x25{2})*\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX]))RAW" );
33
- std::smatch match;
34
- while (std::regex_search (searchStart, format.cend (), match, exp )) {
35
- char specifier = match.str (8 ).at (0 );
36
- switch (specifier) {
37
- case ' b' :
38
- case ' c' :
39
- case ' d' :
40
- case ' i' :
41
- case ' u' :
42
- case ' o' :
43
- case ' t' :
44
- case ' x' :
45
- case ' X' :
46
- traceArgs.push_back (va_arg (args, int ));
47
- break ;
48
- case ' e' :
49
- case ' f' :
50
- case ' g' :
51
- traceArgs.push_back (va_arg (args, double ));
52
- break ;
53
- case ' s' :
54
- traceArgs.push_back (va_arg (args, char *));
55
- break ;
56
- case ' T' :
57
- case ' v' :
58
- case ' j' :
59
- throw std::invalid_argument (" Format Not Supported" );
60
- default :
61
- break ;
29
+
30
+ bool percent = false ;
31
+ while (*format != ' \0 ' ) {
32
+ if (*format == ' %' ) {
33
+ percent = !percent;
34
+ } else if (percent) {
35
+ switch (*format) {
36
+ case ' b' :
37
+ case ' c' :
38
+ case ' d' :
39
+ case ' i' :
40
+ case ' u' :
41
+ case ' o' :
42
+ case ' t' :
43
+ case ' x' :
44
+ case ' X' :
45
+ percent = false ;
46
+ traceArgs.push_back (va_arg (args, int ));
47
+ break ;
48
+ case ' e' :
49
+ case ' f' :
50
+ case ' g' :
51
+ percent = false ;
52
+ traceArgs.push_back (va_arg (args, double ));
53
+ break ;
54
+ case ' s' :
55
+ percent = false ;
56
+ traceArgs.push_back (va_arg (args, char *));
57
+ break ;
58
+ case ' T' :
59
+ case ' v' :
60
+ case ' j' :
61
+ throw std::invalid_argument (" Format Not Supported" );
62
+ default :
63
+ break ;
64
+ }
62
65
}
63
- searchStart = match. suffix (). first ;
66
+ format++ ;
64
67
}
68
+
65
69
va_end (args);
66
70
67
71
command (" printf" , traceArgs);
0 commit comments