From 89b0ab2d22db510e799e6f9619e8c8e0678f13ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Mon, 30 Dec 2019 10:48:11 +0100 Subject: StringUtil: Add IsPrintableCharacter and use it Add a function that safely returns whether a character is printable i.e. whether 0x20 <= c <= 0x7e is true. This is done in several places in our codebase and it's easy to run into undefined behaviour if the C version defined in is used instead of this one, since its behaviour is undefined if the character is not representable as an unsigned char. This fixes MemoryViewWidget. --- Source/Core/Common/StringUtil.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'Source/Core/Common/StringUtil.h') diff --git a/Source/Core/Common/StringUtil.h b/Source/Core/Common/StringUtil.h index c47fd1f620..93199917b9 100644 --- a/Source/Core/Common/StringUtil.h +++ b/Source/Core/Common/StringUtil.h @@ -222,3 +222,11 @@ std::string ThousandSeparate(I value, int spaces = 0) return stream.str(); #endif } + +/// Returns whether a character is printable, i.e. whether 0x20 <= c <= 0x7e is true. +/// Use this instead of calling std::isprint directly to ensure +/// the C locale is being used and to avoid possibly undefined behaviour. +inline bool IsPrintableCharacter(char c) +{ + return std::isprint(c, std::locale::classic()); +} -- cgit v1.2.3