Skip to content

Commit 49aed26

Browse files
committed
Parse printf format string more memory-efficiently
1 parent 1878be6 commit 49aed26

File tree

2 files changed

+40
-36
lines changed

2 files changed

+40
-36
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.2)
22

3-
project(algorithm-visualizer VERSION 2.3.2)
3+
project(algorithm-visualizer VERSION 2.3.3)
44

55
set(CMAKE_CXX_STANDARD 11)
66

include/LogTracer.h

+39-35
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
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

Comments
 (0)