Changeset f85ca3f in mainline for uspace/app/bithenge/expression.c
- Timestamp:
- 2012-07-28T21:25:49Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 84e8a70
- Parents:
- 32eb01b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/expression.c
r32eb01b rf85ca3f 58 58 } 59 59 60 static void expression_indestructible(bithenge_expression_t *self) 61 { 62 assert(false); 63 } 64 65 static 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 74 static const bithenge_expression_ops_t current_node_ops = { 75 .evaluate = current_node_evaluate, 76 .destroy = expression_indestructible, 77 }; 78 79 static bithenge_expression_t current_node_expression = { 80 ¤t_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. */ 86 int bithenge_current_node_expression(bithenge_expression_t **out) 87 { 88 bithenge_expression_inc_ref(¤t_node_expression); 89 *out = ¤t_node_expression; 90 return EOK; 91 } 92 60 93 typedef struct { 61 94 bithenge_expression_t base; … … 176 209 *out = const_as_expression(self); 177 210 return EOK; 211 } 212 213 typedef struct { 214 bithenge_expression_t base; 215 bithenge_expression_t *expr; 216 bithenge_node_t *key; 217 } member_expression_t; 218 219 static member_expression_t *expression_as_member(bithenge_expression_t *base) 220 { 221 return (member_expression_t *)base; 222 } 223 224 static bithenge_expression_t *member_as_expression(member_expression_t *expr) 225 { 226 return &expr->base; 227 } 228 229 static 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 243 static 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 251 static 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. */ 262 int 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 282 error: 283 bithenge_expression_dec_ref(expr); 284 bithenge_node_dec_ref(key); 285 free(self); 286 return rc; 178 287 } 179 288
Note:
See TracChangeset
for help on using the changeset viewer.