mirror of
https://github.com/rkd77/elinks.git
synced 2024-09-28 03:06:20 -04:00
Combine DOM stack push and pop callbacks into one struct
This commit is contained in:
parent
7679ccd881
commit
990c5e0a26
@ -741,7 +741,9 @@ render_dom_attribute_source(struct dom_stack *stack, struct dom_node *node, void
|
||||
return node;
|
||||
}
|
||||
|
||||
static dom_stack_callback_T dom_source_renderer_push_callbacks[DOM_NODES] = {
|
||||
static struct dom_stack_callbacks dom_source_renderer_callbacks = {
|
||||
/* Push: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ render_dom_element_source,
|
||||
/* DOM_NODE_ATTRIBUTE */ render_dom_attribute_source,
|
||||
@ -755,9 +757,9 @@ static dom_stack_callback_T dom_source_renderer_push_callbacks[DOM_NODES] = {
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ render_dom_node_source,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ render_dom_node_source,
|
||||
/* DOM_NODE_NOTATION */ render_dom_node_source,
|
||||
};
|
||||
|
||||
static dom_stack_callback_T dom_source_renderer_pop_callbacks[DOM_NODES] = {
|
||||
},
|
||||
/* Pop: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ render_dom_element_end_source,
|
||||
/* DOM_NODE_ATTRIBUTE */ NULL,
|
||||
@ -771,6 +773,7 @@ static dom_stack_callback_T dom_source_renderer_pop_callbacks[DOM_NODES] = {
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ NULL,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ NULL,
|
||||
/* DOM_NODE_NOTATION */ NULL,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -806,8 +809,7 @@ render_dom_document(struct cache_entry *cached, struct document *document,
|
||||
|
||||
parser = init_sgml_parser(SGML_PARSER_STREAM, doctype,
|
||||
&renderer, cached->uri,
|
||||
dom_source_renderer_push_callbacks,
|
||||
dom_source_renderer_pop_callbacks);
|
||||
&dom_source_renderer_callbacks);
|
||||
if (!parser) return;
|
||||
|
||||
root = parse_sgml(parser, buffer);
|
||||
|
@ -376,7 +376,7 @@ parse_dom_select(struct dom_select *select, unsigned char *string, int length)
|
||||
struct dom_select_node sel;
|
||||
|
||||
init_scanner(&scanner, &css_scanner_info, string, string + length);
|
||||
init_dom_stack(&stack, select, NULL, NULL, 0, 1);
|
||||
init_dom_stack(&stack, select, NULL, 0, 1);
|
||||
|
||||
memset(&sel, 0, sizeof(sel));
|
||||
|
||||
@ -790,8 +790,9 @@ dom_select_push_text(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
dom_stack_callback_T dom_select_push_callbacks[DOM_NODES] = {
|
||||
static struct dom_stack_callbacks dom_select_callbacks = {
|
||||
/* Push: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ dom_select_push_element,
|
||||
/* DOM_NODE_ATTRIBUTE */ NULL,
|
||||
@ -805,9 +806,9 @@ dom_stack_callback_T dom_select_push_callbacks[DOM_NODES] = {
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ NULL,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ NULL,
|
||||
/* DOM_NODE_NOTATION */ NULL,
|
||||
};
|
||||
|
||||
dom_stack_callback_T dom_select_pop_callbacks[DOM_NODES] = {
|
||||
},
|
||||
/* Pop: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ dom_select_pop_element,
|
||||
/* DOM_NODE_ATTRIBUTE */ NULL,
|
||||
@ -821,6 +822,7 @@ dom_stack_callback_T dom_select_pop_callbacks[DOM_NODES] = {
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ NULL,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ NULL,
|
||||
/* DOM_NODE_NOTATION */ NULL,
|
||||
}
|
||||
};
|
||||
|
||||
struct dom_node_list *
|
||||
@ -834,12 +836,8 @@ select_dom_nodes(struct dom_select *select, struct dom_node *root)
|
||||
|
||||
select_data.select = select;;
|
||||
|
||||
init_dom_stack(&stack, &select_data,
|
||||
dom_select_push_callbacks,
|
||||
dom_select_pop_callbacks, 0, 1);
|
||||
|
||||
init_dom_stack(&select_data.stack, &select_data, NULL, NULL,
|
||||
obj_size, 1);
|
||||
init_dom_stack(&stack, &select_data, &dom_select_callbacks, 0, 1);
|
||||
init_dom_stack(&select_data.stack, &select_data, NULL, obj_size, 1);
|
||||
|
||||
if (push_dom_node(&select_data.stack, &select->selector->node)) {
|
||||
get_dom_stack_top(&select_data.stack)->immutable = 1;
|
||||
|
@ -46,8 +46,7 @@ realloc_dom_stack_state_objects(struct dom_stack *stack)
|
||||
|
||||
void
|
||||
init_dom_stack(struct dom_stack *stack, void *data,
|
||||
dom_stack_callback_T push_callbacks[DOM_NODES],
|
||||
dom_stack_callback_T pop_callbacks[DOM_NODES],
|
||||
struct dom_stack_callbacks *callbacks,
|
||||
size_t object_size, int keep_nodes)
|
||||
{
|
||||
assert(stack);
|
||||
@ -57,11 +56,7 @@ init_dom_stack(struct dom_stack *stack, void *data,
|
||||
stack->data = data;
|
||||
stack->object_size = object_size;
|
||||
stack->keep_nodes = !!keep_nodes;
|
||||
|
||||
if (push_callbacks)
|
||||
memcpy(stack->push_callbacks, push_callbacks, DOM_STACK_CALLBACKS_SIZE);
|
||||
if (pop_callbacks)
|
||||
memcpy(stack->pop_callbacks, pop_callbacks, DOM_STACK_CALLBACKS_SIZE);
|
||||
stack->callbacks = callbacks;
|
||||
}
|
||||
|
||||
void
|
||||
@ -114,7 +109,7 @@ push_dom_node(struct dom_stack *stack, struct dom_node *node)
|
||||
* in the callbacks */
|
||||
stack->depth++;
|
||||
|
||||
callback = stack->push_callbacks[node->type];
|
||||
callback = stack->callbacks ? stack->callbacks->push[node->type] : NULL;
|
||||
if (callback) {
|
||||
void *state_data = get_dom_stack_state_data(stack, state);
|
||||
|
||||
@ -143,7 +138,7 @@ do_pop_dom_node(struct dom_stack *stack, struct dom_stack_state *parent)
|
||||
if (state->immutable)
|
||||
return 1;
|
||||
|
||||
callback = stack->pop_callbacks[state->node->type];
|
||||
callback = stack->callbacks ? stack->callbacks->pop[state->node->type] : NULL;
|
||||
if (callback) {
|
||||
void *state_data = get_dom_stack_state_data(stack, state);
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
#ifndef EL__DOCUMENT_DOM_STACK_H
|
||||
#define EL__DOCUMENT_DOM_STACK_H
|
||||
|
||||
@ -12,6 +11,11 @@ struct dom_stack;
|
||||
typedef struct dom_node *
|
||||
(*dom_stack_callback_T)(struct dom_stack *, struct dom_node *, void *);
|
||||
|
||||
struct dom_stack_callbacks {
|
||||
dom_stack_callback_T push[DOM_NODES];
|
||||
dom_stack_callback_T pop[DOM_NODES];
|
||||
};
|
||||
|
||||
#define DOM_STACK_MAX_DEPTH 4096
|
||||
|
||||
struct dom_stack_state {
|
||||
@ -50,9 +54,8 @@ struct dom_stack {
|
||||
unsigned char *state_objects;
|
||||
size_t object_size;
|
||||
|
||||
/* Renderer specific callbacks for the streaming parser mode. */
|
||||
dom_stack_callback_T push_callbacks[DOM_NODES];
|
||||
dom_stack_callback_T pop_callbacks[DOM_NODES];
|
||||
/* Callbacks which should be called for the pushed and popped nodes. */
|
||||
struct dom_stack_callbacks *callbacks;
|
||||
|
||||
/* Data specific to the parser and renderer. */
|
||||
void *data;
|
||||
@ -113,8 +116,7 @@ search_dom_stack(struct dom_stack *stack, enum dom_node_type type,
|
||||
* state to be assigned to the state's @data member. Zero means no state data should
|
||||
* be allocated. */
|
||||
void init_dom_stack(struct dom_stack *stack, void *data,
|
||||
dom_stack_callback_T push_callbacks[DOM_NODES],
|
||||
dom_stack_callback_T pop_callbacks[DOM_NODES],
|
||||
struct dom_stack_callbacks *callbacks,
|
||||
size_t object_size, int keep_nodes);
|
||||
void done_dom_stack(struct dom_stack *stack);
|
||||
|
||||
|
@ -306,8 +306,7 @@ parse_sgml_document(struct dom_stack *stack, struct scanner *scanner)
|
||||
struct sgml_parser *
|
||||
init_sgml_parser(enum sgml_parser_type type, enum sgml_document_type doctype,
|
||||
void *data, struct uri *uri,
|
||||
dom_stack_callback_T push_callbacks[DOM_NODES],
|
||||
dom_stack_callback_T pop_callbacks[DOM_NODES])
|
||||
struct dom_stack_callbacks *callbacks)
|
||||
{
|
||||
size_t obj_size = sizeof(struct sgml_parser_state);
|
||||
struct sgml_parser *parser;
|
||||
@ -320,8 +319,7 @@ init_sgml_parser(enum sgml_parser_type type, enum sgml_document_type doctype,
|
||||
parser->info = get_sgml_info(doctype);
|
||||
parser->data = data;
|
||||
|
||||
init_dom_stack(&parser->stack, parser,
|
||||
push_callbacks, pop_callbacks, obj_size,
|
||||
init_dom_stack(&parser->stack, parser, callbacks, obj_size,
|
||||
type != SGML_PARSER_STREAM);
|
||||
|
||||
parser->root = add_sgml_document(&parser->stack, parser->uri);
|
||||
|
@ -45,8 +45,7 @@ struct sgml_parser_state {
|
||||
struct sgml_parser *
|
||||
init_sgml_parser(enum sgml_parser_type type, enum sgml_document_type doctype,
|
||||
void *data, struct uri *uri,
|
||||
dom_stack_callback_T push_callbacks[DOM_NODES],
|
||||
dom_stack_callback_T pop_callbacks[DOM_NODES]);
|
||||
struct dom_stack_callbacks *callbacks);
|
||||
|
||||
void done_sgml_parser(struct sgml_parser *parser);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user