Changeset 978ccaf1 in mainline for uspace/app/bithenge/tree.c


Ignore:
Timestamp:
2012-06-27T03:35:43Z (12 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
600f5d1
Parents:
04a7435f
Message:

Bithenge: various cleanup and tweaks

File:
1 edited

Legend:

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

    r04a7435f r978ccaf1  
    4141#include "tree.h"
    4242
    43 static int blob_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)) {
     43static 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
     50static void node_destroy(bithenge_node_t *self)
     51{
     52        switch (bithenge_node_type(self)) {
    5353        case BITHENGE_NODE_BLOB:
    54                 return blob_destroy(node);
     54                blob_destroy(self);
     55                return;
    5556        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);
    5859                break;
    5960        case BITHENGE_NODE_INTERNAL:
    60                 return node->internal_ops->destroy(node);
     61                self->internal_ops->destroy(self);
     62                return;
    6163        case BITHENGE_NODE_BOOLEAN:
    62                 return EOK; // the boolean nodes are allocated statically below
     64                return; /* The boolean nodes are allocated statically below. */
    6365        case BITHENGE_NODE_INTEGER: /* pass-through */
    6466                break;
    6567        }
    66         free(node);
    67         return EOK;
     68        free(self);
    6869}
    6970
    7071/** Decrement a node's reference count and free it if appropriate.
    7172 * @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. */
     74void bithenge_node_dec_ref(bithenge_node_t *node)
    7575{
    7676        if (!node)
    77                 return EOK;
     77                return;
    7878        if (--node->refs == 0)
    79                 return node_destroy(node);
    80         return EOK;
     79                node_destroy(node);
    8180}
    8281
     
    103102{
    104103        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);
    110109                if (rc != EOK)
    111110                        return rc;
     
    114113}
    115114
    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;
     115static 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);
    129123}
    130124
     
    136130/** Initialize an internal node.
    137131 * @memberof bithenge_node_t
    138  * @param[out] node The node.
     132 * @param[out] self The node.
    139133 * @param[in] ops The operations provided.
    140134 * @return EOK on success or an error code from errno.h. */
    141 int bithenge_init_internal_node(bithenge_node_t *node,
     135int bithenge_init_internal_node(bithenge_node_t *self,
    142136    const bithenge_internal_node_ops_t *ops)
    143137{
    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;
    147141        return EOK;
    148142}
     
    164158        int rc;
    165159        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) {
    168162                rc = ENOMEM;
    169163                goto error;
    170164        }
    171         rc = bithenge_init_internal_node(simple_as_node(node),
     165        rc = bithenge_init_internal_node(simple_as_node(self),
    172166            &simple_internal_node_ops);
    173167        if (rc != EOK)
    174168                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);
    179173        return EOK;
    180174error:
     
    183177        if (needs_free)
    184178                free(nodes);
    185         free(node);
     179        free(self);
    186180        return rc;
    187181}
     
    211205{
    212206        assert(out);
    213         bithenge_node_t *node = malloc(sizeof(*node));
    214         if (!node)
     207        bithenge_node_t *self = malloc(sizeof(*self));
     208        if (!self)
    215209                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;
    220214        return EOK;
    221215}
     
    231225{
    232226        assert(out);
    233         bithenge_node_t *node = malloc(sizeof(*node));
    234         if (!node)
     227        bithenge_node_t *self = malloc(sizeof(*self));
     228        if (!self)
    235229                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;
    241235        return EOK;
    242236}
Note: See TracChangeset for help on using the changeset viewer.