XML-Hash-XS

 view release on metacpan or  search on metacpan

src/xh_xml.h  view on Meta::CPAN

        XH_WRITER_RESIZE_BUFFER(writer, buf, content_len * 5)
    }

    XH_BUFFER_WRITE_ESCAPE_STRING(buf, content, content_len);

    if (writer->indent) {
        XH_BUFFER_WRITE_CHAR(buf, '\n')
    }
}

XH_INLINE void
xh_xml_write_comment(xh_writer_t *writer, SV *value)
{
    size_t         indent_len;
    xh_perl_buffer_t *buf;
    xh_char_t        *content;
    size_t            content_len;
    STRLEN            str_len;

    buf = &writer->main_buf;

    if (value == NULL) {
        content     = XH_EMPTY_STRING;
        content_len = 0;
    }
    else {
        content     = XH_CHAR_CAST SvPV(value, str_len);
        content_len = str_len;
    }

    if (writer->trim && content_len) {
        content = xh_str_trim(content, &content_len);
    }

    if (writer->indent) {
        indent_len = writer->indent_count * writer->indent;
        if (indent_len > sizeof(indent_string)) {
            indent_len = sizeof(indent_string);
        }

        /* "<!--" + "-->" */
        XH_WRITER_RESIZE_BUFFER(writer, buf, indent_len + content_len + 7)

        XH_BUFFER_WRITE_LONG_STRING(buf, indent_string, indent_len);
    }
    else {
        /* "<!--" + "-->" */
        XH_WRITER_RESIZE_BUFFER(writer, buf, content_len + 7)
    }

    XH_BUFFER_WRITE_CHAR4(buf, "<!--")
    XH_BUFFER_WRITE_LONG_STRING(buf, content, content_len);
    XH_BUFFER_WRITE_CHAR3(buf, "-->")

    if (writer->indent) {
        XH_BUFFER_WRITE_CHAR(buf, '\n')
    }
}

XH_INLINE void
xh_xml_write_cdata(xh_writer_t *writer, SV *value)
{
    size_t            indent_len;
    xh_perl_buffer_t *buf;
    xh_char_t        *content;
    size_t            content_len;
    STRLEN            str_len;

    buf = &writer->main_buf;

    if (value == NULL) {
        content     = XH_EMPTY_STRING;
        content_len = 0;
    }
    else {
        content     = XH_CHAR_CAST SvPV(value, str_len);
        content_len = str_len;
    }

    if (writer->trim && content_len) {
        content = xh_str_trim(content, &content_len);
    }

    if (writer->indent) {
        indent_len = writer->indent_count * writer->indent;
        if (indent_len > sizeof(indent_string)) {
            indent_len = sizeof(indent_string);
        }

        /* "<![CDATA[" + "]]>" */
        XH_WRITER_RESIZE_BUFFER(writer, buf, indent_len + content_len + 12)

        XH_BUFFER_WRITE_LONG_STRING(buf, indent_string, indent_len);
    }
    else {
        /* "<![CDATA[" + "]]>" */
        XH_WRITER_RESIZE_BUFFER(writer, buf, content_len + 12)
    }

    XH_BUFFER_WRITE_CHAR9(buf, "<![CDATA[")
    XH_BUFFER_WRITE_LONG_STRING(buf, content, content_len);
    XH_BUFFER_WRITE_CHAR3(buf, "]]>")

    if (writer->indent) {
        XH_BUFFER_WRITE_CHAR(buf, '\n')
    }
}

XH_INLINE void
xh_xml_write_start_tag(xh_writer_t *writer, xh_char_t *name, size_t name_len)
{
    size_t            indent_len;
    xh_perl_buffer_t *buf;

    buf = &writer->main_buf;

    if (writer->indent) {
        indent_len = writer->indent_count * writer->indent;
        if (indent_len > sizeof(indent_string)) {
            indent_len = sizeof(indent_string);
        }



( run in 2.303 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )