Changeset 3c70376 in mainline for uspace/app/bithenge/transform.c
- Timestamp:
- 2012-08-09T04:57:22Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c54f5d0
- Parents:
- 0b60d2d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/transform.c
r0b60d2d r3c70376 948 948 bithenge_named_transform_t *bithenge_primitive_transforms = primitive_transforms; 949 949 950 typedef struct {951 bithenge_transform_t base;952 bithenge_transform_t **xforms;953 size_t num;954 } compose_transform_t;955 956 static bithenge_transform_t *compose_as_transform(compose_transform_t *xform)957 {958 return &xform->base;959 }960 961 static compose_transform_t *transform_as_compose(bithenge_transform_t *xform)962 {963 return (compose_transform_t *)xform;964 }965 966 static int compose_apply(bithenge_transform_t *base, bithenge_scope_t *scope,967 bithenge_node_t *in, bithenge_node_t **out)968 {969 int rc;970 compose_transform_t *self = transform_as_compose(base);971 bithenge_node_inc_ref(in);972 973 /* i ranges from (self->num - 1) to 0 inside the loop. */974 for (size_t i = self->num; i--; ) {975 bithenge_node_t *tmp;976 rc = bithenge_transform_apply(self->xforms[i], scope, in,977 &tmp);978 bithenge_node_dec_ref(in);979 if (rc != EOK)980 return rc;981 in = tmp;982 }983 984 *out = in;985 return rc;986 }987 988 static int compose_prefix_length(bithenge_transform_t *base,989 bithenge_scope_t *scope, bithenge_blob_t *blob, aoff64_t *out)990 {991 compose_transform_t *self = transform_as_compose(base);992 return bithenge_transform_prefix_length(self->xforms[self->num - 1],993 scope, blob, out);994 }995 996 static void compose_destroy(bithenge_transform_t *base)997 {998 compose_transform_t *self = transform_as_compose(base);999 for (size_t i = 0; i < self->num; i++)1000 bithenge_transform_dec_ref(self->xforms[i]);1001 free(self->xforms);1002 free(self);1003 }1004 1005 static const bithenge_transform_ops_t compose_transform_ops = {1006 .apply = compose_apply,1007 .prefix_length = compose_prefix_length,1008 .destroy = compose_destroy,1009 };1010 1011 /** Create a composition of multiple transforms. When the result is applied to a1012 * node, each transform is applied in turn, with the last transform applied1013 * first. @a xforms may contain any number of transforms or no transforms at1014 * all. This function takes ownership of @a xforms and the references therein.1015 * @param[out] out Holds the result.1016 * @param[in] xforms The transforms to apply.1017 * @param num The number of transforms.1018 * @return EOK on success or an error code from errno.h. */1019 int bithenge_new_composed_transform(bithenge_transform_t **out,1020 bithenge_transform_t **xforms, size_t num)1021 {1022 if (num == 0) {1023 /* TODO: optimize */1024 } else if (num == 1) {1025 *out = xforms[0];1026 free(xforms);1027 return EOK;1028 }1029 1030 int rc;1031 compose_transform_t *self = malloc(sizeof(*self));1032 if (!self) {1033 rc = ENOMEM;1034 goto error;1035 }1036 rc = bithenge_init_transform(compose_as_transform(self),1037 &compose_transform_ops, 0);1038 if (rc != EOK)1039 goto error;1040 self->xforms = xforms;1041 self->num = num;1042 *out = compose_as_transform(self);1043 return EOK;1044 error:1045 for (size_t i = 0; i < num; i++)1046 bithenge_transform_dec_ref(xforms[i]);1047 free(xforms);1048 free(self);1049 return rc;1050 }1051 1052 950 /** @} 1053 951 */
Note:
See TracChangeset
for help on using the changeset viewer.