[prev in list] [next in list] [prev in thread] [next in thread] 

List:       elinks-cvs
Subject:    [ELinks] elinks (ECMASCRIPT) - jonas: Add support for navigator st...
From:       cvs () pasky ! ji ! cz
Date:       2004-02-28 18:47:56
Message-ID: 20040228184756.19732.qmail () machine ! sinus ! cz
[Download RAW message or body]

This is an automated notification of a change to the ELinks CVS tree.

Author: jonas
Module: elinks
   Tag: ECMASCRIPT
  Date: Sat Feb 28 18:47:56 2004 GMT

---- Log message:

Add support for navigator state data objects allocated in a separate array. Untested.


---- Files affected:

elinks/src/document/dom:
   navigator.h (1.1.2.21 -> 1.1.2.22) 
    http://cvsweb.elinks.or.cz/cvsweb.cgi/elinks/src/document/dom/navigator.h.diff?r1=1.1.2.21&r2=1.1.2.22&f=u
  navigator.c (1.1.2.30 -> 1.1.2.31) 
    http://cvsweb.elinks.or.cz/cvsweb.cgi/elinks/src/document/dom/navigator.c.diff?r1=1.1.2.30&r2=1.1.2.31&f=u
  renderer.c (1.1.2.63 -> 1.1.2.64) 
    http://cvsweb.elinks.or.cz/cvsweb.cgi/elinks/src/document/dom/renderer.c.diff?r1=1.1.2.63&r2=1.1.2.64&f=u
 elinks/src/document/sgml:
   parser.c (1.1.2.40 -> 1.1.2.41) 
    http://cvsweb.elinks.or.cz/cvsweb.cgi/elinks/src/document/sgml/parser.c.diff?r1=1.1.2.40&r2=1.1.2.41&f=u



---- Diffs:

 elinks/src/document/dom/navigator.c |   34 ++++++++++++++++++++++++++--
 elinks/src/document/dom/navigator.h |   11 +++++++--
 elinks/src/document/dom/renderer.c  |    2 -
 elinks/src/document/sgml/parser.c   |    2 -
 4 files changed, 43 insertions(+), 6 deletions(-)


Index: elinks/src/document/dom/navigator.h
diff -u elinks/src/document/dom/navigator.h:1.1.2.21 \
                elinks/src/document/dom/navigator.h:1.1.2.22
--- elinks/src/document/dom/navigator.h:1.1.2.21	Sat Feb 28 06:31:56 2004
+++ elinks/src/document/dom/navigator.h	Sat Feb 28 19:47:51 2004
@@ -53,7 +53,10 @@
 struct dom_navigator {
 	/* The stack of nodes and callbacks */
 	struct dom_navigator_state *states;
-	int depth;
+	size_t depth;
+
+	unsigned char *state_objects;
+	size_t object_size;
 
 	/* If some operation failed this member will signal the error code */
 	enum dom_exception_code exception;
@@ -95,7 +98,11 @@
 		if (((item) = &(nav)->states[(pos)]))
 
 /* Life cycle functions. */
-void init_dom_navigator(struct dom_navigator *navigator, void *data, \
dom_navigator_callback_T callbacks[DOM_NODES]); +
+/* The @object_size arg tells whether the navigator should allocate objects for each
+ * state to be assigned to the state's @data member. Zero means no state data should
+ * be allocated. */
+void init_dom_navigator(struct dom_navigator *navigator, void *data, \
dom_navigator_callback_T callbacks[DOM_NODES], size_t object_size);  void \
done_dom_navigator(struct dom_navigator *navigator);  
 /* Decends down to the given node making it the current parent */
Index: elinks/src/document/dom/navigator.c
diff -u elinks/src/document/dom/navigator.c:1.1.2.30 \
                elinks/src/document/dom/navigator.c:1.1.2.31
--- elinks/src/document/dom/navigator.c:1.1.2.30	Sat Feb 28 06:31:56 2004
+++ elinks/src/document/dom/navigator.c	Sat Feb 28 19:47:51 2004
@@ -29,15 +29,27 @@
 			       DOM_NAVIGATOR_STATE_GRANULARITY);
 }
 
