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

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


Ignore:
Timestamp:
2012-06-07T17:00:12Z (9 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master
Children:
8375d0eb
Parents:
5f679702
Message:

Bithenge: make blobs a type of node

File:
1 edited

Legend:

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

    r5f679702 r5c925ce  
    3737#include <errno.h>
    3838#include <stdlib.h>
     39#include "blob.h"
    3940#include "tree.h"
     41
     42static int blob_destroy(bithenge_node_t *base)
     43{
     44        bithenge_blob_t *blob = bithenge_node_as_blob(base);
     45        assert(blob->base.blob_ops);
     46        return blob->base.blob_ops->destroy(blob);
     47}
    4048
    4149int bithenge_node_destroy(bithenge_node_t *node)
    4250{
    4351        switch (bithenge_node_type(node)) {
     52        case BITHENGE_NODE_BLOB:
     53                return blob_destroy(node);
    4454        case BITHENGE_NODE_STRING:
    4555                if (node->string_value.needs_free)
     
    4757                break;
    4858        case BITHENGE_NODE_INTERNAL:
    49                 /* TODO */
    50                 break;
     59                return node->internal_ops->destroy(node);
    5160        case BITHENGE_NODE_BOOLEAN:
    5261                return EOK; // the boolean nodes are allocated statically below
     
    8493}
    8594
     95static int simple_internal_node_destroy(bithenge_node_t *base)
     96{
     97        int rc;
     98        simple_internal_node_t *node = node_as_simple(base);
     99        for (bithenge_int_t i = 0; i < node->len; i++) {
     100                rc = bithenge_node_destroy(node->nodes[2*i+0]);
     101                if (rc != EOK)
     102                        return rc;
     103                rc = bithenge_node_destroy(node->nodes[2*i+1]);
     104                if (rc != EOK)
     105                        return rc;
     106        }
     107        if (node->needs_free)
     108                free(node->nodes);
     109        free(node);
     110        return EOK;
     111}
     112
    86113static bithenge_internal_node_ops_t simple_internal_node_ops = {
    87         .for_each = simple_internal_node_for_each
     114        .for_each = simple_internal_node_for_each,
     115        .destroy = simple_internal_node_destroy,
    88116};
    89117
Note: See TracChangeset for help on using the changeset viewer.