[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