mirror of
https://github.com/rkd77/elinks.git
synced 2025-01-03 14:57:44 -05:00
Removes node from the DOM tree when using the SGML stream parser
That should free up some short-term memory. Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
This commit is contained in:
parent
8f97dc8403
commit
4480a9a4cd
@ -48,7 +48,7 @@ void
|
|||||||
init_dom_stack(struct dom_stack *stack, void *parser, void *renderer,
|
init_dom_stack(struct dom_stack *stack, void *parser, void *renderer,
|
||||||
dom_stack_callback_T push_callbacks[DOM_NODES],
|
dom_stack_callback_T push_callbacks[DOM_NODES],
|
||||||
dom_stack_callback_T pop_callbacks[DOM_NODES],
|
dom_stack_callback_T pop_callbacks[DOM_NODES],
|
||||||
size_t object_size)
|
size_t object_size, int keep_nodes)
|
||||||
{
|
{
|
||||||
assert(stack);
|
assert(stack);
|
||||||
|
|
||||||
@ -57,6 +57,7 @@ init_dom_stack(struct dom_stack *stack, void *parser, void *renderer,
|
|||||||
stack->parser = parser;
|
stack->parser = parser;
|
||||||
stack->renderer = renderer;
|
stack->renderer = renderer;
|
||||||
stack->object_size = object_size;
|
stack->object_size = object_size;
|
||||||
|
stack->keep_nodes = !!keep_nodes;
|
||||||
|
|
||||||
if (push_callbacks)
|
if (push_callbacks)
|
||||||
memcpy(stack->push_callbacks, push_callbacks, DOM_STACK_CALLBACKS_SIZE);
|
memcpy(stack->push_callbacks, push_callbacks, DOM_STACK_CALLBACKS_SIZE);
|
||||||
@ -148,6 +149,9 @@ do_pop_dom_node(struct dom_stack *stack, struct dom_stack_state *parent)
|
|||||||
callback(stack, state->node, state_data);
|
callback(stack, state->node, state_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!stack->keep_nodes)
|
||||||
|
done_dom_node(state->node);
|
||||||
|
|
||||||
stack->depth--;
|
stack->depth--;
|
||||||
assert(stack->depth >= 0);
|
assert(stack->depth >= 0);
|
||||||
|
|
||||||
|
@ -37,6 +37,9 @@ struct dom_stack {
|
|||||||
struct dom_stack_state *states;
|
struct dom_stack_state *states;
|
||||||
size_t depth;
|
size_t depth;
|
||||||
|
|
||||||
|
/* Keep nodes when popping them or call done_dom_node() on them. */
|
||||||
|
unsigned int keep_nodes:1;
|
||||||
|
|
||||||
/* This is one big array of parser specific objects. */
|
/* This is one big array of parser specific objects. */
|
||||||
/* The objects hold parser specific data. For the SGML parser this
|
/* The objects hold parser specific data. For the SGML parser this
|
||||||
* holds DTD-oriented info about the node (recorded in struct
|
* holds DTD-oriented info about the node (recorded in struct
|
||||||
@ -110,7 +113,7 @@ search_dom_stack(struct dom_stack *stack, enum dom_node_type type,
|
|||||||
void init_dom_stack(struct dom_stack *stack, void *parser, void *renderer,
|
void init_dom_stack(struct dom_stack *stack, void *parser, void *renderer,
|
||||||
dom_stack_callback_T push_callbacks[DOM_NODES],
|
dom_stack_callback_T push_callbacks[DOM_NODES],
|
||||||
dom_stack_callback_T pop_callbacks[DOM_NODES],
|
dom_stack_callback_T pop_callbacks[DOM_NODES],
|
||||||
size_t object_size);
|
size_t object_size, int keep_nodes);
|
||||||
void done_dom_stack(struct dom_stack *stack);
|
void done_dom_stack(struct dom_stack *stack);
|
||||||
|
|
||||||
/* Decends down to the given node making it the current parent */
|
/* Decends down to the given node making it the current parent */
|
||||||
|
@ -318,7 +318,8 @@ init_sgml_parser(enum sgml_parser_type type, void *renderer, struct uri *uri,
|
|||||||
parser->info = &sgml_html_info;
|
parser->info = &sgml_html_info;
|
||||||
|
|
||||||
init_dom_stack(&parser->stack, parser, renderer,
|
init_dom_stack(&parser->stack, parser, renderer,
|
||||||
push_callbacks, pop_callbacks, obj_size);
|
push_callbacks, pop_callbacks, obj_size,
|
||||||
|
type != SGML_PARSER_STREAM);
|
||||||
|
|
||||||
parser->root = add_sgml_document(&parser->stack, parser->uri);
|
parser->root = add_sgml_document(&parser->stack, parser->uri);
|
||||||
if (!parser->root) {
|
if (!parser->root) {
|
||||||
|
Loading…
Reference in New Issue
Block a user