11#ifndef CPP_LOGTRACER_H
22#define CPP_LOGTRACER_H
33
4- #include < regex>
54#include < stdarg.h>
65#include " Tracer.h"
76
@@ -22,46 +21,51 @@ class LogTracer : public Tracer {
2221 command (" println" , {message});
2322 }
2423
25- void printf (const string format, ...) {
24+ void printf (const char * format, ...) {
2625 arguments traceArgs = {format};
2726
2827 va_list args;
2928 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+ }
6265 }
63- searchStart = match. suffix (). first ;
66+ format++ ;
6467 }
68+
6569 va_end (args);
6670
6771 command (" printf" , traceArgs);
0 commit comments