inspect-library: Don't print non-ASCII as nonsense codepoints
If we pass a (signed) char to a varargs function, it's promoted to
(signed) int by the default argument promotions (resulting in padding
on the left by copying the sign bit); but then %x
interprets it as an
unsigned int. The practical result is that for anything over 0x7f, for
example 0xAB, we interpret the high bit as the sign bit and pad with
"1" bits, turning 0xAB into 0xFFFFFFAB. \uFFFFFFAB
is not allowed as an
escaped JSON character (because Unicode stops at U+10FFFF) so parsing
fails.
Note that this change does not result in strings with non-ASCII content
being interpreted correctly: we are effectively taking the bytestring
from the OS and decoding it as though it was ISO-8859-1, so if a file's
path includes U+00C7 LATIN CAPITAL_LETTER C WITH CEDILLA (Ç
), encoded
as 0xC3 0x87 on disk (assuming a UTF-8 environment), it will go into
the JSON document as \u00C3\u0087
instead of the correct \u00C7
. Fixing
this would require either a considerably more complex implementation of
inspect-library, or an output format that is based on bytestrings
rather than JSON.
Partially addresses https://github.com/ValveSoftware/steam-runtime/issues/385 and #69 (closed).