• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3   *
4   * Redistribution and use in source and binary forms, with or without
5   * modification, are permitted provided that the following conditions
6   * are met:
7   * 1. Redistributions of source code must retain the above copyright
8   *    notice, this list of conditions and the following disclaimer.
9   * 2. Redistributions in binary form must reproduce the above copyright
10   *    notice, this list of conditions and the following disclaimer in the
11   *    documentation and/or other materials provided with the distribution.
12   *
13   * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24   */
25  
26  #include "Node.h"
27  #include <stddef.h>
28  #include <stdlib.h>
29  
Node_new(void)30  Node* Node_new(void)
31  {
32      Node* node = (Node*)malloc(sizeof(Node));
33      node->refCount = 0;
34      node->nodeType = "Node";
35      node->childNodesTail = NULL;
36  
37      return node;
38  }
39  
Node_appendChild(Node * node,Node * child)40  void Node_appendChild(Node* node, Node* child)
41  {
42      Node_ref(child);
43      NodeLink* nodeLink = (NodeLink*)malloc(sizeof(NodeLink));
44      nodeLink->node = child;
45      nodeLink->prev = node->childNodesTail;
46      node->childNodesTail = nodeLink;
47  }
48  
Node_removeChild(Node * node,Node * child)49  void Node_removeChild(Node* node, Node* child)
50  {
51      /* Linear search from tail -- good enough for our purposes here */
52      NodeLink* current;
53      NodeLink** currentHandle;
54      for (currentHandle = &node->childNodesTail, current = *currentHandle; current; currentHandle = &current->prev, current = *currentHandle) {
55          if (current->node == child) {
56              Node_deref(current->node);
57              *currentHandle = current->prev;
58              free(current);
59              break;
60          }
61      }
62  }
63  
Node_replaceChild(Node * node,Node * newChild,Node * oldChild)64  void Node_replaceChild(Node* node, Node* newChild, Node* oldChild)
65  {
66      /* Linear search from tail -- good enough for our purposes here */
67      NodeLink* current;
68      for (current = node->childNodesTail; current; current = current->prev) {
69          if (current->node == oldChild) {
70              Node_deref(current->node);
71              current->node = newChild;
72          }
73      }
74  }
75  
Node_ref(Node * node)76  void Node_ref(Node* node)
77  {
78      ++node->refCount;
79  }
80  
Node_deref(Node * node)81  void Node_deref(Node* node)
82  {
83      if (--node->refCount == 0)
84          free(node);
85  }
86