Changeset 20ac1a4 in mainline for uspace/app/bithenge/expression.c
- Timestamp:
- 2012-07-30T02:07:10Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 78d3a00
- Parents:
- 10334c2e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/expression.c
r10334c2e r20ac1a4 420 420 bithenge_transform_t base; 421 421 bithenge_expression_t *expr; 422 } expression_transform_t; 423 424 static inline bithenge_transform_t *expression_as_transform( 425 expression_transform_t *self) 426 { 427 return &self->base; 428 } 429 430 static inline expression_transform_t *transform_as_expression( 431 bithenge_transform_t *base) 432 { 433 return (expression_transform_t *)base; 434 } 435 436 static 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 451 static 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 458 static 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 465 static 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. */ 476 int 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 495 error: 496 free(self); 497 bithenge_expression_dec_ref(expr); 498 return rc; 499 } 500 501 typedef struct { 502 bithenge_transform_t base; 503 bithenge_expression_t *expr; 422 504 bithenge_transform_t *true_xform, *false_xform; 423 505 } if_transform_t;
Note:
See TracChangeset
for help on using the changeset viewer.