Changeset f9c314a5 in mainline
- Timestamp:
- 2012-08-07T04:06:14Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0191bd3
- Parents:
- 0ce0103
- Location:
- uspace/app/bithenge
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/expression.c
r0ce0103 rf9c314a5 424 424 { 425 425 param_wrapper_t *self = transform_as_param_wrapper(base); 426 bithenge_scope_t inner; 427 bithenge_scope_init(&inner); 428 int rc = param_wrapper_fill_scope(self, &inner, outer); 429 if (rc != EOK) 430 goto error; 431 432 rc = bithenge_transform_apply(self->transform, &inner, in, out); 426 bithenge_scope_t *inner; 427 int rc = bithenge_scope_new(&inner); 428 if (rc != EOK) 429 return rc; 430 rc = param_wrapper_fill_scope(self, inner, outer); 431 if (rc != EOK) 432 goto error; 433 434 rc = bithenge_transform_apply(self->transform, inner, in, out); 433 435 in = NULL; 434 436 435 437 error: 436 bithenge_scope_de stroy(&inner);438 bithenge_scope_dec_ref(inner); 437 439 return rc; 438 440 } … … 442 444 { 443 445 param_wrapper_t *self = transform_as_param_wrapper(base); 444 bithenge_scope_t inner; 445 bithenge_scope_init(&inner); 446 int rc = param_wrapper_fill_scope(self, &inner, outer); 447 if (rc != EOK) 448 goto error; 449 450 rc = bithenge_transform_prefix_length(self->transform, &inner, in, 451 out); 446 bithenge_scope_t *inner; 447 int rc = bithenge_scope_new(&inner); 448 if (rc != EOK) 449 return rc; 450 rc = param_wrapper_fill_scope(self, inner, outer); 451 if (rc != EOK) 452 goto error; 453 454 rc = bithenge_transform_prefix_length(self->transform, inner, in, out); 452 455 in = NULL; 453 456 454 457 error: 455 bithenge_scope_de stroy(&inner);458 bithenge_scope_dec_ref(inner); 456 459 return rc; 457 460 } -
uspace/app/bithenge/sequence.c
r0ce0103 rf9c314a5 50 50 const struct seq_node_ops *ops; 51 51 bithenge_blob_t *blob; 52 bithenge_scope_t scope;52 bithenge_scope_t *scope; 53 53 aoff64_t *ends; 54 54 size_t num_ends; … … 114 114 bithenge_blob_t *subblob = bithenge_node_as_blob(subblob_node); 115 115 aoff64_t field_size; 116 rc = bithenge_transform_prefix_length(subxform, &self->scope,116 rc = bithenge_transform_prefix_length(subxform, self->scope, 117 117 subblob, &field_size); 118 118 bithenge_node_dec_ref(subblob_node); … … 177 177 178 178 aoff64_t size; 179 rc = bithenge_transform_prefix_apply(subxform, &self->scope,179 rc = bithenge_transform_prefix_apply(subxform, self->scope, 180 180 bithenge_node_as_blob(blob_node), out, &size); 181 181 bithenge_node_dec_ref(blob_node); … … 209 209 } 210 210 211 rc = bithenge_transform_apply(subxform, &self->scope,212 blob_node,out);211 rc = bithenge_transform_apply(subxform, self->scope, blob_node, 212 out); 213 213 bithenge_node_dec_ref(blob_node); 214 214 bithenge_transform_dec_ref(subxform); … … 235 235 static void seq_node_destroy(seq_node_t *self) 236 236 { 237 bithenge_scope_de stroy(&self->scope);237 bithenge_scope_dec_ref(self->scope); 238 238 bithenge_blob_dec_ref(self->blob); 239 239 free(self->ends); … … 248 248 static bithenge_scope_t *seq_node_scope(seq_node_t *self) 249 249 { 250 return &self->scope;250 return self->scope; 251 251 } 252 252 … … 267 267 self->num_ends = 0; 268 268 self->end_on_empty = end_on_empty; 269 bithenge_scope_init(&self->scope); 270 int rc = bithenge_scope_copy(&self->scope, scope); 269 int rc = bithenge_scope_new(&self->scope); 271 270 if (rc != EOK) { 272 bithenge_scope_destroy(&self->scope); 271 free(self->ends); 272 return rc; 273 } 274 rc = bithenge_scope_copy(self->scope, scope); 275 if (rc != EOK) { 276 bithenge_scope_dec_ref(self->scope); 277 free(self->ends); 273 278 return rc; 274 279 } … … 936 941 } 937 942 938 bithenge_scope_t scope; 939 bithenge_scope_init(&scope); 940 rc = bithenge_scope_copy(&scope, 943 bithenge_scope_t *scope; 944 rc = bithenge_scope_new(&scope); 945 if (rc != EOK) { 946 bithenge_node_dec_ref(subxform_result); 947 return rc; 948 } 949 rc = bithenge_scope_copy(scope, 941 950 seq_node_scope(do_while_as_seq(self))); 942 bithenge_scope_set_current_node( &scope, subxform_result);951 bithenge_scope_set_current_node(scope, subxform_result); 943 952 if (rc != EOK) { 944 bithenge_scope_de stroy(&scope);953 bithenge_scope_dec_ref(scope); 945 954 return rc; 946 955 } 947 956 bithenge_node_t *expr_result; 948 rc = bithenge_expression_evaluate(self->expr, &scope,957 rc = bithenge_expression_evaluate(self->expr, scope, 949 958 &expr_result); 950 bithenge_scope_de stroy(&scope);959 bithenge_scope_dec_ref(scope); 951 960 if (rc != EOK) 952 961 return rc; -
uspace/app/bithenge/test.c
r0ce0103 rf9c314a5 69 69 bithenge_node_dec_ref(node); 70 70 } else { 71 bithenge_scope_t scope;71 bithenge_scope_t *scope = NULL; 72 72 bithenge_transform_t *transform = NULL; 73 73 bithenge_node_t *node = NULL, *node2 = NULL; 74 74 75 bithenge_scope_init(&scope); 75 rc = bithenge_scope_new(&scope); 76 if (rc != EOK) { 77 printf("Error creating scope: %s\n", str_error(rc)); 78 scope = NULL; 79 goto error; 80 } 76 81 77 82 rc = bithenge_parse_script(argv[1], &transform); 78 83 if (rc != EOK) { 79 84 printf("Error parsing script: %s\n", str_error(rc)); 85 transform = NULL; 80 86 goto error; 81 87 } 82 88 83 intrc = bithenge_node_from_source(&node, argv[2]);89 rc = bithenge_node_from_source(&node, argv[2]); 84 90 if (rc != EOK) { 85 91 printf("Error creating node from source: %s\n", str_error(rc)); 92 node = NULL; 86 93 goto error; 87 94 } 88 95 89 rc = bithenge_transform_apply(transform, &scope, node, &node2);96 rc = bithenge_transform_apply(transform, scope, node, &node2); 90 97 if (rc != EOK) { 91 98 printf("Error applying transform: %s\n", str_error(rc)); 99 node2 = NULL; 92 100 goto error; 93 101 } … … 105 113 bithenge_node_dec_ref(node2); 106 114 node2 = NULL; 115 bithenge_scope_dec_ref(scope); 116 scope = NULL; 107 117 printf("\n"); 108 118 … … 113 123 bithenge_node_dec_ref(node2); 114 124 bithenge_transform_dec_ref(transform); 115 bithenge_scope_de stroy(&scope);125 bithenge_scope_dec_ref(scope); 116 126 return 1; 117 127 } -
uspace/app/bithenge/transform.c
r0ce0103 rf9c314a5 165 165 } 166 166 167 /** Initialize a transform scope. It must be destroyed with @a 168 * bithenge_scope_destroy after it is used. 169 * @param[out] scope The scope to initialize. */ 170 void bithenge_scope_init(bithenge_scope_t *scope) 171 { 172 scope->num_params = 0; 173 scope->params = NULL; 174 scope->current_node = NULL; 175 } 176 177 /** Destroy a transform scope. 178 * @param scope The scope to destroy. 167 /** Create a transform scope. It must be dereferenced with @a 168 * bithenge_scope_dec_ref after it is used. 169 * @param[out] out Holds the new scope. 179 170 * @return EOK on success or an error code from errno.h. */ 180 void bithenge_scope_destroy(bithenge_scope_t *scope) 181 { 182 bithenge_node_dec_ref(scope->current_node); 183 for (int i = 0; i < scope->num_params; i++) 184 bithenge_node_dec_ref(scope->params[i]); 185 free(scope->params); 171 int bithenge_scope_new(bithenge_scope_t **out) 172 { 173 bithenge_scope_t *self = malloc(sizeof(*self)); 174 if (!self) 175 return ENOMEM; 176 self->refs = 1; 177 self->num_params = 0; 178 self->params = NULL; 179 self->current_node = NULL; 180 *out = self; 181 return EOK; 182 } 183 184 /** Dereference a transform scope. 185 * @param self The scope to dereference. */ 186 void bithenge_scope_dec_ref(bithenge_scope_t *self) 187 { 188 if (!--self->refs) { 189 bithenge_node_dec_ref(self->current_node); 190 for (int i = 0; i < self->num_params; i++) 191 bithenge_node_dec_ref(self->params[i]); 192 free(self->params); 193 free(self); 194 } 186 195 } 187 196 … … 297 306 { 298 307 scope_transform_t *self = transform_as_param(base); 299 bithenge_scope_t inner_scope; 300 bithenge_scope_init(&inner_scope); 301 int rc = bithenge_scope_copy(&inner_scope, scope); 308 bithenge_scope_t *inner_scope; 309 int rc = bithenge_scope_new(&inner_scope); 310 if (rc != EOK) 311 return rc; 312 rc = bithenge_scope_copy(inner_scope, scope); 302 313 if (rc != EOK) 303 314 goto error; 304 bithenge_scope_set_current_node( &inner_scope, NULL);315 bithenge_scope_set_current_node(inner_scope, NULL); 305 316 rc = bithenge_transform_apply(self->transform, scope, in, out); 306 317 error: 307 bithenge_scope_de stroy(&inner_scope);318 bithenge_scope_dec_ref(inner_scope); 308 319 return rc; 309 320 } -
uspace/app/bithenge/transform.h
r0ce0103 rf9c314a5 52 52 typedef struct { 53 53 /** @privatesection */ 54 unsigned int refs; 54 55 int num_params; 55 56 bithenge_node_t **params; 56 57 bithenge_node_t *current_node; 57 58 } bithenge_scope_t; 59 60 static inline void bithenge_scope_inc_ref(bithenge_scope_t *self) { 61 self->refs++; 62 } 58 63 59 64 /** Operations that may be provided by a transform. All transforms must provide … … 143 148 bithenge_transform_t **, size_t); 144 149 145 void bithenge_scope_init(bithenge_scope_t*);146 void bithenge_scope_de stroy(bithenge_scope_t *);150 int bithenge_scope_new(bithenge_scope_t **); 151 void bithenge_scope_dec_ref(bithenge_scope_t *); 147 152 int bithenge_scope_copy(bithenge_scope_t *, bithenge_scope_t *); 148 153 void bithenge_scope_set_current_node(bithenge_scope_t *, bithenge_node_t *);
Note:
See TracChangeset
for help on using the changeset viewer.