From 990c5e0a26121d0b7b44713449708801bba34dcf Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Tue, 20 Dec 2005 19:20:04 +0100 Subject: [PATCH] Combine DOM stack push and pop callbacks into one struct --- src/document/dom/renderer.c | 66 +++++++++++++++++---------------- src/document/dom/select.c | 74 ++++++++++++++++++------------------- src/document/dom/stack.c | 13 ++----- src/document/dom/stack.h | 14 ++++--- src/document/sgml/parser.c | 6 +-- src/document/sgml/parser.h | 3 +- 6 files changed, 85 insertions(+), 91 deletions(-) diff --git a/src/document/dom/renderer.c b/src/document/dom/renderer.c index 26ad3f3e..02f2f52b 100644 --- a/src/document/dom/renderer.c +++ b/src/document/dom/renderer.c @@ -741,36 +741,39 @@ 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] = { - /* */ NULL, - /* DOM_NODE_ELEMENT */ render_dom_element_source, - /* DOM_NODE_ATTRIBUTE */ render_dom_attribute_source, - /* DOM_NODE_TEXT */ render_dom_node_source, - /* DOM_NODE_CDATA_SECTION */ render_dom_node_source, - /* DOM_NODE_ENTITY_REFERENCE */ render_dom_node_source, - /* DOM_NODE_ENTITY */ render_dom_node_source, - /* DOM_NODE_PROC_INSTRUCTION */ render_dom_element_source, - /* DOM_NODE_COMMENT */ render_dom_node_source, - /* DOM_NODE_DOCUMENT */ NULL, - /* 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] = { - /* */ NULL, - /* DOM_NODE_ELEMENT */ render_dom_element_end_source, - /* DOM_NODE_ATTRIBUTE */ NULL, - /* DOM_NODE_TEXT */ NULL, - /* DOM_NODE_CDATA_SECTION */ NULL, - /* DOM_NODE_ENTITY_REFERENCE */ NULL, - /* DOM_NODE_ENTITY */ NULL, - /* DOM_NODE_PROC_INSTRUCTION */ NULL, - /* DOM_NODE_COMMENT */ NULL, - /* DOM_NODE_DOCUMENT */ NULL, - /* DOM_NODE_DOCUMENT_TYPE */ NULL, - /* DOM_NODE_DOCUMENT_FRAGMENT */ NULL, - /* DOM_NODE_NOTATION */ NULL, +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, + /* DOM_NODE_TEXT */ render_dom_node_source, + /* DOM_NODE_CDATA_SECTION */ render_dom_node_source, + /* DOM_NODE_ENTITY_REFERENCE */ render_dom_node_source, + /* DOM_NODE_ENTITY */ render_dom_node_source, + /* DOM_NODE_PROC_INSTRUCTION */ render_dom_element_source, + /* DOM_NODE_COMMENT */ render_dom_node_source, + /* DOM_NODE_DOCUMENT */ NULL, + /* DOM_NODE_DOCUMENT_TYPE */ render_dom_node_source, + /* DOM_NODE_DOCUMENT_FRAGMENT */ render_dom_node_source, + /* DOM_NODE_NOTATION */ render_dom_node_source, + }, + /* Pop: */ + { + /* */ NULL, + /* DOM_NODE_ELEMENT */ render_dom_element_end_source, + /* DOM_NODE_ATTRIBUTE */ NULL, + /* DOM_NODE_TEXT */ NULL, + /* DOM_NODE_CDATA_SECTION */ NULL, + /* DOM_NODE_ENTITY_REFERENCE */ NULL, + /* DOM_NODE_ENTITY */ NULL, + /* DOM_NODE_PROC_INSTRUCTION */ NULL, + /* DOM_NODE_COMMENT */ NULL, + /* DOM_NODE_DOCUMENT */ NULL, + /* 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); diff --git a/src/document/dom/select.c b/src/document/dom/select.c index ac74c285..186465aa 100644 --- a/src/document/dom/select.c +++ b/src/document/dom/select.c @@ -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,37 +790,39 @@ 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] = { - /* */ NULL, - /* DOM_NODE_ELEMENT */ dom_select_push_element, - /* DOM_NODE_ATTRIBUTE */ NULL, - /* DOM_NODE_TEXT */ dom_select_push_text, - /* DOM_NODE_CDATA_SECTION */ dom_select_push_text, - /* DOM_NODE_ENTITY_REFERENCE */ dom_select_push_text, - /* DOM_NODE_ENTITY */ NULL, - /* DOM_NODE_PROC_INSTRUCTION */ NULL, - /* DOM_NODE_COMMENT */ NULL, - /* DOM_NODE_DOCUMENT */ NULL, - /* DOM_NODE_DOCUMENT_TYPE */ NULL, - /* DOM_NODE_DOCUMENT_FRAGMENT */ NULL, - /* DOM_NODE_NOTATION */ NULL, -}; - -dom_stack_callback_T dom_select_pop_callbacks[DOM_NODES] = { - /* */ NULL, - /* DOM_NODE_ELEMENT */ dom_select_pop_element, - /* DOM_NODE_ATTRIBUTE */ NULL, - /* DOM_NODE_TEXT */ NULL, - /* DOM_NODE_CDATA_SECTION */ NULL, - /* DOM_NODE_ENTITY_REFERENCE */ NULL, - /* DOM_NODE_ENTITY */ NULL, - /* DOM_NODE_PROC_INSTRUCTION */ NULL, - /* DOM_NODE_COMMENT */ NULL, - /* DOM_NODE_DOCUMENT */ NULL, - /* DOM_NODE_DOCUMENT_TYPE */ NULL, - /* DOM_NODE_DOCUMENT_FRAGMENT */ NULL, - /* DOM_NODE_NOTATION */ NULL, +static struct dom_stack_callbacks dom_select_callbacks = { + /* Push: */ + { + /* */ NULL, + /* DOM_NODE_ELEMENT */ dom_select_push_element, + /* DOM_NODE_ATTRIBUTE */ NULL, + /* DOM_NODE_TEXT */ dom_select_push_text, + /* DOM_NODE_CDATA_SECTION */ dom_select_push_text, + /* DOM_NODE_ENTITY_REFERENCE */ dom_select_push_text, + /* DOM_NODE_ENTITY */ NULL, + /* DOM_NODE_PROC_INSTRUCTION */ NULL, + /* DOM_NODE_COMMENT */ NULL, + /* DOM_NODE_DOCUMENT */ NULL, + /* DOM_NODE_DOCUMENT_TYPE */ NULL, + /* DOM_NODE_DOCUMENT_FRAGMENT */ NULL, + /* DOM_NODE_NOTATION */ NULL, + }, + /* Pop: */ + { + /* */ NULL, + /* DOM_NODE_ELEMENT */ dom_select_pop_element, + /* DOM_NODE_ATTRIBUTE */ NULL, + /* DOM_NODE_TEXT */ NULL, + /* DOM_NODE_CDATA_SECTION */ NULL, + /* DOM_NODE_ENTITY_REFERENCE */ NULL, + /* DOM_NODE_ENTITY */ NULL, + /* DOM_NODE_PROC_INSTRUCTION */ NULL, + /* DOM_NODE_COMMENT */ NULL, + /* DOM_NODE_DOCUMENT */ NULL, + /* 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; diff --git a/src/document/dom/stack.c b/src/document/dom/stack.c index 510ee374..a6170e96 100644 --- a/src/document/dom/stack.c +++ b/src/document/dom/stack.c @@ -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); diff --git a/src/document/dom/stack.h b/src/document/dom/stack.h index 373cfe96..7db887bf 100644 --- a/src/document/dom/stack.h +++ b/src/document/dom/stack.h @@ -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); diff --git a/src/document/sgml/parser.c b/src/document/sgml/parser.c index a916f877..9a083066 100644 --- a/src/document/sgml/parser.c +++ b/src/document/sgml/parser.c @@ -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); diff --git a/src/document/sgml/parser.h b/src/document/sgml/parser.h index 6cfdf1e0..e3ae0544 100644 --- a/src/document/sgml/parser.h +++ b/src/document/sgml/parser.h @@ -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);