Changeset 978ccaf1 in mainline for uspace/app/bithenge/tree.c
- Timestamp:
- 2012-06-27T03:35:43Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 600f5d1
- Parents:
- 04a7435f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/tree.c
r04a7435f r978ccaf1 41 41 #include "tree.h" 42 42 43 static intblob_destroy(bithenge_node_t *base)44 { 45 bithenge_blob_t * blob= bithenge_node_as_blob(base);46 assert( blob->base.blob_ops);47 return blob->base.blob_ops->destroy(blob);48 } 49 50 static int node_destroy(bithenge_node_t *node)51 { 52 switch (bithenge_node_type( node)) {43 static void blob_destroy(bithenge_node_t *base) 44 { 45 bithenge_blob_t *self = bithenge_node_as_blob(base); 46 assert(self->base.blob_ops); 47 self->base.blob_ops->destroy(self); 48 } 49 50 static void node_destroy(bithenge_node_t *self) 51 { 52 switch (bithenge_node_type(self)) { 53 53 case BITHENGE_NODE_BLOB: 54 return blob_destroy(node); 54 blob_destroy(self); 55 return; 55 56 case BITHENGE_NODE_STRING: 56 if ( node->string_value.needs_free)57 free((void *) node->string_value.ptr);57 if (self->string_value.needs_free) 58 free((void *)self->string_value.ptr); 58 59 break; 59 60 case BITHENGE_NODE_INTERNAL: 60 return node->internal_ops->destroy(node); 61 self->internal_ops->destroy(self); 62 return; 61 63 case BITHENGE_NODE_BOOLEAN: 62 return EOK; // the boolean nodes are allocated statically below64 return; /* The boolean nodes are allocated statically below. */ 63 65 case BITHENGE_NODE_INTEGER: /* pass-through */ 64 66 break; 65 67 } 66 free(node); 67 return EOK; 68 free(self); 68 69 } 69 70 70 71 /** Decrement a node's reference count and free it if appropriate. 71 72 * @memberof bithenge_node_t 72 * @param node The node to dereference, or NULL. 73 * @return EOK on success or an error code from errno.h. */ 74 int bithenge_node_dec_ref(bithenge_node_t *node) 73 * @param node The node to dereference, or NULL. */ 74 void bithenge_node_dec_ref(bithenge_node_t *node) 75 75 { 76 76 if (!node) 77 return EOK;77 return; 78 78 if (--node->refs == 0) 79 return node_destroy(node); 80 return EOK; 79 node_destroy(node); 81 80 } 82 81 … … 103 102 { 104 103 int rc; 105 simple_internal_node_t * node= node_as_simple(base);106 for (bithenge_int_t i = 0; i < node->len; i++) {107 bithenge_node_inc_ref( node->nodes[2*i+0]);108 bithenge_node_inc_ref( node->nodes[2*i+1]);109 rc = func( node->nodes[2*i+0], node->nodes[2*i+1], data);104 simple_internal_node_t *self = node_as_simple(base); 105 for (bithenge_int_t i = 0; i < self->len; i++) { 106 bithenge_node_inc_ref(self->nodes[2*i+0]); 107 bithenge_node_inc_ref(self->nodes[2*i+1]); 108 rc = func(self->nodes[2*i+0], self->nodes[2*i+1], data); 110 109 if (rc != EOK) 111 110 return rc; … … 114 113 } 115 114 116 static int simple_internal_node_destroy(bithenge_node_t *base) 117 { 118 int rc; 119 simple_internal_node_t *node = node_as_simple(base); 120 for (bithenge_int_t i = 0; i < 2 * node->len; i++) { 121 rc = bithenge_node_dec_ref(node->nodes[i]); 122 if (rc != EOK) 123 return rc; 124 } 125 if (node->needs_free) 126 free(node->nodes); 127 free(node); 128 return EOK; 115 static void simple_internal_node_destroy(bithenge_node_t *base) 116 { 117 simple_internal_node_t *self = node_as_simple(base); 118 for (bithenge_int_t i = 0; i < 2 * self->len; i++) 119 bithenge_node_dec_ref(self->nodes[i]); 120 if (self->needs_free) 121 free(self->nodes); 122 free(self); 129 123 } 130 124 … … 136 130 /** Initialize an internal node. 137 131 * @memberof bithenge_node_t 138 * @param[out] nodeThe node.132 * @param[out] self The node. 139 133 * @param[in] ops The operations provided. 140 134 * @return EOK on success or an error code from errno.h. */ 141 int bithenge_init_internal_node(bithenge_node_t * node,135 int bithenge_init_internal_node(bithenge_node_t *self, 142 136 const bithenge_internal_node_ops_t *ops) 143 137 { 144 node->type = BITHENGE_NODE_INTERNAL;145 node->refs = 1;146 node->internal_ops = ops;138 self->type = BITHENGE_NODE_INTERNAL; 139 self->refs = 1; 140 self->internal_ops = ops; 147 141 return EOK; 148 142 } … … 164 158 int rc; 165 159 assert(out); 166 simple_internal_node_t * node = malloc(sizeof(*node));167 if (! node) {160 simple_internal_node_t *self = malloc(sizeof(*self)); 161 if (!self) { 168 162 rc = ENOMEM; 169 163 goto error; 170 164 } 171 rc = bithenge_init_internal_node(simple_as_node( node),165 rc = bithenge_init_internal_node(simple_as_node(self), 172 166 &simple_internal_node_ops); 173 167 if (rc != EOK) 174 168 goto error; 175 node->nodes = nodes;176 node->len = len;177 node->needs_free = needs_free;178 *out = simple_as_node( node);169 self->nodes = nodes; 170 self->len = len; 171 self->needs_free = needs_free; 172 *out = simple_as_node(self); 179 173 return EOK; 180 174 error: … … 183 177 if (needs_free) 184 178 free(nodes); 185 free( node);179 free(self); 186 180 return rc; 187 181 } … … 211 205 { 212 206 assert(out); 213 bithenge_node_t * node = malloc(sizeof(*node));214 if (! node)207 bithenge_node_t *self = malloc(sizeof(*self)); 208 if (!self) 215 209 return ENOMEM; 216 node->type = BITHENGE_NODE_INTEGER;217 node->refs = 1;218 node->integer_value = value;219 *out = node;210 self->type = BITHENGE_NODE_INTEGER; 211 self->refs = 1; 212 self->integer_value = value; 213 *out = self; 220 214 return EOK; 221 215 } … … 231 225 { 232 226 assert(out); 233 bithenge_node_t * node = malloc(sizeof(*node));234 if (! node)227 bithenge_node_t *self = malloc(sizeof(*self)); 228 if (!self) 235 229 return ENOMEM; 236 node->type = BITHENGE_NODE_STRING;237 node->refs = 1;238 node->string_value.ptr = value;239 node->string_value.needs_free = needs_free;240 *out = node;230 self->type = BITHENGE_NODE_STRING; 231 self->refs = 1; 232 self->string_value.ptr = value; 233 self->string_value.needs_free = needs_free; 234 *out = self; 241 235 return EOK; 242 236 }
Note:
See TracChangeset
for help on using the changeset viewer.