Skip to content

Commit 95b31d0

Browse files
authored
Merge pull request #505 from smititelu/buffer-print-bin
Print unprintable characters in memory buffer
2 parents 0164c1e + c73d9a9 commit 95b31d0

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

src/objectc.c

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,34 @@ static void msgpack_object_bin_print(FILE* out, const char *ptr, size_t size)
127127
}
128128
}
129129

130+
static int msgpack_object_bin_print_buffer(char *buffer, size_t buffer_size, const char *ptr, size_t size)
131+
{
132+
size_t i;
133+
char *aux_buffer = buffer;
134+
size_t aux_buffer_size = buffer_size;
135+
int ret;
136+
137+
for (i = 0; i < size; ++i) {
138+
if (ptr[i] == '"') {
139+
ret = snprintf(aux_buffer, aux_buffer_size, "\\\"");
140+
aux_buffer = aux_buffer + ret;
141+
aux_buffer_size = aux_buffer_size - ret;
142+
} else if (isprint(ptr[i])) {
143+
if (aux_buffer_size > 0) {
144+
memcpy(aux_buffer, ptr + i, 1);
145+
aux_buffer = aux_buffer + 1;
146+
aux_buffer_size = aux_buffer_size - 1;
147+
}
148+
} else {
149+
ret = snprintf(aux_buffer, aux_buffer_size, "\\x%02x", (unsigned char)ptr[i]);
150+
aux_buffer = aux_buffer + ret;
151+
aux_buffer_size = aux_buffer_size - ret;
152+
}
153+
}
154+
155+
return buffer_size - aux_buffer_size;
156+
}
157+
130158

131159
void msgpack_object_print(FILE* out, msgpack_object o)
132160
{
@@ -318,14 +346,11 @@ int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object
318346
ret = snprintf(aux_buffer, aux_buffer_size, "\"");
319347
aux_buffer = aux_buffer + ret;
320348
aux_buffer_size = aux_buffer_size - ret;
321-
if (o.via.bin.size < aux_buffer_size) {
322-
memcpy(aux_buffer, o.via.bin.ptr, o.via.bin.size);
323-
aux_buffer = aux_buffer + o.via.bin.size;
324-
aux_buffer_size = aux_buffer_size - o.via.bin.size;
325-
} else {
326-
memcpy(aux_buffer, o.via.bin.ptr, aux_buffer_size);
327-
aux_buffer_size = 0;
328-
}
349+
350+
ret = msgpack_object_bin_print_buffer(aux_buffer, aux_buffer_size, o.via.bin.ptr, o.via.bin.size);
351+
aux_buffer = aux_buffer + ret;
352+
aux_buffer_size = aux_buffer_size - ret;
353+
329354
ret = snprintf(aux_buffer, aux_buffer_size, "\"");
330355
aux_buffer = aux_buffer + ret;
331356
aux_buffer_size = aux_buffer_size - ret;
@@ -344,9 +369,11 @@ int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object
344369
ret = snprintf(aux_buffer, aux_buffer_size, "\"");
345370
aux_buffer = aux_buffer + ret;
346371
aux_buffer_size = aux_buffer_size - ret;
347-
ret = snprintf(aux_buffer, aux_buffer_size, "%.*s", o.via.ext.size, o.via.ext.ptr);
372+
373+
ret = msgpack_object_bin_print_buffer(aux_buffer, aux_buffer_size, o.via.ext.ptr, o.via.ext.size);
348374
aux_buffer = aux_buffer + ret;
349375
aux_buffer_size = aux_buffer_size - ret;
376+
350377
ret = snprintf(aux_buffer, aux_buffer_size, "\"");
351378
aux_buffer = aux_buffer + ret;
352379
aux_buffer_size = aux_buffer_size - ret;

0 commit comments

Comments
 (0)