From 99d6d0a93f9c83b63343a00693d5085e3949fe1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Marques?= Date: Tue, 22 Oct 2019 17:56:54 +0100 Subject: Make performance counters always 64 bits wide (#178) This prevents the counters from easily overflowing for a 32-bit pk. --- util/snprintf.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'util') diff --git a/util/snprintf.c b/util/snprintf.c index 1544a6c..a11a4f7 100644 --- a/util/snprintf.c +++ b/util/snprintf.c @@ -9,6 +9,7 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl) { bool format = false; bool longarg = false; + bool longlongarg = false; size_t pos = 0; for( ; *s; s++) { @@ -17,7 +18,12 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl) switch(*s) { case 'l': - longarg = true; + if (s[1] == 'l') { + longlongarg = true; + s++; + } + else + longarg = true; break; case 'p': longarg = true; @@ -36,13 +42,19 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl) } case 'd': { - long num = longarg ? va_arg(vl, long) : va_arg(vl, int); + long long num; + if (longarg) + num = va_arg(vl, long); + else if (longlongarg) + num = va_arg(vl, long long); + else + num = va_arg(vl, int); if (num < 0) { num = -num; if (++pos < n) out[pos-1] = '-'; } long digits = 1; - for (long nn = num; nn /= 10; digits++) + for (long long nn = num; nn /= 10; digits++) ; for (int i = digits-1; i >= 0; i--) { if (pos + i + 1 < n) out[pos + i] = '0' + (num % 10); @@ -50,6 +62,7 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl) } pos += digits; longarg = false; + longlongarg = false; format = false; break; } -- cgit v1.1