wslog: Do not print control characters

This commit is contained in:
João Valverde 2022-10-15 10:11:00 +01:00
parent d4ba8be9d7
commit d2a488f5d5
3 changed files with 74 additions and 8 deletions

View File

@ -255,12 +255,14 @@ wmem_strbuf_append_unichar(wmem_strbuf_t *strbuf, const gunichar c)
static const char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
#define HEX_CODELEN 4
void
wmem_strbuf_append_hex(wmem_strbuf_t *strbuf, uint8_t ch)
{
wmem_strbuf_grow(strbuf, 4);
wmem_strbuf_grow(strbuf, HEX_CODELEN * 1);
if (!strbuf->max_size || WMEM_STRBUF_ROOM(strbuf) >= 4) {
if (!strbuf->max_size || WMEM_STRBUF_ROOM(strbuf) >= HEX_CODELEN * 1) {
strbuf->str[strbuf->len++] = '\\';
strbuf->str[strbuf->len++] = 'x';
strbuf->str[strbuf->len++] = hex[(ch >> 4) & 0xF];
@ -269,6 +271,61 @@ wmem_strbuf_append_hex(wmem_strbuf_t *strbuf, uint8_t ch)
}
}
#define BMP_CODELEN 6
static inline
void append_hex_bmp(wmem_strbuf_t *strbuf, gunichar ch)
{
wmem_strbuf_grow(strbuf, BMP_CODELEN * 1);
if (!strbuf->max_size || WMEM_STRBUF_ROOM(strbuf) >= BMP_CODELEN * 1) {
strbuf->str[strbuf->len++] = '\\';
strbuf->str[strbuf->len++] = 'u';
strbuf->str[strbuf->len++] = hex[(ch >> 12) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 8) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 4) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 0) & 0xF];
strbuf->str[strbuf->len] = '\0';
}
}
#define ANY_CODELEN 10
static inline
void append_hex_any(wmem_strbuf_t *strbuf, gunichar ch)
{
wmem_strbuf_grow(strbuf, ANY_CODELEN * 1);
if (!strbuf->max_size || WMEM_STRBUF_ROOM(strbuf) >= ANY_CODELEN * 1) {
strbuf->str[strbuf->len++] = '\\';
strbuf->str[strbuf->len++] = 'U';
strbuf->str[strbuf->len++] = hex[(ch >> 28) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 24) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 20) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 16) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 12) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 8) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 4) & 0xF];
strbuf->str[strbuf->len++] = hex[(ch >> 0) & 0xF];
strbuf->str[strbuf->len] = '\0';
}
}
size_t
wmem_strbuf_append_hex_unichar(wmem_strbuf_t *strbuf, gunichar ch)
{
if (ch <= 0x7f) {
wmem_strbuf_append_hex(strbuf, (uint8_t)ch);
return HEX_CODELEN;
}
if (ch <= 0xffff) {
append_hex_bmp(strbuf, ch);
return BMP_CODELEN;
}
append_hex_any(strbuf, ch);
return ANY_CODELEN;
}
void
wmem_strbuf_truncate(wmem_strbuf_t *strbuf, const size_t len)
{

View File

@ -106,6 +106,11 @@ WS_DLL_PUBLIC
void
wmem_strbuf_append_hex(wmem_strbuf_t *strbuf, uint8_t);
/* Returns the number of characters written (4, 6 or 10). */
WS_DLL_PUBLIC
size_t
wmem_strbuf_append_hex_unichar(wmem_strbuf_t *strbuf, gunichar);
WS_DLL_PUBLIC
void
wmem_strbuf_truncate(wmem_strbuf_t *strbuf, const size_t len);

View File

@ -1190,19 +1190,23 @@ static char *
make_utf8_display(const char *src, size_t src_length, size_t good_length)
{
wmem_strbuf_t *buf;
unsigned char ch;
gunichar ch;
size_t offset = 0;
buf = wmem_strbuf_new(NULL, NULL);
for (size_t pos = 0; pos < good_length; pos++) {
ch = src[pos];
wmem_strbuf_append_c(buf, ch);
if ((ch >> 6) != 2) {
/* first byte */
for (const char *s = src; s < src + good_length; s = g_utf8_next_char(s)) {
ch = g_utf8_get_char(s);
if (g_unichar_isprint(ch)) {
wmem_strbuf_append_unichar(buf, ch);
offset += 1;
}
else {
offset += wmem_strbuf_append_hex_unichar(buf, ch);
}
}
for (size_t pos = good_length; pos < src_length; pos++) {
ch = src[pos];
wmem_strbuf_append_hex(buf, ch);