Changeset 20ac1a4 in mainline for uspace/app/bithenge/expression.c


Ignore:
Timestamp:
2012-07-30T02:07:10Z (12 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
78d3a00
Parents:
10334c2e
Message:

Bithenge: add syntactic sugar for if in struct

File:
1 edited

Legend:

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

    r10334c2e r20ac1a4  
    420420        bithenge_transform_t base;
    421421        bithenge_expression_t *expr;
     422} expression_transform_t;
     423
     424static inline bithenge_transform_t *expression_as_transform(
     425    expression_transform_t *self)
     426{
     427        return &self->base;
     428}
     429
     430static inline expression_transform_t *transform_as_expression(
     431    bithenge_transform_t *base)
     432{
     433        return (expression_transform_t *)base;
     434}
     435
     436static int expression_transform_apply(bithenge_transform_t *base,
     437    bithenge_scope_t *scope, bithenge_node_t *in, bithenge_node_t **out)
     438{
     439        expression_transform_t *self = transform_as_expression(base);
     440        if (bithenge_node_type(in) != BITHENGE_NODE_BLOB)
     441                return EINVAL;
     442        aoff64_t len;
     443        int rc = bithenge_blob_size(bithenge_node_as_blob(in), &len);
     444        if (rc != EOK)
     445                return rc;
     446        if (len != 0)
     447                return EINVAL;
     448        return bithenge_expression_evaluate(self->expr, scope, out);
     449}
     450
     451static int expression_transform_prefix_length(bithenge_transform_t *base,
     452    bithenge_scope_t *scope, bithenge_blob_t *in, aoff64_t *out)
     453{
     454        *out = 0;
     455        return EOK;
     456}
     457
     458static void expression_transform_destroy(bithenge_transform_t *base)
     459{
     460        expression_transform_t *self = transform_as_expression(base);
     461        bithenge_expression_dec_ref(self->expr);
     462        free(self);
     463}
     464
     465static const bithenge_transform_ops_t expression_transform_ops = {
     466        .apply = expression_transform_apply,
     467        .prefix_length = expression_transform_prefix_length,
     468        .destroy = expression_transform_destroy,
     469};
     470
     471/** Create a transform that takes an empty blob and produces the result of an
     472 * expression. Takes a reference to the expression.
     473 * @param[out] out Holds the new transform.
     474 * @param expr The expression to evaluate.
     475 * @return EOK on success or an error code from errno.h. */
     476int bithenge_expression_transform(bithenge_transform_t ** out,
     477    bithenge_expression_t *expr)
     478{
     479        int rc;
     480        expression_transform_t *self = malloc(sizeof(*self));
     481        if (!self) {
     482                rc = ENOMEM;
     483                goto error;
     484        }
     485
     486        rc = bithenge_init_transform(expression_as_transform(self),
     487            &expression_transform_ops, 0);
     488        if (rc != EOK)
     489                goto error;
     490
     491        self->expr = expr;
     492        *out = expression_as_transform(self);
     493        return EOK;
     494
     495error:
     496        free(self);
     497        bithenge_expression_dec_ref(expr);
     498        return rc;
     499}
     500
     501typedef struct {
     502        bithenge_transform_t base;
     503        bithenge_expression_t *expr;
    422504        bithenge_transform_t *true_xform, *false_xform;
    423505} if_transform_t;
Note: See TracChangeset for help on using the changeset viewer.