| 233 | #define DP_JSON_MSG_END "\"}" |
| 234 | |
| 235 | static int log_escape_json_buf(char *src, int src_len, char *dst, int dst_max_len) |
| 236 | { |
| 237 | int i, j = 0; |
| 238 | int rlen = 0; |
| 239 | |
| 240 | /* calculate the required length in the dst buffer */ |
| 241 | for (i=0; i<src_len; i++) { |
| 242 | rlen++; |
| 243 | |
| 244 | switch (src[i]) { |
| 245 | case '\\': |
| 246 | case '\"': |
| 247 | case '\b': |
| 248 | case '\f': |
| 249 | case '\n': |
| 250 | case '\r': |
| 251 | case '\t': |
| 252 | rlen++; /* +1 for the backslash */ |
| 253 | break; |
| 254 | default: |
| 255 | if (src[i] < 32) |
| 256 | rlen += 6; /* +6 for \uXXXX */ |
| 257 | } |
| 258 | } |
| 259 | |
| 260 | if (rlen>dst_max_len) { |
| 261 | stderr_dprint_tmp_err("buffer too small! needed: %d\n", rlen); |
| 262 | return -1; |
| 263 | } else if (rlen == src_len) { |
| 264 | /* nothing needs to be escaped */ |
| 265 | memcpy(dst, src, src_len); |
| 266 | return src_len; |
| 267 | } |
| 268 | |
| 269 | for (i=0; i<src_len; i++) { |
| 270 | if (src[i] > 31 && src[i] != '\\' && src[i] != '\"') { |
| 271 | dst[j++] = src[i]; |
| 272 | } else { |
| 273 | dst[j++] = '\\'; |
| 274 | |
| 275 | switch (src[i]) { |
| 276 | case '\\': |
| 277 | dst[j++] = '\\'; |
| 278 | break; |
| 279 | case '\"': |
| 280 | dst[j++] = '\"'; |
| 281 | break; |
| 282 | case '\b': |
| 283 | dst[j++] = 'b'; |
| 284 | break; |
| 285 | case '\f': |
| 286 | dst[j++] = 'f'; |
| 287 | break; |
| 288 | case '\n': |
| 289 | dst[j++] = 'n'; |
| 290 | break; |
| 291 | case '\r': |
| 292 | dst[j++] = 'r'; |