1
0
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:
Jonas Fonseca 2005-12-20 19:20:04 +01:00 committed by Jonas Fonseca
parent 7679ccd881
commit 990c5e0a26
6 changed files with 85 additions and 91 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);