Only in domc/: libdomc.a Only in domc/: libdomc.so.0.7.1 diff -r -U3 domc-0.7.1/Makefile domc/Makefile --- domc-0.7.1/Makefile 2004-08-05 22:32:24.000000000 -0600 +++ domc/Makefile 2004-09-01 11:00:30.657569070 -0600 @@ -1,7 +1,8 @@ -prefix = /usr/local -includedir = $(prefix)/include -libdir = $(prefix)/lib -mandir = $(prefix)/man +_EXTRA = -I../libmba/src/ -L../libmba/ +prefix = ./ +includedir = $(prefix) +libdir = $(prefix) +mandir = $(prefix) CC = gcc LIBNAME = domc MAJVERSION = 0.7 @@ -11,7 +12,7 @@ SOVERSION = lib$(LIBNAME).so.$(MAJVERSION) DISTRO = $(LIBNAME)-$(MINVERSION) RPM_OPT_FLAGS = -O2 -CFLAGS = -Wall -W -DMSGNO $(RPM_OPT_FLAGS) -I$(includedir) -L$(libdir) +CFLAGS = -Wall -W -DMSGNO $(RPM_OPT_FLAGS) $(_EXTRA) -I$(includedir) -L$(libdir) #CFLAGS = -Wall -W -DMSGNO -I$(includedir) -L$(libdir) $(RPM_OPT_FLAGS) -ansi -pedantic -Wbad-function-cast -Wcast-align -Wcast-qual -Wchar-subscripts -Winline -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wredundant-decls -Wshadow -Wstrict-prototypes -Wwrite-strings -Wtraditional -Wconversion -Waggregate-return -Wno-parentheses OBJS = src/expatls.o src/events.o src/node.o src/nodelist.o src/namednodemap.o src/dom.o src/timestamp.o src/wcwidth.o src/mbs.o MAN = DOM_CharacterData.3m.gz DOM_Document.3m.gz DOM_Element.3m.gz DOM_Implementation.3m.gz DOM_NamedNodeMap.3m.gz DOM_Node.3m.gz DOM_NodeList.3m.gz DOM_Text.3m.gz @@ -19,7 +20,7 @@ all: $(ARNAME)($(OBJS)) $(SONAME) src/defines.h $(SONAME): $(OBJS) - $(CC) -shared $(OBJS) -L$(libdir) -lmba -lexpat -Wl,-h,$(SOVERSION) -o $(SONAME) + $(CC) -shared $(OBJS) $(_EXTRA) -L$(libdir) -lmba -Wl,-h,$(SOVERSION) -o $(SONAME) .c.a: $(CC) $(CFLAGS) -c -o $*.o $< @@ -47,5 +48,5 @@ clean: rm -f $(OBJS) $(ARNAME) $(SONAME) $(includedir)/domc.h $(libdir)/$(ARNAME) $(libdir)/$(SONAME) $(libdir)/$(SOVERSION) $(libdir)/lib$(LIBNAME).so $(DISTRO).zip - cd $(mandir)/man3 && rm -f $(MAN) + # cd $(mandir)/man3 && rm -f $(MAN) diff -r -U3 domc-0.7.1/Makefile.msvc domc/Makefile.msvc --- domc-0.7.1/Makefile.msvc 2004-08-04 17:20:02.000000000 -0600 +++ domc/Makefile.msvc 2004-09-01 11:00:30.659568751 -0600 @@ -1,22 +1,29 @@ !include -LIBMBA=..\libmba-0.8.9 -EXPAT=..\Expat-1.95.5 +LIBMBA=..\libmba +# EXPAT=..\Expat-1.95.5 # For i18n support in domc the encdec library is required. # Specify were the encdec library is below, change HAVE_ENCDEC to 1 # in src\defines.h and add /LIBPATH:$(ENCDEC) encdec.lib to the # .dll link command. -ENCDEC=..\encdec-0.3.7 +# ENCDEC=..\encdec-0.3.7 OBJS=src\expatls.obj src\events.obj src\timestamp.obj src\dom.obj src\node.obj src\namednodemap.obj src\nodelist.obj src\wcwidth.obj +# Debug flags +# CFLAGS=$(cflags) /MLd /GZ /Gm /ZI /Od /D_DEBUG -domc.dll: $(OBJS) - $(link) /INCREMENTAL:NO /NOLOGO /LIBPATH:$(EXPAT)\Libs /LIBPATH:$(LIBMBA) /LIBPATH:$(ENCDEC) libexpat.lib libmba.lib encdec.lib /DEF:domc.def /OUT:domc.dll -entry:_DllMainCRTStartup@12 -dll $(OBJS) +# Normal Flags +CFLAGS=$(cflags) /ML + +all: domc.lib + +# domc.dll: $(OBJS) +# $(link) /INCREMENTAL:NO /NOLOGO /LIBPATH:$(EXPAT)\Libs /LIBPATH:$(LIBMBA) /LIBPATH:$(ENCDEC) libexpat.lib libmba.lib encdec.lib /DEF:domc.def /OUT:domc.dll -entry:_DllMainCRTStartup@12 -dll $(OBJS) domc.lib: $(OBJS) $(implib) -machine:$(CPU) -out:domc.lib $(OBJS) .c.obj: - $(cc) $(cflags) /I$(EXPAT)\Source\lib /I$(ENCDEC)\src /I$(LIBMBA)\src /Fo$@ $*.c + $(cc) $(CFLAGS) /I$(LIBMBA)\src /Fo$@ $*.c clean: del domc.dll domc.lib domc.exp $(OBJS) diff -r -U3 domc-0.7.1/src/defines.h domc/src/defines.h --- domc-0.7.1/src/defines.h 2003-03-22 16:35:36.000000000 -0700 +++ domc/src/defines.h 2004-09-01 11:00:30.673566512 -0600 @@ -7,7 +7,7 @@ #define HAVE_ENCDEC 0 #define HAVE_STRDUP 1 #define HAVE_STRNLEN 0 -#define HAVE_EXPAT 195 +#define HAVE_EXPAT 0 #define HAVE_MBSTATE 0 #define HAVE_WCWIDTH 1 #define HAVE_SNPRINTF 1 @@ -21,7 +21,7 @@ #define HAVE_ENCDEC 0 #define HAVE_STRDUP 1 #define HAVE_STRNLEN 0 -#define HAVE_EXPAT 195 +#define HAVE_EXPAT 0 #define HAVE_MBSTATE 0 #define HAVE_WCWIDTH 0 #define HAVE_SNPRINTF 0 @@ -35,7 +35,7 @@ #define HAVE_ENCDEC 0 #define HAVE_STRDUP 1 #define HAVE_STRNLEN 1 -#define HAVE_EXPAT 195 +#define HAVE_EXPAT 0 #define HAVE_MBSTATE 1 #define HAVE_WCWIDTH 1 #define HAVE_SNPRINTF 1 diff -r -U3 domc-0.7.1/src/domc.h domc/src/domc.h --- domc-0.7.1/src/domc.h 2004-08-04 17:32:30.000000000 -0600 +++ domc/src/domc.h 2004-09-01 11:00:30.675566192 -0600 @@ -41,6 +41,13 @@ #include #endif +/* Enable this for hashing and fast access to large child node lists */ +#define FAST_NODELIST 1 + +#if FAST_NODELIST +#include +#endif + /* DOM_String */ @@ -185,6 +192,8 @@ DOM_String *data; } ProcessingInstruction; } u; + unsigned int rtfxRefCount; /* Reference counting added for RTFX */ + void* userData; /* User data added for RTFX */ }; DOM_Node *DOM_Node_insertBefore(DOM_Node *node, DOM_Node *newChild, DOM_Node *refChild); @@ -212,6 +221,10 @@ NodeEntry *last; unsigned short filter; struct DOM_NodeList *list; /* Used for entities and notations */ +#if FAST_NODELIST + struct hashmap* _map; +#endif + unsigned int rtfxRefCount; /* Reference counting added for RTFX */ }; DOM_Node *DOM_NodeList_item(const DOM_NodeList *nl, int index); @@ -286,8 +299,10 @@ * described in the latest W3C drafts at all. */ +#if HAVE_EXPAT > 0 int DOM_DocumentLS_load(DOM_DocumentLS *this, const char *uri); int DOM_DocumentLS_fread(DOM_DocumentLS *this, FILE *stream); +#endif int DOM_DocumentLS_save(DOM_DocumentLS *this, const char *uri, const DOM_Node *node); int DOM_DocumentLS_fwrite(const DOM_DocumentLS *this, FILE *stream); Only in domc/src: dom.o Only in domc/src: events.o diff -r -U3 domc-0.7.1/src/expatls.c domc/src/expatls.c --- domc-0.7.1/src/expatls.c 2004-08-04 17:28:49.000000000 -0600 +++ domc/src/expatls.c 2004-09-01 11:01:50.710764140 -0600 @@ -70,6 +70,14 @@ DOM_Node *Document_createNode(DOM_Document *doc, unsigned short nodeType); +static int +fputds(const DOM_String *s, FILE *stream) +{ + return fputs(s, stream); +} + +#if HAVE_EXPAT > 0 + struct user_data { DOM_String *buf; size_t siz; @@ -115,14 +123,6 @@ return n; } -static int -fputds(const DOM_String *s, FILE *stream) -{ - return fputs(s, stream); -} - -#if HAVE_EXPAT > 0 - static void xmldecl_fn(void *userData, const XML_Char *version, const XML_Char *encoding, int standalone) { @@ -711,7 +711,7 @@ size_t l; while (*s) { - l = strcspn(s, "<>&\"'"); + l = strcspn(s, "<>&\""); if (l > 0) { fwrite((void*)s, 1, sizeof(DOM_String) * l, stream); s += l; @@ -731,9 +731,6 @@ case '"': fputs(""", stream); break; - case '\'': - fputs("&squot;", stream); - break; default: AMSG(""); break; @@ -853,11 +850,6 @@ fputs(" version=\"", stream); fputds(node->u.Document.version ? node->u.Document.version : "1.0", stream); fputc('\"', stream); -#ifdef CODESET - fputs(" encoding=\"", stream); - fputs(nl_langinfo(CODESET), stream); - fputc('\"', stream); -#endif if (node->u.Document.standalone != 0) { fputs(" standalone=\"yes\"", stream); } Only in domc/src: expatls.o Only in domc/src: mbs.o Only in domc/src: namednodemap.o diff -r -U3 domc-0.7.1/src/node.c domc/src/node.c --- domc-0.7.1/src/node.c 2004-08-04 17:29:12.000000000 -0600 +++ domc/src/node.c 2004-09-01 11:00:30.691563633 -0600 @@ -337,7 +337,6 @@ DOM_Node * DOM_Node_replaceChild(DOM_Node *node, DOM_Node *newChild, DOM_Node *oldChild) { - DOM_Node *tmp; DOM_MutationEvent evt; if (node == NULL || newChild == NULL || oldChild == NULL) { @@ -352,12 +351,7 @@ return NULL; } - for (tmp = node->firstChild; - tmp != NULL && tmp != oldChild; - tmp = tmp->nextSibling) { - ; - } - if (tmp != oldChild) { + if (!NodeList_exists(node->childNodes, oldChild)) { DOM_Exception = DOM_NOT_FOUND_ERR; PMNO(DOM_Exception); return NULL; diff -r -U3 domc-0.7.1/src/nodelist.c domc/src/nodelist.c --- domc-0.7.1/src/nodelist.c 2004-08-04 17:19:25.000000000 -0600 +++ domc/src/nodelist.c 2004-09-01 11:00:30.711560434 -0600 @@ -30,6 +30,68 @@ #include "domc.h" #include "dom.h" +#if FAST_NODELIST + +/* The number of nodes required in a list before hashing starts */ +#define FAST_FILLFACTOR 16 + +static void _removeFromMap(DOM_NodeList* nl, DOM_Node* key) +{ + if (nl->_map) { + if (hashmap_get(nl->_map, key) != NULL) { + void* d = NULL; + void* k = key; + hashmap_remove(nl->_map, &k, &d); + } + } +} + +static int _addToMap(DOM_NodeList* nl, DOM_Node* key, NodeEntry* val) +{ + if (!nl->_map && nl->length > FAST_FILLFACTOR) { + + nl->_map = hashmap_new(0, NULL, NULL, NULL); + + /* Hash what we currently have */ + if (nl->_map) { + NodeEntry *e = nl->first; + while (e) { + _addToMap(nl, e->node, e); + e = e->next; + } + } + } + + if (nl->_map) { + _removeFromMap(nl, key); + + if (hashmap_put(nl->_map, key, val) == -1) { + DOM_Exception = errno; + return -1; + } + } + + return 0; +} + +#endif + +static NodeEntry* _lookupNode(DOM_NodeList* nl, DOM_Node* node) +{ + NodeEntry* s; + +#if FAST_NODELIST + if (nl->_map) + s = (NodeEntry*)hashmap_get(nl->_map, node); + else +#endif + for (s = nl->first; s != NULL && s->node != node; s = s->next) { + ; + } + + return s; +} + /* NodeList */ @@ -63,6 +125,12 @@ free(tmp); } } + +#if FAST_NODELIST + if(nl->_map) + hashmap_del(nl->_map, NULL, NULL, NULL); +#endif + free(nl); } } @@ -110,6 +178,7 @@ NodeList_insert(DOM_NodeList *nl, DOM_Node *newChild, DOM_Node *refChild) { NodeEntry *e; + NodeEntry *s = NULL; if (nl == NULL) { DOM_Exception = NULL_POINTER_ERR; @@ -122,12 +191,30 @@ return NULL; } + if(refChild != NULL) + { + s = _lookupNode(nl, refChild); + if(s == NULL || s->node != refChild) { + DOM_Exception = DOM_NOT_FOUND_ERR; + PMNO(DOM_Exception); + return NULL; + } + } + if ((e = calloc(sizeof *e, 1)) == NULL) { DOM_Exception = errno; PMNO(DOM_Exception); return NULL; } +#if FAST_NODELIST + if (_addToMap(nl, newChild, e) == -1) { + PMNO(DOM_Exception); + free(e); + return NULL; + } +#endif + e->node = newChild; if (nl->length == 0) { nl->first = nl->last = e; @@ -136,18 +223,6 @@ nl->last->next = e; nl->last = e; } else { - NodeEntry *s; - - for (s = nl->first; s != NULL && s->node != refChild; s = s->next) { - ; - } - if (s == NULL || s->node != refChild) { - DOM_Exception = DOM_NOT_FOUND_ERR; - PMNO(DOM_Exception); - free(e); - return NULL; - } - e->prev = s->prev; e->next = s; if (s == nl->first) { @@ -184,14 +259,21 @@ return NULL; } - for (e = nl->first; e != NULL && e->node != oldChild; e = e->next) { - ; - } + e = _lookupNode(nl, oldChild); if (e == NULL) { DOM_Exception = DOM_NOT_FOUND_ERR; PMNO(DOM_Exception); return NULL; } + +#if FAST_NODELIST + _removeFromMap(nl, oldChild); + if(_addToMap(nl, newChild, e) == -1) { + PMNO(DOM_Exception); + return NULL; + } +#endif + e->node = newChild; if (oldChild->nodeType == DOM_ATTRIBUTE_NODE) { @@ -216,12 +298,14 @@ return NULL; } - for (e = nl->first; e != NULL && e->node != oldChild; e = e->next) { - ; - } + e = _lookupNode(nl, oldChild); if (e == NULL) { return NULL; } + +#if FAST_NODELIST + _removeFromMap(nl, oldChild); +#endif if (nl->first == nl->last) { nl->first = nl->last = NULL; @@ -269,6 +353,14 @@ return NULL; } +#if FAST_NODELIST + if(_addToMap(nl, newChild, e) == -1) { + PMNO(DOM_Exception); + free(e); + return NULL; + } +#endif + e->node = newChild; if (nl->first == NULL) { nl->first = nl->last = e; @@ -311,9 +403,7 @@ return 0; } - for (e = nl->first; e != NULL && e->node != child; e = e->next) { - ; - } + e = _lookupNode(nl, child); return e != NULL; } Only in domc/src: nodelist.o Only in domc/src: node.o Only in domc/src: timestamp.o Only in domc/src: wcwidth.o