| 4279 | #endif /* 0 */ |
| 4280 | |
| 4281 | static void |
| 4282 | xo_format_value (xo_handle_t *xop, const char *name, ssize_t nlen, |
| 4283 | const char *value, ssize_t vlen, |
| 4284 | const char *fmt, ssize_t flen, |
| 4285 | const char *encoding, ssize_t elen, xo_xff_flags_t flags) |
| 4286 | { |
| 4287 | int pretty = XOF_ISSET(xop, XOF_PRETTY); |
| 4288 | int quote; |
| 4289 | |
| 4290 | /* |
| 4291 | * Before we emit a value, we need to know that the frame is ready. |
| 4292 | */ |
| 4293 | xo_stack_t *xsp = &xop->xo_stack[xop->xo_depth]; |
| 4294 | |
| 4295 | if (flags & XFF_LEAF_LIST) { |
| 4296 | /* |
| 4297 | * Check if we've already started to emit normal leafs |
| 4298 | * or if we're not in a leaf list. |
| 4299 | */ |
| 4300 | if ((xsp->xs_flags & (XSF_EMIT | XSF_EMIT_KEY)) |
| 4301 | || !(xsp->xs_flags & XSF_EMIT_LEAF_LIST)) { |
| 4302 | char nbuf[nlen + 1]; |
| 4303 | memcpy(nbuf, name, nlen); |
| 4304 | nbuf[nlen] = '\0'; |
| 4305 | |
| 4306 | ssize_t rc = xo_transition(xop, 0, nbuf, XSS_EMIT_LEAF_LIST); |
| 4307 | if (rc < 0) |
| 4308 | flags |= XFF_DISPLAY_ONLY | XFF_ENCODE_ONLY; |
| 4309 | else |
| 4310 | xop->xo_stack[xop->xo_depth].xs_flags |= XSF_EMIT_LEAF_LIST; |
| 4311 | } |
| 4312 | |
| 4313 | xsp = &xop->xo_stack[xop->xo_depth]; |
| 4314 | if (xsp->xs_name) { |
| 4315 | name = xsp->xs_name; |
| 4316 | nlen = strlen(name); |
| 4317 | } |
| 4318 | |
| 4319 | } else if (flags & XFF_KEY) { |
| 4320 | /* Emitting a 'k' (key) field */ |
| 4321 | if ((xsp->xs_flags & XSF_EMIT) && !(flags & XFF_DISPLAY_ONLY)) { |
| 4322 | xo_failure(xop, "key field emitted after normal value field: '%.*s'", |
| 4323 | nlen, name); |
| 4324 | |
| 4325 | } else if (!(xsp->xs_flags & XSF_EMIT_KEY)) { |
| 4326 | char nbuf[nlen + 1]; |
| 4327 | memcpy(nbuf, name, nlen); |
| 4328 | nbuf[nlen] = '\0'; |
| 4329 | |
| 4330 | ssize_t rc = xo_transition(xop, 0, nbuf, XSS_EMIT); |
| 4331 | if (rc < 0) |
| 4332 | flags |= XFF_DISPLAY_ONLY | XFF_ENCODE_ONLY; |
| 4333 | else |
| 4334 | xop->xo_stack[xop->xo_depth].xs_flags |= XSF_EMIT_KEY; |
| 4335 | |
| 4336 | xsp = &xop->xo_stack[xop->xo_depth]; |
| 4337 | xsp->xs_flags |= XSF_EMIT_KEY; |
| 4338 | } |
no test coverage detected