| 7438 | } |
| 7439 | |
| 7440 | static int |
| 7441 | xo_do_close_instance (xo_handle_t *xop, const char *name) |
| 7442 | { |
| 7443 | xop = xo_default(xop); |
| 7444 | |
| 7445 | ssize_t rc = 0; |
| 7446 | const char *ppn = XOF_ISSET(xop, XOF_PRETTY) ? "\n" : ""; |
| 7447 | const char *pre_nl = ""; |
| 7448 | |
| 7449 | if (name == NULL) { |
| 7450 | xo_stack_t *xsp = &xop->xo_stack[xop->xo_depth]; |
| 7451 | |
| 7452 | name = xsp->xs_name; |
| 7453 | if (name) { |
| 7454 | ssize_t len = strlen(name) + 1; |
| 7455 | /* We need to make a local copy; xo_depth_change will free it */ |
| 7456 | char *cp = alloca(len); |
| 7457 | memcpy(cp, name, len); |
| 7458 | name = cp; |
| 7459 | } else if (!(xsp->xs_flags & XSF_DTRT)) { |
| 7460 | xo_failure(xop, "missing name without 'dtrt' mode"); |
| 7461 | name = XO_FAILURE_NAME; |
| 7462 | } |
| 7463 | } |
| 7464 | |
| 7465 | const char *leader = xo_xml_leader(xop, name); |
| 7466 | |
| 7467 | switch (xo_style(xop)) { |
| 7468 | case XO_STYLE_XML: |
| 7469 | xo_depth_change(xop, name, -1, -1, XSS_CLOSE_INSTANCE, 0); |
| 7470 | rc = xo_printf(xop, "%*s</%s%s>%s", xo_indent(xop), "", leader, name, ppn); |
| 7471 | break; |
| 7472 | |
| 7473 | case XO_STYLE_JSON: |
| 7474 | pre_nl = XOF_ISSET(xop, XOF_PRETTY) ? "\n" : ""; |
| 7475 | |
| 7476 | xo_depth_change(xop, name, -1, -1, XSS_CLOSE_INSTANCE, 0); |
| 7477 | rc = xo_printf(xop, "%s%*s}", pre_nl, xo_indent(xop), ""); |
| 7478 | xop->xo_stack[xop->xo_depth].xs_flags |= XSF_NOT_FIRST; |
| 7479 | break; |
| 7480 | |
| 7481 | case XO_STYLE_HTML: |
| 7482 | case XO_STYLE_TEXT: |
| 7483 | xo_depth_change(xop, name, -1, 0, XSS_CLOSE_INSTANCE, 0); |
| 7484 | break; |
| 7485 | |
| 7486 | case XO_STYLE_SDPARAMS: |
| 7487 | break; |
| 7488 | |
| 7489 | case XO_STYLE_ENCODER: |
| 7490 | xo_depth_change(xop, name, -1, 0, XSS_CLOSE_INSTANCE, 0); |
| 7491 | rc = xo_encoder_handle(xop, XO_OP_CLOSE_INSTANCE, name, NULL, 0); |
| 7492 | break; |
| 7493 | } |
| 7494 | |
| 7495 | return rc; |
| 7496 | } |
| 7497 |
no test coverage detected