+static inline unsigned char *
+realloc_dom_navigator_state_objects(struct dom_navigator *navigator)
+{
+	return mem_align_alloc(&navigator->state_objects,
+			       navigator->depth, navigator->depth + 1,
+			       navigator->object_size,
+			       DOM_NAVIGATOR_STATE_GRANULARITY);
+}
+
 void
 init_dom_navigator(struct dom_navigator *navigator, void *data,
-		   dom_navigator_callback_T callbacks[DOM_NODES])
+		   dom_navigator_callback_T callbacks[DOM_NODES],
+		   size_t object_size)
 {
 	assert(navigator);
 
 	memset(navigator, 0, sizeof(struct dom_navigator));
 
-	navigator->data = data;
+	navigator->data        = data;
+	navigator->object_size = object_size;
+
 	if (callbacks)
 		memcpy(navigator->callbacks, callbacks, DOM_NAVIGATOR_CALLBACKS_SIZE);
 }
@@ -48,6 +60,8 @@
 	assert(navigator);
 
 	if (navigator->states) mem_free(navigator->states);
+	if (navigator->state_objects) mem_free(navigator->state_objects);
+
 	memset(navigator, 0, sizeof(struct dom_navigator));
 }
 
@@ -70,6 +84,19 @@
 		return NULL;
 	}
 
+	if (navigator->object_size) {
+		unsigned char *state_objects;
+		size_t offset = navigator->depth * navigator->object_size;
+
+		state_objects = realloc_dom_navigator_state_objects(navigator);
+		if (!state_objects) {
+			done_dom_node(node);
+			return NULL;
+		}
+
+		states[navigator->depth].data = (void *) &state_objects[offset];
+	}
+
 	states[navigator->depth].node = node;
 
 	if (callback) {
@@ -102,6 +129,9 @@
 		va_end(args);
 	}
 
+	if (navigator->object_size && item->data) {
+		memset(item->data, 0, navigator->object_size);
+	}
 	del_dom_navigator_parent(navigator);
 }
 
Index: elinks/src/document/dom/renderer.c
diff -u elinks/src/document/dom/renderer.c:1.1.2.63 \
                elinks/src/document/dom/renderer.c:1.1.2.64
--- elinks/src/document/dom/renderer.c:1.1.2.63	Sat Feb 28 16:59:01 2004
+++ elinks/src/document/dom/renderer.c	Sat Feb 28 19:47:51 2004
@@ -608,7 +608,7 @@
 					  document->options.hard_assume);
 
 	init_dom_renderer(&renderer, document, cache_entry, root, convert_table);
-	init_dom_navigator(&navigator, &renderer, callbacks);
+	init_dom_navigator(&navigator, &renderer, callbacks, 0);
 
 	document->title   = stracpy("DOM renderer");
 	document->bgcolor = global_doc_opts->default_bg;
Index: elinks/src/document/sgml/parser.c
diff -u elinks/src/document/sgml/parser.c:1.1.2.40 \
                elinks/src/document/sgml/parser.c:1.1.2.41
--- elinks/src/document/sgml/parser.c:1.1.2.40	Sat Feb 28 04:32:22 2004
+++ elinks/src/document/sgml/parser.c	Sat Feb 28 19:47:51 2004
@@ -276,7 +276,7 @@
  
 	init_scanner(&scanner, &sgml_scanner_info, fr->data, fr->data + fr->length);
 	init_sgml_parser(&parser, document, ce, &scanner);
-	init_dom_navigator(&navigator, &parser, html_parser_callbacks);
+	init_dom_navigator(&navigator, &parser, html_parser_callbacks, 0);
 
 	parser.root = add_sgml_document(&navigator, document->url, strlen(document->url));
 	if (parser.root) {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic