@@ -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
131159void 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