XML-Hash-XS

 view release on metacpan or  search on metacpan

src/xh_dom.h  view on Meta::CPAN

    xh_char_t     *content;
    size_t         content_len;
    STRLEN         str_len;
    xh_char_t      ch;

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

    if (ctx->opts.trim && content_len) {
        content = xh_str_trim(content, &content_len);
        ch      = content[content_len];
        content[content_len] = '\0';

        xmlNodeAddContentLen(rootNode, BAD_CAST content, content_len);

        content[content_len] = ch;
    }
    else {
        xmlNodeAddContentLen(rootNode, BAD_CAST content, content_len);
    }
}

XH_INLINE void
xh_dom_new_comment(xh_h2x_ctx_t *ctx, xmlNodePtr rootNode, SV *value)
{
    xh_char_t     *content;
    size_t         content_len;
    STRLEN         str_len;
    xh_char_t      ch;

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

    if (ctx->opts.trim && content_len) {
        content = xh_str_trim(content, &content_len);
        ch      = content[content_len];
        content[content_len] = '\0';

        (void) xmlAddChild(rootNode, xmlNewDocComment(rootNode->doc, BAD_CAST content));

        content[content_len] = ch;
    }
    else {
        (void) xmlAddChild(rootNode, xmlNewDocComment(rootNode->doc, BAD_CAST content));
    }
}

XH_INLINE void
xh_dom_new_cdata(xh_h2x_ctx_t *ctx, xmlNodePtr rootNode, SV *value)
{
    xh_char_t     *content;
    size_t         content_len;
    STRLEN         str_len;

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

    if (ctx->opts.trim && content_len) {
        content = xh_str_trim(content, &content_len);
    }

    (void) xmlAddChild(rootNode, xmlNewCDataBlock(rootNode->doc, BAD_CAST content, content_len));
}

XH_INLINE void
xh_dom_new_attribute(xh_h2x_ctx_t *XH_UNUSED(ctx), xmlNodePtr rootNode, xh_char_t *name, size_t name_len, SV *value)
{
    xh_char_t     *content;
    STRLEN         str_len;
    xh_char_t     *tmp;

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

    tmp = NULL;
    if (name[0] >= '1' && name[0] <= '9') {
        tmp = malloc(name_len + 1);
        if (tmp == NULL) {
            croak("Memory allocation error");
        }

        (void) xh_strcpy(&tmp[1], name);

        name    = tmp;
        name[0] = '_';
    }

    (void) xmlSetProp(rootNode, BAD_CAST name, BAD_CAST content);

    if (tmp != NULL) {
        free(tmp);
    }
}

#endif

#endif /* _XH_DOM_H_ */



( run in 0.585 second using v1.01-cache-2.11-cpan-39bf76dae61 )