diff options
author | Luís Marques <luismarques@lowrisc.org> | 2019-10-22 17:56:54 +0100 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2019-10-22 09:56:53 -0700 |
commit | 99d6d0a93f9c83b63343a00693d5085e3949fe1a (patch) | |
tree | 2be05e20bf3956c1578bd32055c6195117087b85 /util | |
parent | 78e61baf432bd2d796c5b1e0498af363967322f4 (diff) | |
download | riscv-pk-99d6d0a93f9c83b63343a00693d5085e3949fe1a.zip riscv-pk-99d6d0a93f9c83b63343a00693d5085e3949fe1a.tar.gz riscv-pk-99d6d0a93f9c83b63343a00693d5085e3949fe1a.tar.bz2 |
Make performance counters always 64 bits wide (#178)
This prevents the counters from easily overflowing for a 32-bit pk.
Diffstat (limited to 'util')
-rw-r--r-- | util/snprintf.c | 19 |
1 files changed, 16 insertions, 3 deletions
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; } |