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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 39 additions & 35 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy