Annotation of DOM/Document.c, revision 1.3

1.1       daniel      1: /*
                      2:  * Document.c : implementation of the Document interface as defined by
                      3:  *       Document Object Model (Core) Level 1
                      4:  *       http://www.w3.org/TR/WD-DOM/level-one-core.html
                      5:  * 
                      6:  * Daniel.Veillard@w3.org
                      7:  *
1.3     ! daniel      8:  * $Id: Document.c,v 1.2 1998/06/14 03:20:14 daniel Exp $
1.1       daniel      9:  */
                     10: 
                     11: #include "config.h"
                     12: #include <stdio.h>
1.2       daniel     13: #include <malloc.h>
1.3     ! daniel     14: #include <string.h>
1.1       daniel     15: #include "Document.h"
1.3     ! daniel     16: #include "Element.h"
        !            17: #include "Text.h"
        !            18: #include "Comment.h"
        !            19: #include "PI.h"
        !            20: #include "Attribute.h"
        !            21: #include "AttributeList.h"
        !            22: #include "TreeIterator.h"
        !            23: #include "NodeIterator.h"
1.2       daniel     24: 
                     25: /*
1.3     ! daniel     26:  * create an element of a given type and associate the set of attributes.
1.2       daniel     27:  */
                     28: domElementPtr createElement(domDocumentPtr doc, char *tagName,
                     29:                             domAttributeListPtr attributes) {
1.3     ! daniel     30:     domElementPtr ret;
        !            31: 
        !            32:     if (doc == NULL) return(NULL);
        !            33:     if (tagName == NULL) return(NULL);
        !            34:     ret = (domElementPtr) malloc(sizeof(domElement));
        !            35:     if (ret == NULL) {
        !            36:         fprintf(stderr, "createElement : out of memory\n");
        !            37:        return(NULL);
        !            38:     }
        !            39:     memset(ret, 0, sizeof(domElement));
        !            40:     ret->doc = doc;
        !            41:     ret->type = DOM_NODE_ELEMENT;
        !            42:     ret->name = strdup(tagName);
        !            43:     if (attributes != NULL) {
        !            44:         domAttributePtr cur;
        !            45: 
        !            46:         if (attributes->doc != doc) {
        !            47:            fprintf(stderr, 
        !            48:      "Trying to use attributes from different document in createElement\n");
        !            49:             return(ret);
        !            50:        }
        !            51:         /*
        !            52:         * Prune the attribute list in the element attribute list.
        !            53:         */
        !            54:         cur = attributes->list;
        !            55:         ret->attributes = cur;
        !            56:        while (cur != NULL) {
        !            57:            cur->parent = ret;
        !            58:            if (cur->next == NULL) break;
        !            59:            cur = cur->next;
        !            60:        }
        !            61:        ret->lastattribute = cur;
        !            62:        attributes->elem = ret;
        !            63:     }
        !            64: 
        !            65:     return(ret);
        !            66: }
        !            67: 
        !            68: /*
        !            69:  * Destroy a Element node.
        !            70:  */
        !            71: void destroyElement(domElementPtr old) {
        !            72:     if (old == NULL) return;
        !            73:     if (old->type != DOM_NODE_ELEMENT) {
        !            74:         fprintf(stderr, "destroyElement: invalid object %d\n", old->type);
        !            75:        return;
        !            76:     }
        !            77: 
        !            78:     memset(old, 0, sizeof(domElement));
        !            79:     old->name = (void *) 0xdeadbeef;
        !            80:     old->value = (void *) 0xdeadbeef;
        !            81:     old->parent = (void *) 0xdeadbeef;
        !            82:     old->childs = (void *) 0xdeadbeef;
        !            83:     old->prev = (void *) 0xdeadbeef;
        !            84:     old->next = (void *) 0xdeadbeef;
        !            85:     free(old);
1.2       daniel     86: }
                     87: 
                     88: /*
1.3     ! daniel     89:  * Create a Text node.
1.2       daniel     90:  */
                     91: domTextPtr createTextNode(domDocumentPtr doc, char *data) {
1.3     ! daniel     92:     domTextPtr ret;
        !            93: 
        !            94:     if (doc == NULL) return(NULL);
        !            95:     if (data == NULL) return(NULL);
        !            96:     ret = (domTextPtr) malloc(sizeof(domText));
        !            97:     if (ret == NULL) {
        !            98:         fprintf(stderr, "createText : out of memory\n");
        !            99:        return(NULL);
        !           100:     }
        !           101:     memset(ret, 0, sizeof(domText));
        !           102:     ret->doc = doc;
        !           103:     ret->type = DOM_NODE_TEXT;
        !           104:     ret->value = strdup(data);
        !           105: 
        !           106:     return(ret);
        !           107: }
        !           108: 
        !           109: /*
        !           110:  * Destroy a Text node.
        !           111:  */
        !           112: void destroyText(domTextPtr old) {
        !           113:     if (old == NULL) return;
        !           114:     if (old->type != DOM_NODE_TEXT) {
        !           115:         fprintf(stderr, "destroyText: invalid object %d\n", old->type);
        !           116:        return;
        !           117:     }
        !           118: 
        !           119:     memset(old, 0, sizeof(domText));
        !           120:     old->name = (void *) 0xdeadbeef;
        !           121:     old->value = (void *) 0xdeadbeef;
        !           122:     old->parent = (void *) 0xdeadbeef;
        !           123:     old->childs = (void *) 0xdeadbeef;
        !           124:     old->prev = (void *) 0xdeadbeef;
        !           125:     old->next = (void *) 0xdeadbeef;
        !           126:     free(old);
1.2       daniel    127: }
                    128: 
                    129: /*
1.3     ! daniel    130:  * Create a comment node.
1.2       daniel    131:  */
                    132: domCommentPtr createCommentNode(domDocumentPtr doc, char *data) {
1.3     ! daniel    133:     domCommentPtr ret;
        !           134: 
        !           135:     if (doc == NULL) return(NULL);
        !           136:     if (data == NULL) return(NULL);
        !           137:     ret = (domCommentPtr) malloc(sizeof(domComment));
        !           138:     if (ret == NULL) {
        !           139:         fprintf(stderr, "createComment : out of memory\n");
        !           140:        return(NULL);
        !           141:     }
        !           142:     memset(ret, 0, sizeof(domComment));
        !           143:     ret->doc = doc;
        !           144:     ret->type = DOM_NODE_COMMENT;
        !           145:     ret->value = strdup(data);
        !           146: 
        !           147:     return(ret);
        !           148: }
        !           149: 
        !           150: /*
        !           151:  * Destroy a Comment node.
        !           152:  */
        !           153: void destroyComment(domCommentPtr old) {
        !           154:     if (old == NULL) return;
        !           155:     if (old->type != DOM_NODE_COMMENT) {
        !           156:         fprintf(stderr, "destroyComment: invalid object %d\n", old->type);
        !           157:        return;
        !           158:     }
        !           159: 
        !           160:     memset(old, 0, sizeof(domComment));
        !           161:     old->name = (void *) 0xdeadbeef;
        !           162:     old->value = (void *) 0xdeadbeef;
        !           163:     old->parent = (void *) 0xdeadbeef;
        !           164:     old->childs = (void *) 0xdeadbeef;
        !           165:     old->prev = (void *) 0xdeadbeef;
        !           166:     old->next = (void *) 0xdeadbeef;
        !           167:     free(old);
1.2       daniel    168: }
                    169: 
                    170: /*
1.3     ! daniel    171:  * Create a PI node.
1.2       daniel    172:  */
                    173: domPIPtr createPINode(domDocumentPtr doc, char *name, char *data) {
1.3     ! daniel    174:     domPIPtr ret;
        !           175: 
        !           176:     if (doc == NULL) return(NULL);
        !           177:     if (name == NULL) return(NULL);
        !           178:     if (data == NULL) return(NULL);
        !           179:     ret = (domPIPtr) malloc(sizeof(domPI));
        !           180:     if (ret == NULL) {
        !           181:         fprintf(stderr, "createPI : out of memory\n");
        !           182:        return(NULL);
        !           183:     }
        !           184:     memset(ret, 0, sizeof(domPI));
        !           185:     ret->doc = doc;
        !           186:     ret->type = DOM_NODE_PI;
        !           187:     ret->name = strdup(name);
        !           188:     ret->value = strdup(data);
        !           189: 
        !           190:     return(ret);
        !           191: }
        !           192: 
        !           193: /*
        !           194:  * Destroy a PI node.
        !           195:  */
        !           196: void destroyPI(domPIPtr old) {
        !           197:     if (old == NULL) return;
        !           198:     if (old->type != DOM_NODE_PI) {
        !           199:         fprintf(stderr, "destroyPI: invalid object %d\n", old->type);
        !           200:        return;
        !           201:     }
        !           202: 
        !           203:     memset(old, 0, sizeof(domPI));
        !           204:     old->name = (void *) 0xdeadbeef;
        !           205:     old->value = (void *) 0xdeadbeef;
        !           206:     old->parent = (void *) 0xdeadbeef;
        !           207:     old->childs = (void *) 0xdeadbeef;
        !           208:     old->prev = (void *) 0xdeadbeef;
        !           209:     old->next = (void *) 0xdeadbeef;
        !           210:     free(old);
1.2       daniel    211: }
                    212: 
                    213: /*
1.3     ! daniel    214:  * Create an Attribute, it's not yet linked to any element.
1.2       daniel    215:  */
                    216: domAttributePtr createAttribute(domDocumentPtr doc, char *name,
                    217:                                         char *value) {
1.3     ! daniel    218:     domAttributePtr ret;
        !           219: 
        !           220:     if (doc == NULL) return(NULL);
        !           221:     if (name == NULL) return(NULL);
        !           222:     ret = (domAttributePtr) malloc(sizeof(domAttribute));
        !           223:     if (ret == NULL) {
        !           224:         fprintf(stderr, "createAttribute : out of memory\n");
        !           225:        return(NULL);
        !           226:     }
        !           227:     memset(ret, 0, sizeof(domAttribute));
        !           228:     ret->doc = doc;
        !           229:     ret->type = DOM_NODE_ATTRIBUTE;
        !           230:     ret->name = strdup(name);
        !           231:     if (value == NULL)
        !           232:         ret->value = NULL;
        !           233:     else
        !           234:        ret->value = strdup(value);
        !           235: 
1.2       daniel    236:     return(NULL);
                    237: }
                    238: 
                    239: /*
1.3     ! daniel    240:  * Destroy an Attribute.
        !           241:  */
        !           242: void destroyAttribute(domAttributePtr old) {
        !           243:     if (old == NULL) return;
        !           244:     if (old->type != DOM_NODE_ATTRIBUTE) {
        !           245:         fprintf(stderr, "destroyAttribute: invalid object %d\n", old->type);
        !           246:        return;
        !           247:     }
        !           248: 
        !           249:     memset(old, 0, sizeof(domAttribute));
        !           250:     old->name = (void *) 0xdeadbeef;
        !           251:     old->value = (void *) 0xdeadbeef;
        !           252:     old->parent = (void *) 0xdeadbeef;
        !           253:     old->childs = (void *) 0xdeadbeef;
        !           254:     old->prev = (void *) 0xdeadbeef;
        !           255:     old->next = (void *) 0xdeadbeef;
        !           256:     free(old);
        !           257: }
        !           258: 
        !           259: /*
        !           260:  * Create an Attribute List. At this moment the Element owning
        !           261:  * them probably hasn't being created.
1.2       daniel    262:  */
                    263: domAttributeListPtr createAttributeList(domDocumentPtr doc) {
1.3     ! daniel    264:     domAttributeListPtr ret;
        !           265: 
        !           266:     if (doc == NULL) return(NULL);
        !           267:     ret = (domAttributeListPtr) malloc(sizeof(domAttributeList));
        !           268:     if (ret == NULL) {
        !           269:         fprintf(stderr, "createAttributeList : out of memory\n");
        !           270:        return(NULL);
        !           271:     }
        !           272:     memset(ret, 0, sizeof(domAttributeList));
        !           273:     ret->doc = doc;
        !           274:     ret->elem = NULL;
        !           275:     ret->list = NULL;
        !           276: 
1.2       daniel    277:     return(NULL);
                    278: }
                    279: 
                    280: /*
1.3     ! daniel    281:  * Destroy an AttributeList: we don't destroy the list itself, unless
        !           282:  *       there is no Element attached to the list (e.g. the pasring of
        !           283:  *       a block failed and the Element wasn't created).
        !           284:  */
        !           285: void destroyAttributeList(domAttributeListPtr old) {
        !           286:     if (old == NULL) return;
        !           287: 
        !           288:     if (old->elem == NULL) {
        !           289:         domAttributePtr cur, next;
        !           290:        cur = old->list;
        !           291:        while (cur != NULL) {
        !           292:            next = cur->next;
        !           293:             destroyAttribute(cur);
        !           294:            cur = next;
        !           295:        }
        !           296:     }
        !           297:     old->doc = (void *) 0xdeadbeef;
        !           298:     old->elem = (void *) 0xdeadbeef;
        !           299:     old->list = (void *) 0xdeadbeef;
        !           300:     free(old);
        !           301: }
        !           302: 
        !           303: /*
        !           304:  * Create a TreeIterator, in this implementation, TreeIterator and NodeIterator
        !           305:  *        share exactly the same structure (and most of the code too !).
1.2       daniel    306:  */
                    307: domTreeIteratorPtr createTreeIterator(domDocumentPtr doc) {
1.3     ! daniel    308:     domTreeIteratorPtr ret;
        !           309: 
        !           310:     if (doc == NULL) return(NULL);
        !           311:     if (doc->documentElement == NULL) return(NULL);
        !           312:     ret = domNodeIteratorCreate(doc->documentElement);
1.2       daniel    313:     return(NULL);
1.3     ! daniel    314: }
        !           315: 
        !           316: /*
        !           317:  * Destroy a TreeIterator.
        !           318:  */
        !           319: void destroyTreeIterator(domTreeIteratorPtr old) {
        !           320:     if (old == NULL) return;
        !           321:     domNodeIteratorDestroy(old);
1.2       daniel    322: }
                    323: 
                    324: /*
                    325:  * 
                    326:  */
                    327: domNodeIteratorPtr getElementsByTagName(domDocumentPtr doc, char *tagname) {
                    328:     /* TODO !!!! */
                    329:     return(NULL);
                    330: }
1.1       daniel    331: 

Webmaster