Changeset f85ca3f in mainline for uspace/app/bithenge/expression.c


Ignore:
Timestamp:
2012-07-28T21:25:49Z (13 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
84e8a70
Parents:
32eb01b
Message:

Bithenge: add expressions that use the current node being created

File:
1 edited

Legend:

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

    r32eb01b rf85ca3f  
    5858}
    5959
     60static void expression_indestructible(bithenge_expression_t *self)
     61{
     62        assert(false);
     63}
     64
     65static int current_node_evaluate(bithenge_expression_t *self,
     66    bithenge_scope_t *scope, bithenge_node_t **out)
     67{
     68        *out = bithenge_scope_get_current_node(scope);
     69        if (!*out)
     70                return EINVAL;
     71        return EOK;
     72}
     73
     74static const bithenge_expression_ops_t current_node_ops = {
     75        .evaluate = current_node_evaluate,
     76        .destroy = expression_indestructible,
     77};
     78
     79static bithenge_expression_t current_node_expression = {
     80        &current_node_ops, 1
     81};
     82
     83/** Create an expression that gets the current node being created.
     84 * @param[out] out Holds the new expression.
     85 * @return EOK on success or an error code from errno.h. */
     86int bithenge_current_node_expression(bithenge_expression_t **out)
     87{
     88        bithenge_expression_inc_ref(&current_node_expression);
     89        *out = &current_node_expression;
     90        return EOK;
     91}
     92
    6093typedef struct {
    6194        bithenge_expression_t base;
     
    176209        *out = const_as_expression(self);
    177210        return EOK;
     211}
     212
     213typedef struct {
     214        bithenge_expression_t base;
     215        bithenge_expression_t *expr;
     216        bithenge_node_t *key;
     217} member_expression_t;
     218
     219static member_expression_t *expression_as_member(bithenge_expression_t *base)
     220{
     221        return (member_expression_t *)base;
     222}
     223
     224static bithenge_expression_t *member_as_expression(member_expression_t *expr)
     225{
     226        return &expr->base;
     227}
     228
     229static int member_expression_evaluate(bithenge_expression_t *base,
     230    bithenge_scope_t *scope, bithenge_node_t **out)
     231{
     232        member_expression_t *self = expression_as_member(base);
     233        bithenge_node_t *node;
     234        int rc = bithenge_expression_evaluate(self->expr, scope, &node);
     235        if (rc != EOK)
     236                return rc;
     237        bithenge_node_inc_ref(self->key);
     238        rc = bithenge_node_get(node, self->key, out);
     239        bithenge_node_dec_ref(node);
     240        return rc;
     241}
     242
     243static void member_expression_destroy(bithenge_expression_t *base)
     244{
     245        member_expression_t *self = expression_as_member(base);
     246        bithenge_expression_dec_ref(self->expr);
     247        bithenge_node_dec_ref(self->key);
     248        free(self);
     249}
     250
     251static const bithenge_expression_ops_t member_expression_ops = {
     252        .evaluate = member_expression_evaluate,
     253        .destroy = member_expression_destroy,
     254};
     255
     256/** Create an expression that gets a member from a node. Takes references to
     257 * @a expr and @a key.
     258 * @param[out] out Holds the new expression.
     259 * @param expr Calculates the node to get the member of.
     260 * @param key The member to get.
     261 * @return EOK on success or an error code from errno.h. */
     262int bithenge_member_expression(bithenge_expression_t **out,
     263    bithenge_expression_t *expr, bithenge_node_t *key)
     264{
     265        int rc;
     266        member_expression_t *self = malloc(sizeof(*self));
     267        if (!self) {
     268                rc = ENOMEM;
     269                goto error;
     270        }
     271
     272        rc = bithenge_init_expression(member_as_expression(self),
     273            &member_expression_ops);
     274        if (rc != EOK)
     275                goto error;
     276
     277        self->expr = expr;
     278        self->key = key;
     279        *out = member_as_expression(self);
     280        return EOK;
     281
     282error:
     283        bithenge_expression_dec_ref(expr);
     284        bithenge_node_dec_ref(key);
     285        free(self);
     286        return rc;
    178287}
    179288
Note: See TracChangeset for help on using the changeset viewer.