| 7028 | } |
| 7029 | |
| 7030 | static int |
| 7031 | xo_do_close_container (xo_handle_t *xop, const char *name) |
| 7032 | { |
| 7033 | xop = xo_default(xop); |
| 7034 | |
| 7035 | ssize_t rc = 0; |
| 7036 | const char *ppn = XOF_ISSET(xop, XOF_PRETTY) ? "\n" : ""; |
| 7037 | const char *pre_nl = ""; |
| 7038 | |
| 7039 | if (name == NULL) { |
| 7040 | xo_stack_t *xsp = &xop->xo_stack[xop->xo_depth]; |
| 7041 | |
| 7042 | name = xsp->xs_name; |
| 7043 | if (name) { |
| 7044 | ssize_t len = strlen(name) + 1; |
| 7045 | /* We need to make a local copy; xo_depth_change will free it */ |
| 7046 | char *cp = alloca(len); |
| 7047 | memcpy(cp, name, len); |
| 7048 | name = cp; |
| 7049 | } else if (!(xsp->xs_flags & XSF_DTRT)) { |
| 7050 | xo_failure(xop, "missing name without 'dtrt' mode"); |
| 7051 | name = XO_FAILURE_NAME; |
| 7052 | } |
| 7053 | } |
| 7054 | |
| 7055 | const char *leader = xo_xml_leader(xop, name); |
| 7056 | |
| 7057 | switch (xo_style(xop)) { |
| 7058 | case XO_STYLE_XML: |
| 7059 | xo_depth_change(xop, name, -1, -1, XSS_CLOSE_CONTAINER, 0); |
| 7060 | rc = xo_printf(xop, "%*s</%s%s>%s", xo_indent(xop), "", leader, name, ppn); |
| 7061 | break; |
| 7062 | |
| 7063 | case XO_STYLE_JSON: |
| 7064 | xo_stack_set_flags(xop); |
| 7065 | |
| 7066 | pre_nl = XOF_ISSET(xop, XOF_PRETTY) ? "\n" : ""; |
| 7067 | ppn = ""; |
| 7068 | |
| 7069 | xo_depth_change(xop, name, -1, -1, XSS_CLOSE_CONTAINER, 0); |
| 7070 | rc = xo_printf(xop, "%s%*s}%s", pre_nl, xo_indent(xop), "", ppn); |
| 7071 | xop->xo_stack[xop->xo_depth].xs_flags |= XSF_NOT_FIRST; |
| 7072 | break; |
| 7073 | |
| 7074 | case XO_STYLE_HTML: |
| 7075 | case XO_STYLE_TEXT: |
| 7076 | xo_depth_change(xop, name, -1, 0, XSS_CLOSE_CONTAINER, 0); |
| 7077 | break; |
| 7078 | |
| 7079 | case XO_STYLE_SDPARAMS: |
| 7080 | break; |
| 7081 | |
| 7082 | case XO_STYLE_ENCODER: |
| 7083 | xo_depth_change(xop, name, -1, 0, XSS_CLOSE_CONTAINER, 0); |
| 7084 | rc = xo_encoder_handle(xop, XO_OP_CLOSE_CONTAINER, name, NULL, 0); |
| 7085 | break; |
| 7086 | } |
| 7087 |
no test coverage detected