Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 5f679702 in mainline for uspace/app/bithenge/tree.c


Ignore:
Timestamp:
2012-06-07T04:03:16Z (9 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master
Children:
5c925ce
Parents:
520acaf
Message:

Bithenge: simplification

File:
1 edited

Legend:

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

    r520acaf r5f679702  
    4141int bithenge_node_destroy(bithenge_node_t *node)
    4242{
    43         bithenge_string_node_t *string_node;
    4443        switch (bithenge_node_type(node)) {
    4544        case BITHENGE_NODE_STRING:
    46                 string_node = bithenge_as_string_node(node);
    47                 if (string_node->needs_free)
    48                         free(string_node->value);
     45                if (node->string_value.needs_free)
     46                        free(node->string_value.ptr);
    4947                break;
    5048        case BITHENGE_NODE_INTERNAL:
     
    5250                break;
    5351        case BITHENGE_NODE_BOOLEAN:
    54                 return EOK;
     52                return EOK; // the boolean nodes are allocated statically below
    5553        case BITHENGE_NODE_INTEGER: /* pass-through */
    5654        case BITHENGE_NODE_NONE:
     
    6361typedef struct
    6462{
    65         bithenge_internal_node_t base;
     63        bithenge_node_t base;
    6664        bithenge_node_t **nodes;
    6765        bithenge_int_t len;
     
    6967} simple_internal_node_t;
    7068
    71 static simple_internal_node_t *internal_as_simple(bithenge_internal_node_t *node)
     69static simple_internal_node_t *node_as_simple(bithenge_node_t *node)
    7270{
    7371        return (simple_internal_node_t *)node;
    7472}
    7573
    76 static int simple_internal_node_for_each(bithenge_internal_node_t *base, bithenge_for_each_func_t func, void *data)
     74static int simple_internal_node_for_each(bithenge_node_t *base, bithenge_for_each_func_t func, void *data)
    7775{
    7876        int rc;
    79         simple_internal_node_t *node = internal_as_simple(base);
     77        simple_internal_node_t *node = node_as_simple(base);
    8078        for (bithenge_int_t i = 0; i < node->len; i++) {
    8179                rc = func(node->nodes[2*i+0], node->nodes[2*i+1], data);
     
    9290static bithenge_node_t *simple_internal_as_node(simple_internal_node_t *node)
    9391{
    94         return bithenge_internal_as_node(&node->base);
     92        return &node->base;
    9593}
    9694
     
    10199        if (!node)
    102100                return ENOMEM;
    103         node->base.base.type = BITHENGE_NODE_INTERNAL;
    104         node->base.ops = &simple_internal_node_ops;
     101        node->base.type = BITHENGE_NODE_INTERNAL;
     102        node->base.internal_ops = &simple_internal_node_ops;
    105103        node->nodes = nodes;
    106104        node->len = len;
     
    110108}
    111109
    112 static bithenge_boolean_node_t false_node = { {BITHENGE_NODE_BOOLEAN}, false };
    113 static bithenge_boolean_node_t true_node = { {BITHENGE_NODE_BOOLEAN}, true };
     110static bithenge_node_t false_node = { BITHENGE_NODE_BOOLEAN, .boolean_value = false };
     111static bithenge_node_t true_node = { BITHENGE_NODE_BOOLEAN, .boolean_value = true };
    114112
    115113int bithenge_new_boolean_node(bithenge_node_t **out, bool value)
    116114{
    117115        assert(out);
    118         *out = bithenge_boolean_as_node(value ? &true_node : &false_node);
     116        *out = value ? &true_node : &false_node;
    119117        return EOK;
    120118}
     
    123121{
    124122        assert(out);
    125         bithenge_integer_node_t *node = malloc(sizeof(*node));
     123        bithenge_node_t *node = malloc(sizeof(*node));
    126124        if (!node)
    127125                return ENOMEM;
    128         node->base.type = BITHENGE_NODE_INTEGER;
    129         node->value = value;
    130         *out = bithenge_integer_as_node(node);
     126        node->type = BITHENGE_NODE_INTEGER;
     127        node->integer_value = value;
     128        *out = node;
    131129        return EOK;
    132130}
     
    135133{
    136134        assert(out);
    137         bithenge_string_node_t *node = malloc(sizeof(*node));
     135        bithenge_node_t *node = malloc(sizeof(*node));
    138136        if (!node)
    139137                return ENOMEM;
    140         node->base.type = BITHENGE_NODE_STRING;
    141         node->value = value;
    142         node->needs_free = needs_free;
    143         *out = bithenge_string_as_node(node);
     138        node->type = BITHENGE_NODE_STRING;
     139        node->string_value.ptr = value;
     140        node->string_value.needs_free = needs_free;
     141        *out = node;
    144142        return EOK;
    145143}
Note: See TracChangeset for help on using the changeset viewer.