Changeset 04a7435f in mainline for uspace/app/bithenge/tree.c
- Timestamp:
- 2012-06-26T19:56:26Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 978ccaf1
- Parents:
- f2da0bb
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/tree.c
rf2da0bb r04a7435f 105 105 simple_internal_node_t *node = node_as_simple(base); 106 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]); 107 109 rc = func(node->nodes[2*i+0], node->nodes[2*i+1], data); 108 110 if (rc != EOK) … … 132 134 }; 133 135 136 /** Initialize an internal node. 137 * @memberof bithenge_node_t 138 * @param[out] node The node. 139 * @param[in] ops The operations provided. 140 * @return EOK on success or an error code from errno.h. */ 141 int bithenge_init_internal_node(bithenge_node_t *node, 142 const bithenge_internal_node_ops_t *ops) 143 { 144 node->type = BITHENGE_NODE_INTERNAL; 145 node->refs = 1; 146 node->internal_ops = ops; 147 return EOK; 148 } 149 134 150 /** Create an internal node from a set of keys and values. This function takes 135 151 * ownership of a reference to the key and value nodes, and optionally the … … 146 162 bithenge_node_t **nodes, bithenge_int_t len, bool needs_free) 147 163 { 164 int rc; 148 165 assert(out); 149 166 simple_internal_node_t *node = malloc(sizeof(*node)); 150 167 if (!node) { 151 for (bithenge_int_t i = 0; i < 2 * len; i++) 152 bithenge_node_dec_ref(nodes[i]); 153 if (needs_free) 154 free(nodes); 155 return ENOMEM; 156 } 157 node->base.type = BITHENGE_NODE_INTERNAL; 158 node->base.refs = 1; 159 node->base.internal_ops = &simple_internal_node_ops; 168 rc = ENOMEM; 169 goto error; 170 } 171 rc = bithenge_init_internal_node(simple_as_node(node), 172 &simple_internal_node_ops); 173 if (rc != EOK) 174 goto error; 160 175 node->nodes = nodes; 161 176 node->len = len; … … 163 178 *out = simple_as_node(node); 164 179 return EOK; 180 error: 181 for (bithenge_int_t i = 0; i < 2 * len; i++) 182 bithenge_node_dec_ref(nodes[i]); 183 if (needs_free) 184 free(nodes); 185 free(node); 186 return rc; 165 187 } 166 188 … … 201 223 /** Create a string node. 202 224 * @memberof bithenge_node_t 203 * @param[out] out Stores the created string node. 225 * @param[out] out Stores the created string node. On error, this is unchanged. 204 226 * @param value The value for the node to hold. 205 227 * @param needs_free Whether the string should be freed when the node is
Note:
See TracChangeset
for help on using the changeset viewer.