void done_sgml_parser(struct sgml_parser *parser) { done_dom_stack(&parser->stack); done_dom_stack(&parser->parsing); done_dom_string(&parser->uri); mem_free(parser); }
static enum dom_code normalize_text_node_whitespace(struct dom_node *node) { unsigned char buf[256]; struct dom_string string = INIT_DOM_STRING(NULL, 0); int count = 0, i = 0; unsigned char *text = node->string.string; assert(node->type == DOM_NODE_TEXT); while (i < node->string.length) { int j; for (j = 0; j < sizeof(buf) && i < node->string.length; i++) { unsigned char data = text[i]; if (isspace(data)) { if (count == 1) continue; data = ' '; count = 1; } else { count = 0; } buf[j++] = data; } if (!add_to_dom_string(&string, buf, j)) { done_dom_string(&string); return DOM_CODE_ALLOC_ERR; } } if (node->allocated) done_dom_string(&node->string); set_dom_string(&node->string, string.string, string.length); node->allocated = 1; return DOM_CODE_OK; }
enum dom_code dom_stack_trace_leaf(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_string *name; struct dom_string value; assert(node); name = get_dom_node_name(node); set_enhanced_dom_node_value(&value, node); LOG_INFO("%s%.*s %.*s: %.*s", empty_string_or_(stack->current->data), get_indent_offset(stack), indent_string, name->length, name->string, value.length, value.string); done_dom_string(&value); return DOM_CODE_OK; }
static enum dom_code append_node_text(struct dom_config *config, struct dom_node *node) { struct dom_node *prev = get_dom_node_prev(node); size_t length; struct dom_string dest; struct dom_string src; int error = 0; copy_struct(&src, &node->string); if (!prev || prev->type != DOM_NODE_TEXT) { /* Preserve text nodes with no one to append to. */ if (node->type == DOM_NODE_TEXT) return DOM_CODE_OK; prev = NULL; set_dom_string(&dest, NULL, 0); } else { if (prev->allocated) { copy_struct(&dest, &prev->string); } else { set_dom_string(&dest, NULL, 0); if (!add_to_dom_string(&dest, prev->string.string, prev->string.length)) return DOM_CODE_ALLOC_ERR; set_dom_string(&prev->string, dest.string, dest.length); prev->allocated = 1; } } length = dest.length; switch (node->type) { case DOM_NODE_CDATA_SECTION: case DOM_NODE_TEXT: if (!add_to_dom_string(&dest, src.string, src.length)) error = 1; break; case DOM_NODE_ENTITY_REFERENCE: /* FIXME: Until we will have uniform encoding at this point * (UTF-8) we just add the entity reference unexpanded assuming * that convert_string() will eventually do the work of * expanding it. */ if (!add_to_dom_string(&dest, "&", 1) || !add_to_dom_string(&dest, src.string, src.length) || !add_to_dom_string(&dest, ";", 1)) { error = 1; } break; default: INTERNAL("Cannot append from node %d", node->type); } if (error) { if (prev) prev->string.length = length; else done_dom_string(&dest); return DOM_CODE_ALLOC_ERR; } if (prev) { copy_struct(&prev->string, &dest); if ((config->flags & DOM_CONFIG_NORMALIZE_WHITESPACE) && node->type != DOM_NODE_ENTITY_REFERENCE) { /* XXX: Ignore errors since we want to always * free the appended node at this point. */ normalize_text_node_whitespace(prev); } return DOM_CODE_FREE_NODE; } else { int was_cdata_section = node->type == DOM_NODE_CDATA_SECTION; node->type = DOM_NODE_TEXT; memset(&node->data, 0, sizeof(node->data)); node->allocated = 1; copy_struct(&node->string, &dest); if ((config->flags & DOM_CONFIG_NORMALIZE_WHITESPACE) && was_cdata_section) { /* XXX: Ignore errors since we want to always ok the * append. */ normalize_text_node_whitespace(node); } return DOM_CODE_OK; } }