Changeset 04a7435f in mainline for uspace/app/bithenge/tree.c


Ignore:
Timestamp:
2012-06-26T19:56:26Z (12 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
978ccaf1
Parents:
f2da0bb
Message:

Bithenge: add the struct transform

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bithenge/tree.c

    rf2da0bb r04a7435f  
    105105        simple_internal_node_t *node = node_as_simple(base);
    106106        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]);
    107109                rc = func(node->nodes[2*i+0], node->nodes[2*i+1], data);
    108110                if (rc != EOK)
     
    132134};
    133135
     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. */
     141int 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
    134150/** Create an internal node from a set of keys and values. This function takes
    135151 * ownership of a reference to the key and value nodes, and optionally the
     
    146162    bithenge_node_t **nodes, bithenge_int_t len, bool needs_free)
    147163{
     164        int rc;
    148165        assert(out);
    149166        simple_internal_node_t *node = malloc(sizeof(*node));
    150167        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;
    160175        node->nodes = nodes;
    161176        node->len = len;
     
    163178        *out = simple_as_node(node);
    164179        return EOK;
     180error:
     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;
    165187}
    166188
     
    201223/** Create a string node.
    202224 * @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.
    204226 * @param value The value for the node to hold.
    205227 * @param needs_free Whether the string should be freed when the node is
Note: See TracChangeset for help on using the changeset viewer.