From cec83e92e6160adf1e39e0173c77743cb1ff1be7 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Mon, 19 Nov 2018 15:24:32 +0100 Subject: Fix T57884: Triangle count is incorrect when above around 2 billion Maniphest Tasks: T57884 Differential Revision: https://developer.blender.org/D3962 --- source/blender/blenlib/BLI_string.h | 2 ++ source/blender/blenlib/intern/string.c | 48 +++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 13 deletions(-) (limited to 'source/blender/blenlib') diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index eef4e0647aa..2fb8f045841 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -33,6 +33,7 @@ */ #include +#include #ifdef __cplusplus extern "C" { @@ -71,6 +72,7 @@ char *BLI_sprintfN(const char *__restrict format, ...) ATTR_WARN_UNUSED_RESULT A size_t BLI_strescape(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL(); size_t BLI_str_format_int_grouped(char dst[16], int num) ATTR_NONNULL(); +size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num) ATTR_NONNULL(); void BLI_str_format_byte_unit(char dst[15], long long int size, const bool base_10) ATTR_NONNULL(); int BLI_strcaseeq(const char *a, const char *b) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 938728aa4bb..3deab9b2ae9 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "MEM_guardedalloc.h" @@ -975,24 +976,13 @@ size_t BLI_str_partition_ex( return end ? (size_t)(end - str) : strlen(str); } -/** - * Format ints with decimal grouping. - * 1000 -> 1,000 - * - * \param dst The resulting string - * \param num Number to format - * \return The length of \a dst - */ -size_t BLI_str_format_int_grouped(char dst[16], int num) +size_t BLI_str_format_int_grouped_ex(char src[16], char dst[16], int num_len) { - char src[16]; char *p_src = src; char *p_dst = dst; const char separator = ','; - int num_len, commas; - - num_len = sprintf(src, "%d", num); + int commas; if (*p_src == '-') { *p_dst++ = *p_src++; @@ -1010,6 +1000,38 @@ size_t BLI_str_format_int_grouped(char dst[16], int num) return (size_t)(p_dst - dst); } +/** + * Format ints with decimal grouping. + * 1000 -> 1,000 + * + * \param dst The resulting string + * \param num Number to format + * \return The length of \a dst + */ +size_t BLI_str_format_int_grouped(char dst[16], int num) +{ + char src[16]; + int num_len = sprintf(src, "%d", num); + + return BLI_str_format_int_grouped_ex(src, dst, num_len); +} + +/** + * Format uint64_t with decimal grouping. + * 1000 -> 1,000 + * + * \param dst The resulting string + * \param num Number to format + * \return The length of \a dst + */ +size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num) +{ + char src[16]; + int num_len = sprintf(src, "%"PRIu64"",num); + + return BLI_str_format_int_grouped_ex(src, dst, num_len); +} + /** * Format a size in bytes using binary units. * 1000 -> 1 KB -- cgit v1.2.3