Changeset 978ccaf1 in mainline
- Timestamp:
- 2012-06-27T03:35:43Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 600f5d1
- Parents:
- 04a7435f
- Location:
- uspace/app/bithenge
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/blob.c
r04a7435f r978ccaf1 49 49 * @return EOK on success or an error code from errno.h. 50 50 */ 51 int bithenge_ new_random_access_blob(bithenge_blob_t *blob,51 int bithenge_init_random_access_blob(bithenge_blob_t *blob, 52 52 const bithenge_random_access_blob_ops_t *ops) 53 53 { … … 85 85 } 86 86 87 static inline bithenge_sequential_blob_t * sequential_from_blob(87 static inline bithenge_sequential_blob_t *blob_as_sequential( 88 88 bithenge_blob_t *base) 89 89 { … … 91 91 } 92 92 93 static inline bithenge_blob_t * blob_from_sequential(93 static inline bithenge_blob_t *sequential_as_blob( 94 94 bithenge_sequential_blob_t *blob) 95 95 { … … 99 99 static int sequential_size(bithenge_blob_t *base, aoff64_t *size) 100 100 { 101 bithenge_sequential_blob_t *blob = sequential_from_blob(base);101 bithenge_sequential_blob_t *blob = blob_as_sequential(base); 102 102 int rc; 103 103 if (blob->ops->size) { … … 121 121 char *buffer, aoff64_t *size) 122 122 { 123 bithenge_sequential_blob_t *blob = sequential_from_blob(base);123 bithenge_sequential_blob_t *blob = blob_as_sequential(base); 124 124 aoff64_t end = offset + *size; 125 125 if (end > blob->data_size) { … … 135 135 } 136 136 137 static intsequential_destroy(bithenge_blob_t *base)138 { 139 bithenge_sequential_blob_t *blob = sequential_from_blob(base);137 static void sequential_destroy(bithenge_blob_t *base) 138 { 139 bithenge_sequential_blob_t *blob = blob_as_sequential(base); 140 140 free(blob->buffer); 141 returnblob->ops->destroy(blob);141 blob->ops->destroy(blob); 142 142 } 143 143 … … 155 155 * @return EOK on success or an error code from errno.h. 156 156 */ 157 int bithenge_ new_sequential_blob(bithenge_sequential_blob_t *blob,157 int bithenge_init_sequential_blob(bithenge_sequential_blob_t *blob, 158 158 const bithenge_sequential_blob_ops_t *ops) 159 159 { … … 164 164 // ops->size is optional 165 165 166 int rc = bithenge_ new_random_access_blob(blob_from_sequential(blob),166 int rc = bithenge_init_random_access_blob(sequential_as_blob(blob), 167 167 &sequential_ops); 168 168 if (rc != EOK) … … 182 182 } memory_blob_t; 183 183 184 static inline memory_blob_t * memory_from_blob(bithenge_blob_t *base)184 static inline memory_blob_t *blob_as_memory(bithenge_blob_t *base) 185 185 { 186 186 return (memory_blob_t *)base; 187 187 } 188 188 189 static inline bithenge_blob_t * blob_from_memory(memory_blob_t *blob)189 static inline bithenge_blob_t *memory_as_blob(memory_blob_t *blob) 190 190 { 191 191 return &blob->base; … … 194 194 static int memory_size(bithenge_blob_t *base, aoff64_t *size) 195 195 { 196 memory_blob_t *blob = memory_from_blob(base);196 memory_blob_t *blob = blob_as_memory(base); 197 197 *size = blob->size; 198 198 return EOK; … … 202 202 aoff64_t *size) 203 203 { 204 memory_blob_t *blob = memory_from_blob(base);204 memory_blob_t *blob = blob_as_memory(base); 205 205 if (offset > blob->size) 206 206 return ELIMIT; … … 210 210 } 211 211 212 static intmemory_destroy(bithenge_blob_t *base)213 { 214 memory_blob_t *blob = memory_from_blob(base);212 static void memory_destroy(bithenge_blob_t *base) 213 { 214 memory_blob_t *blob = blob_as_memory(base); 215 215 if (blob->needs_free) 216 216 free((void *)blob->buffer); 217 217 free(blob); 218 return EOK;219 218 } 220 219 … … 244 243 if (!blob) 245 244 return ENOMEM; 246 rc = bithenge_ new_random_access_blob(blob_from_memory(blob),245 rc = bithenge_init_random_access_blob(memory_as_blob(blob), 247 246 &memory_ops); 248 247 if (rc != EOK) { … … 259 258 blob->size = len; 260 259 blob->needs_free = true; 261 *out = bithenge_blob_as_node( blob_from_memory(blob));260 *out = bithenge_blob_as_node(memory_as_blob(blob)); 262 261 return EOK; 263 262 } … … 283 282 if (!blob) 284 283 return ENOMEM; 285 rc = bithenge_ new_random_access_blob(blob_from_memory(blob),284 rc = bithenge_init_random_access_blob(memory_as_blob(blob), 286 285 &memory_ops); 287 286 if (rc != EOK) { … … 292 291 blob->size = len; 293 292 blob->needs_free = needs_free; 294 *out = bithenge_blob_as_node( blob_from_memory(blob));293 *out = bithenge_blob_as_node(memory_as_blob(blob)); 295 294 return EOK; 296 295 } … … 340 339 } 341 340 342 static intsubblob_destroy(bithenge_blob_t *base)341 static void subblob_destroy(bithenge_blob_t *base) 343 342 { 344 343 subblob_t *blob = blob_as_subblob(base); 345 344 bithenge_blob_dec_ref(blob->source); 346 345 free(blob); 347 return EOK;348 346 } 349 347 … … 404 402 goto error; 405 403 } 406 rc = bithenge_ new_random_access_blob(subblob_as_blob(blob),404 rc = bithenge_init_random_access_blob(subblob_as_blob(blob), 407 405 &subblob_ops); 408 406 if (rc != EOK) -
uspace/app/bithenge/blob.h
r04a7435f r978ccaf1 52 52 typedef struct bithenge_random_access_blob_ops_t { 53 53 /** @copydoc bithenge_blob_t::bithenge_blob_size */ 54 int (*size)(bithenge_blob_t * blob, aoff64_t *size);54 int (*size)(bithenge_blob_t *self, aoff64_t *size); 55 55 /** @copydoc bithenge_blob_t::bithenge_blob_read */ 56 int (*read)(bithenge_blob_t * blob, aoff64_t offset, char *buffer,56 int (*read)(bithenge_blob_t *self, aoff64_t offset, char *buffer, 57 57 aoff64_t *size); 58 58 /** Destroy the blob. 59 * @param blob The blob. 60 * @return EOK on success or an error code from errno.h. */ 61 int (*destroy)(bithenge_blob_t *blob); 59 * @param blob The blob. */ 60 void (*destroy)(bithenge_blob_t *self); 62 61 } bithenge_random_access_blob_ops_t; 63 62 … … 87 86 * 88 87 * @memberof bithenge_blob_t 89 * @param blobThe blob.88 * @param self The blob. 90 89 * @param[out] size Total size of the blob. 91 90 * @return EOK on success or an error code from errno.h. 92 91 */ 93 int (*size)(bithenge_sequential_blob_t * blob, aoff64_t *size);92 int (*size)(bithenge_sequential_blob_t *self, aoff64_t *size); 94 93 95 94 /** Read the next part of the blob. If the requested data extends … … 97 96 * will be read. 98 97 * 99 * @param blobThe blob.98 * @param self The blob. 100 99 * @param[out] buffer Buffer to read into. If an error occurs, the contents are 101 100 * undefined. … … 105 104 * @return EOK on success or an error code from errno.h. 106 105 */ 107 int (*read)(bithenge_sequential_blob_t * blob, char *buffer,106 int (*read)(bithenge_sequential_blob_t *self, char *buffer, 108 107 aoff64_t *size); 109 108 110 109 /** Destroy the blob. 111 * @param blob The blob. 112 * @return EOK on success or an error code from errno.h. */ 113 int (*destroy)(bithenge_sequential_blob_t *blob); 110 * @param self The blob. */ 111 void (*destroy)(bithenge_sequential_blob_t *self); 114 112 } bithenge_sequential_blob_ops_t; 115 113 … … 117 115 * 118 116 * @memberof bithenge_blob_t 119 * @param blobThe blob.117 * @param self The blob. 120 118 * @param[out] size Total size of the blob. 121 119 * @return EOK on success or an error code from errno.h. 122 120 */ 123 static inline int bithenge_blob_size(bithenge_blob_t * blob, aoff64_t *size)124 { 125 assert( blob);126 assert( blob->base.blob_ops);127 return blob->base.blob_ops->size(blob, size);121 static inline int bithenge_blob_size(bithenge_blob_t *self, aoff64_t *size) 122 { 123 assert(self); 124 assert(self->base.blob_ops); 125 return self->base.blob_ops->size(self, size); 128 126 } 129 127 … … 134 132 * 135 133 * @memberof bithenge_blob_t 136 * @param blobThe blob.134 * @param self The blob. 137 135 * @param offset Byte offset within the blob. 138 136 * @param[out] buffer Buffer to read into. If an error occurs, the contents are … … 143 141 * @return EOK on success or an error code from errno.h. 144 142 */ 145 static inline int bithenge_blob_read(bithenge_blob_t * blob, aoff64_t offset,143 static inline int bithenge_blob_read(bithenge_blob_t *self, aoff64_t offset, 146 144 char *buffer, aoff64_t *size) 147 145 { 148 assert( blob);149 assert( blob->base.blob_ops);150 return blob->base.blob_ops->read(blob, offset, buffer, size);146 assert(self); 147 assert(self->base.blob_ops); 148 return self->base.blob_ops->read(self, offset, buffer, size); 151 149 } 152 150 … … 170 168 } 171 169 172 static inline int bithenge_blob_inc_ref(bithenge_blob_t *blob) 173 { 174 return bithenge_node_inc_ref(bithenge_blob_as_node(blob)); 175 } 176 177 static inline int bithenge_blob_dec_ref(bithenge_blob_t *blob) 178 { 179 if (!blob) 180 return EOK; 181 return bithenge_node_dec_ref(bithenge_blob_as_node(blob)); 182 } 183 184 int bithenge_new_random_access_blob(bithenge_blob_t *blob, 185 const bithenge_random_access_blob_ops_t *ops); 186 187 int bithenge_new_sequential_blob(bithenge_sequential_blob_t *blob, 188 const bithenge_sequential_blob_ops_t *ops); 189 190 int bithenge_new_blob_from_data(bithenge_node_t **out, const void *data, 191 size_t len); 192 193 int bithenge_new_blob_from_buffer(bithenge_node_t **out, const void *buffer, 194 size_t len, bool needs_free); 195 196 int bithenge_new_offset_blob(bithenge_node_t **out, bithenge_blob_t *blob, 197 aoff64_t offset); 198 199 int bithenge_new_subblob(bithenge_node_t **out, bithenge_blob_t *blob, 200 aoff64_t offset, aoff64_t size); 201 202 bool bithenge_blob_equal(bithenge_blob_t *a, bithenge_blob_t *b); 170 /** Increment a blob's reference count. 171 * @param blob The blob to reference. */ 172 static inline void bithenge_blob_inc_ref(bithenge_blob_t *blob) 173 { 174 bithenge_node_inc_ref(bithenge_blob_as_node(blob)); 175 } 176 177 /** Decrement a blob's reference count. 178 * @param blob The blob to dereference, or NULL. */ 179 static inline void bithenge_blob_dec_ref(bithenge_blob_t *blob) 180 { 181 if (blob) 182 bithenge_node_dec_ref(bithenge_blob_as_node(blob)); 183 } 184 185 int bithenge_init_random_access_blob(bithenge_blob_t *, 186 const bithenge_random_access_blob_ops_t *); 187 int bithenge_init_sequential_blob(bithenge_sequential_blob_t *, 188 const bithenge_sequential_blob_ops_t *); 189 int bithenge_new_blob_from_data(bithenge_node_t **, const void *, size_t); 190 int bithenge_new_blob_from_buffer(bithenge_node_t **, const void *, size_t, 191 bool); 192 int bithenge_new_offset_blob(bithenge_node_t **, bithenge_blob_t *, aoff64_t); 193 int bithenge_new_subblob(bithenge_node_t **, bithenge_blob_t *, aoff64_t, 194 aoff64_t); 195 bool bithenge_blob_equal(bithenge_blob_t *, bithenge_blob_t *); 203 196 204 197 #endif -
uspace/app/bithenge/file.c
r04a7435f r978ccaf1 55 55 } file_blob_t; 56 56 57 static inline file_blob_t * file_from_blob(bithenge_blob_t *base)57 static inline file_blob_t *blob_as_file(bithenge_blob_t *base) 58 58 { 59 59 return (file_blob_t *)base; 60 60 } 61 61 62 static inline bithenge_blob_t * blob_from_file(file_blob_t *blob)62 static inline bithenge_blob_t *file_as_blob(file_blob_t *blob) 63 63 { 64 64 return &blob->base; … … 67 67 static int file_size(bithenge_blob_t *base, aoff64_t *size) 68 68 { 69 file_blob_t *blob = file_from_blob(base);69 file_blob_t *blob = blob_as_file(base); 70 70 *size = blob->size; 71 71 return EOK; … … 75 75 aoff64_t *size) 76 76 { 77 file_blob_t *blob = file_from_blob(base);77 file_blob_t *blob = blob_as_file(base); 78 78 if (offset > blob->size) 79 79 return ELIMIT; … … 95 95 } 96 96 97 static intfile_destroy(bithenge_blob_t *base)97 static void file_destroy(bithenge_blob_t *base) 98 98 { 99 file_blob_t *blob = file_from_blob(base);99 file_blob_t *blob = blob_as_file(base); 100 100 close(blob->fd); 101 101 free(blob); 102 return EOK;103 102 } 104 103 … … 128 127 return ENOMEM; 129 128 } 130 rc = bithenge_new_random_access_blob(blob_from_file(blob), 131 &file_ops); 129 rc = bithenge_init_random_access_blob(file_as_blob(blob), &file_ops); 132 130 if (rc != EOK) { 133 131 free(blob); … … 143 141 #endif 144 142 blob->needs_close = needs_close; 145 *out = bithenge_blob_as_node( blob_from_file(blob));143 *out = bithenge_blob_as_node(file_as_blob(blob)); 146 144 147 145 return EOK; -
uspace/app/bithenge/helenos/block.c
r04a7435f r978ccaf1 51 51 } block_blob_t; 52 52 53 static inline block_blob_t *blo ck_from_blob(bithenge_blob_t *base)53 static inline block_blob_t *blob_as_block(bithenge_blob_t *base) 54 54 { 55 55 return (block_blob_t *)base; 56 56 } 57 57 58 static inline bithenge_blob_t *blo b_from_block(block_blob_t *blob)58 static inline bithenge_blob_t *block_as_blob(block_blob_t *blob) 59 59 { 60 60 return &blob->base; … … 63 63 static int block_size(bithenge_blob_t *base, aoff64_t *size) 64 64 { 65 block_blob_t * blob = block_from_blob(base);66 *size = blob->size;65 block_blob_t *self = blob_as_block(base); 66 *size = self->size; 67 67 return EOK; 68 68 } … … 71 71 aoff64_t *size) 72 72 { 73 block_blob_t * blob = block_from_blob(base);74 if (offset > blob->size)73 block_blob_t *self = blob_as_block(base); 74 if (offset > self->size) 75 75 return ELIMIT; 76 *size = min(*size, blob->size - offset);77 return block_read_bytes_direct( blob->service_id, offset, *size, buffer);76 *size = min(*size, self->size - offset); 77 return block_read_bytes_direct(self->service_id, offset, *size, buffer); 78 78 } 79 79 80 static intblock_destroy(bithenge_blob_t *base)80 static void block_destroy(bithenge_blob_t *base) 81 81 { 82 block_blob_t *blob = block_from_blob(base); 83 block_fini(blob->service_id); 84 free(blob); 85 return EOK; 82 block_blob_t *self = blob_as_block(base); 83 block_fini(self->service_id); 84 free(self); 86 85 } 87 86 … … 129 128 return ENOMEM; 130 129 } 131 rc = bithenge_ new_random_access_blob(blob_from_block(blob),130 rc = bithenge_init_random_access_blob(block_as_blob(blob), 132 131 &block_ops); 133 132 if (rc != EOK) { … … 138 137 blob->service_id = service_id; 139 138 blob->size = size; 140 *out = bithenge_blob_as_node(blo b_from_block(blob));139 *out = bithenge_blob_as_node(block_as_blob(blob)); 141 140 142 141 return EOK; -
uspace/app/bithenge/script.c
r04a7435f r978ccaf1 121 121 static void syntax_error(state_t *state, const char *message) 122 122 { 123 // Multiple errors areconfusing.123 // Printing multiple errors is confusing. 124 124 if (state->error == EOK) { 125 125 size_t start_char = state->old_buffer_pos + state->line_offset; … … 423 423 return rc; 424 424 } 425 426 /** @} 427 */ -
uspace/app/bithenge/script.h
r04a7435f r978ccaf1 40 40 #include "transform.h" 41 41 42 int bithenge_parse_script(const char * filename, bithenge_transform_t **out);42 int bithenge_parse_script(const char *, bithenge_transform_t **); 43 43 44 44 #endif 45 45 46 /** @ /46 /** @} 47 47 */ -
uspace/app/bithenge/source.c
r04a7435f r978ccaf1 78 78 } 79 79 80 /** Create a node from a source described with a string. For instance, 81 * "hex:55aa" will result in a blob node. If there is no colon in the string, 82 * it is assumed to be a filename. 83 * @param[out] out Stores the created node. 84 * @param source Specifies the node to be created. 85 * @return EOK on success or an error code from errno.h. */ 80 86 int bithenge_node_from_source(bithenge_node_t **out, const char *source) 81 87 { -
uspace/app/bithenge/source.h
r04a7435f r978ccaf1 40 40 #include "tree.h" 41 41 42 int bithenge_node_from_source(bithenge_node_t ** out, const char *source);42 int bithenge_node_from_source(bithenge_node_t **, const char *); 43 43 44 44 #endif -
uspace/app/bithenge/transform.c
r04a7435f r978ccaf1 42 42 43 43 /** Initialize a new transform. 44 * @param[out] xformTransform to initialize.44 * @param[out] self Transform to initialize. 45 45 * @param[in] ops Operations provided by the transform. 46 46 * @return EOK or an error code from errno.h. */ 47 int bithenge_ new_transform(bithenge_transform_t *xform,47 int bithenge_init_transform(bithenge_transform_t *self, 48 48 const bithenge_transform_ops_t *ops) 49 49 { … … 51 51 assert(ops->apply); 52 52 assert(ops->destroy); 53 xform->ops = ops;54 xform->refs = 1;55 return EOK; 56 } 57 58 static int transform_indestructible(bithenge_transform_t *xform)53 self->ops = ops; 54 self->refs = 1; 55 return EOK; 56 } 57 58 static void transform_indestructible(bithenge_transform_t *self) 59 59 { 60 60 assert(false); 61 return EOK; 62 } 63 64 static int uint32le_apply(bithenge_transform_t *xform, bithenge_node_t *in, 61 } 62 63 static int uint32le_apply(bithenge_transform_t *self, bithenge_node_t *in, 65 64 bithenge_node_t **out) 66 65 { … … 82 81 } 83 82 84 static int uint32be_apply(bithenge_transform_t * xform, bithenge_node_t *in,83 static int uint32be_apply(bithenge_transform_t *self, bithenge_node_t *in, 85 84 bithenge_node_t **out) 86 85 { … … 102 101 } 103 102 104 static int prefix_length_4(bithenge_transform_t * xform, bithenge_blob_t *blob,103 static int prefix_length_4(bithenge_transform_t *self, bithenge_blob_t *blob, 105 104 aoff64_t *out) 106 105 { … … 266 265 } 267 266 268 static intstruct_node_destroy(bithenge_node_t *base)267 static void struct_node_destroy(bithenge_node_t *base) 269 268 { 270 269 struct_node_t *node = node_as_struct(base); … … 272 271 bithenge_blob_dec_ref(node->blob); 273 272 free(node); 274 return EOK;275 273 } 276 274 … … 280 278 }; 281 279 282 static int struct_transform_apply(bithenge_transform_t * xform,280 static int struct_transform_apply(bithenge_transform_t *base, 283 281 bithenge_node_t *in, bithenge_node_t **out) 284 282 { 285 struct_transform_t *s truct_transform = transform_as_struct(xform);283 struct_transform_t *self = transform_as_struct(base); 286 284 if (bithenge_node_type(in) != BITHENGE_NODE_BLOB) 287 285 return EINVAL; … … 295 293 return rc; 296 294 } 297 bithenge_transform_inc_ref( xform);298 node->transform = s truct_transform;295 bithenge_transform_inc_ref(base); 296 node->transform = self; 299 297 bithenge_node_inc_ref(in); 300 298 node->blob = bithenge_node_as_blob(in); … … 303 301 } 304 302 305 static int struct_transform_prefix_length(bithenge_transform_t * xform,303 static int struct_transform_prefix_length(bithenge_transform_t *base, 306 304 bithenge_blob_t *blob, aoff64_t *out) 307 305 { 308 struct_transform_t *s truct_transform = transform_as_struct(xform);306 struct_transform_t *self = transform_as_struct(base); 309 307 int rc = EOK; 310 308 bithenge_node_t *node; … … 316 314 blob = bithenge_node_as_blob(node); 317 315 *out = 0; 318 for (size_t i = 0; s truct_transform->subtransforms[i].transform; i++) {316 for (size_t i = 0; self->subtransforms[i].transform; i++) { 319 317 bithenge_transform_t *subxform = 320 s truct_transform->subtransforms[i].transform;318 self->subtransforms[i].transform; 321 319 aoff64_t sub_size; 322 320 rc = bithenge_transform_prefix_length(subxform, blob, &sub_size); … … 344 342 } 345 343 346 static int struct_transform_destroy(bithenge_transform_t *xform) 347 { 348 struct_transform_t *struct_transform = transform_as_struct(xform); 349 free_subtransforms(struct_transform->subtransforms); 350 free(struct_transform); 351 return EOK; 344 static void struct_transform_destroy(bithenge_transform_t *base) 345 { 346 struct_transform_t *self = transform_as_struct(base); 347 free_subtransforms(self->subtransforms); 348 free(self); 352 349 } 353 350 … … 370 367 { 371 368 int rc; 372 struct_transform_t *s truct_transform=373 malloc(sizeof(*s truct_transform));374 if (!s truct_transform) {369 struct_transform_t *self = 370 malloc(sizeof(*self)); 371 if (!self) { 375 372 rc = ENOMEM; 376 373 goto error; 377 374 } 378 rc = bithenge_ new_transform(struct_as_transform(struct_transform),375 rc = bithenge_init_transform(struct_as_transform(self), 379 376 &struct_transform_ops); 380 377 if (rc != EOK) 381 378 goto error; 382 s truct_transform->subtransforms = subtransforms;383 *out = struct_as_transform(s truct_transform);379 self->subtransforms = subtransforms; 380 *out = struct_as_transform(self); 384 381 return EOK; 385 382 error: 386 383 free_subtransforms(subtransforms); 387 free(s truct_transform);384 free(self); 388 385 return rc; 389 386 } -
uspace/app/bithenge/transform.h
r04a7435f r978ccaf1 51 51 typedef struct bithenge_transform_ops { 52 52 /** @copydoc bithenge_transform_t::bithenge_transform_apply */ 53 int (*apply)(bithenge_transform_t * xform, bithenge_node_t *in, bithenge_node_t **out);53 int (*apply)(bithenge_transform_t *self, bithenge_node_t *in, bithenge_node_t **out); 54 54 /** @copydoc bithenge_transform_t::bithenge_transform_prefix_length */ 55 int (*prefix_length)(bithenge_transform_t * xform, bithenge_blob_t *blob, aoff64_t *out);55 int (*prefix_length)(bithenge_transform_t *self, bithenge_blob_t *blob, aoff64_t *out); 56 56 /** Destroy the transform. 57 * @param xform The transform. 58 * @return EOK on success or an error code from errno.h. */ 59 int (*destroy)(bithenge_transform_t *xform); 57 * @param self The transform. */ 58 void (*destroy)(bithenge_transform_t *self); 60 59 } bithenge_transform_ops_t; 61 60 62 61 /** Apply a transform. 63 62 * @memberof bithenge_transform_t 64 * @param xformThe transform.63 * @param self The transform. 65 64 * @param in The input tree. 66 65 * @param[out] out Where the output tree will be stored. 67 66 * @return EOK on success or an error code from errno.h. */ 68 static inline int bithenge_transform_apply(bithenge_transform_t * xform,67 static inline int bithenge_transform_apply(bithenge_transform_t *self, 69 68 bithenge_node_t *in, bithenge_node_t **out) 70 69 { 71 assert( xform);72 assert( xform->ops);73 return xform->ops->apply(xform, in, out);70 assert(self); 71 assert(self->ops); 72 return self->ops->apply(self, in, out); 74 73 } 75 74 … … 79 78 * subtransforms. 80 79 * @memberof bithenge_transform_t 81 * @param xformThe transform.80 * @param self The transform. 82 81 * @param blob The blob. 83 82 * @param[out] out Where the prefix length will be stored. 84 83 * @return EOK on success, ENOTSUP if not supported, or another error code from 85 84 * errno.h. */ 86 static inline int bithenge_transform_prefix_length(bithenge_transform_t * xform,85 static inline int bithenge_transform_prefix_length(bithenge_transform_t *self, 87 86 bithenge_blob_t *blob, aoff64_t *out) 88 87 { 89 assert( xform);90 assert( xform->ops);91 if (! xform->ops->prefix_length)88 assert(self); 89 assert(self->ops); 90 if (!self->ops->prefix_length) 92 91 return ENOTSUP; 93 return xform->ops->prefix_length(xform, blob, out);92 return self->ops->prefix_length(self, blob, out); 94 93 } 95 94 96 95 /** Increment a transform's reference count. 97 * @param xform The transform to reference. 98 * @return EOK on success or an error code from errno.h. */ 99 static inline int bithenge_transform_inc_ref(bithenge_transform_t *xform) 96 * @param self The transform to reference. */ 97 static inline void bithenge_transform_inc_ref(bithenge_transform_t *self) 100 98 { 101 assert(xform); 102 xform->refs++; 103 return EOK; 99 assert(self); 100 self->refs++; 104 101 } 105 102 106 103 /** Decrement a transform's reference count and free it if appropriate. 107 * @param xform The transform to dereference, or NULL. 108 * @return EOK on success or an error code from errno.h. */ 109 static inline int bithenge_transform_dec_ref(bithenge_transform_t *xform) 104 * @param self The transform to dereference, or NULL. */ 105 static inline void bithenge_transform_dec_ref(bithenge_transform_t *self) 110 106 { 111 if (!xform) 112 return EOK; 113 assert(xform->ops); 114 if (--xform->refs == 0) 115 return xform->ops->destroy(xform); 116 return EOK; 107 if (!self) 108 return; 109 assert(self->ops); 110 if (--self->refs == 0) 111 self->ops->destroy(self); 117 112 } 118 113 … … 127 122 extern bithenge_named_transform_t *bithenge_primitive_transforms; 128 123 129 int bithenge_ new_transform(bithenge_transform_t *xform,124 int bithenge_init_transform(bithenge_transform_t *self, 130 125 const bithenge_transform_ops_t *ops); 131 126 -
uspace/app/bithenge/tree.c
r04a7435f r978ccaf1 41 41 #include "tree.h" 42 42 43 static intblob_destroy(bithenge_node_t *base)44 { 45 bithenge_blob_t * blob= bithenge_node_as_blob(base);46 assert( blob->base.blob_ops);47 return blob->base.blob_ops->destroy(blob);48 } 49 50 static int node_destroy(bithenge_node_t *node)51 { 52 switch (bithenge_node_type( node)) {43 static void blob_destroy(bithenge_node_t *base) 44 { 45 bithenge_blob_t *self = bithenge_node_as_blob(base); 46 assert(self->base.blob_ops); 47 self->base.blob_ops->destroy(self); 48 } 49 50 static void node_destroy(bithenge_node_t *self) 51 { 52 switch (bithenge_node_type(self)) { 53 53 case BITHENGE_NODE_BLOB: 54 return blob_destroy(node); 54 blob_destroy(self); 55 return; 55 56 case BITHENGE_NODE_STRING: 56 if ( node->string_value.needs_free)57 free((void *) node->string_value.ptr);57 if (self->string_value.needs_free) 58 free((void *)self->string_value.ptr); 58 59 break; 59 60 case BITHENGE_NODE_INTERNAL: 60 return node->internal_ops->destroy(node); 61 self->internal_ops->destroy(self); 62 return; 61 63 case BITHENGE_NODE_BOOLEAN: 62 return EOK; // the boolean nodes are allocated statically below64 return; /* The boolean nodes are allocated statically below. */ 63 65 case BITHENGE_NODE_INTEGER: /* pass-through */ 64 66 break; 65 67 } 66 free(node); 67 return EOK; 68 free(self); 68 69 } 69 70 70 71 /** Decrement a node's reference count and free it if appropriate. 71 72 * @memberof bithenge_node_t 72 * @param node The node to dereference, or NULL. 73 * @return EOK on success or an error code from errno.h. */ 74 int bithenge_node_dec_ref(bithenge_node_t *node) 73 * @param node The node to dereference, or NULL. */ 74 void bithenge_node_dec_ref(bithenge_node_t *node) 75 75 { 76 76 if (!node) 77 return EOK;77 return; 78 78 if (--node->refs == 0) 79 return node_destroy(node); 80 return EOK; 79 node_destroy(node); 81 80 } 82 81 … … 103 102 { 104 103 int rc; 105 simple_internal_node_t * node= node_as_simple(base);106 for (bithenge_int_t i = 0; i < node->len; i++) {107 bithenge_node_inc_ref( node->nodes[2*i+0]);108 bithenge_node_inc_ref( node->nodes[2*i+1]);109 rc = func( node->nodes[2*i+0], node->nodes[2*i+1], data);104 simple_internal_node_t *self = node_as_simple(base); 105 for (bithenge_int_t i = 0; i < self->len; i++) { 106 bithenge_node_inc_ref(self->nodes[2*i+0]); 107 bithenge_node_inc_ref(self->nodes[2*i+1]); 108 rc = func(self->nodes[2*i+0], self->nodes[2*i+1], data); 110 109 if (rc != EOK) 111 110 return rc; … … 114 113 } 115 114 116 static int simple_internal_node_destroy(bithenge_node_t *base) 117 { 118 int rc; 119 simple_internal_node_t *node = node_as_simple(base); 120 for (bithenge_int_t i = 0; i < 2 * node->len; i++) { 121 rc = bithenge_node_dec_ref(node->nodes[i]); 122 if (rc != EOK) 123 return rc; 124 } 125 if (node->needs_free) 126 free(node->nodes); 127 free(node); 128 return EOK; 115 static void simple_internal_node_destroy(bithenge_node_t *base) 116 { 117 simple_internal_node_t *self = node_as_simple(base); 118 for (bithenge_int_t i = 0; i < 2 * self->len; i++) 119 bithenge_node_dec_ref(self->nodes[i]); 120 if (self->needs_free) 121 free(self->nodes); 122 free(self); 129 123 } 130 124 … … 136 130 /** Initialize an internal node. 137 131 * @memberof bithenge_node_t 138 * @param[out] nodeThe node.132 * @param[out] self The node. 139 133 * @param[in] ops The operations provided. 140 134 * @return EOK on success or an error code from errno.h. */ 141 int bithenge_init_internal_node(bithenge_node_t * node,135 int bithenge_init_internal_node(bithenge_node_t *self, 142 136 const bithenge_internal_node_ops_t *ops) 143 137 { 144 node->type = BITHENGE_NODE_INTERNAL;145 node->refs = 1;146 node->internal_ops = ops;138 self->type = BITHENGE_NODE_INTERNAL; 139 self->refs = 1; 140 self->internal_ops = ops; 147 141 return EOK; 148 142 } … … 164 158 int rc; 165 159 assert(out); 166 simple_internal_node_t * node = malloc(sizeof(*node));167 if (! node) {160 simple_internal_node_t *self = malloc(sizeof(*self)); 161 if (!self) { 168 162 rc = ENOMEM; 169 163 goto error; 170 164 } 171 rc = bithenge_init_internal_node(simple_as_node( node),165 rc = bithenge_init_internal_node(simple_as_node(self), 172 166 &simple_internal_node_ops); 173 167 if (rc != EOK) 174 168 goto error; 175 node->nodes = nodes;176 node->len = len;177 node->needs_free = needs_free;178 *out = simple_as_node( node);169 self->nodes = nodes; 170 self->len = len; 171 self->needs_free = needs_free; 172 *out = simple_as_node(self); 179 173 return EOK; 180 174 error: … … 183 177 if (needs_free) 184 178 free(nodes); 185 free( node);179 free(self); 186 180 return rc; 187 181 } … … 211 205 { 212 206 assert(out); 213 bithenge_node_t * node = malloc(sizeof(*node));214 if (! node)207 bithenge_node_t *self = malloc(sizeof(*self)); 208 if (!self) 215 209 return ENOMEM; 216 node->type = BITHENGE_NODE_INTEGER;217 node->refs = 1;218 node->integer_value = value;219 *out = node;210 self->type = BITHENGE_NODE_INTEGER; 211 self->refs = 1; 212 self->integer_value = value; 213 *out = self; 220 214 return EOK; 221 215 } … … 231 225 { 232 226 assert(out); 233 bithenge_node_t * node = malloc(sizeof(*node));234 if (! node)227 bithenge_node_t *self = malloc(sizeof(*self)); 228 if (!self) 235 229 return ENOMEM; 236 node->type = BITHENGE_NODE_STRING;237 node->refs = 1;238 node->string_value.ptr = value;239 node->string_value.needs_free = needs_free;240 *out = node;230 self->type = BITHENGE_NODE_STRING; 231 self->refs = 1; 232 self->string_value.ptr = value; 233 self->string_value.needs_free = needs_free; 234 *out = self; 241 235 return EOK; 242 236 } -
uspace/app/bithenge/tree.h
r04a7435f r978ccaf1 93 93 typedef struct bithenge_internal_node_ops_t { 94 94 /** @copydoc bithenge_node_t::bithenge_node_for_each */ 95 int (*for_each)(bithenge_node_t *node, bithenge_for_each_func_t func, void *data); 96 /** @copydoc bithenge_node_t::bithenge_node_destroy */ 97 int (*destroy)(bithenge_node_t *node); 95 int (*for_each)(bithenge_node_t *self, bithenge_for_each_func_t func, void *data); 96 /** Destroys the internal node. 97 * @param self The node to destroy. */ 98 void (*destroy)(bithenge_node_t *self); 98 99 } bithenge_internal_node_ops_t; 99 100 … … 109 110 /** Increment a node's reference count. 110 111 * @memberof bithenge_node_t 111 * @param node The node to reference. 112 * @return EOK on success or an error code from errno.h. */ 113 static inline int bithenge_node_inc_ref(bithenge_node_t *node) 112 * @param node The node to reference. */ 113 static inline void bithenge_node_inc_ref(bithenge_node_t *node) 114 114 { 115 115 assert(node); 116 116 node->refs++; 117 return EOK;118 117 } 119 118 120 intbithenge_node_dec_ref(bithenge_node_t *node);119 void bithenge_node_dec_ref(bithenge_node_t *node); 121 120 122 121 /** Iterate over a node's children. 123 122 * @memberof bithenge_node_t 124 * @param nodeThe internal node to iterate over.123 * @param self The internal node to iterate over. 125 124 * @param func The callback function. 126 125 * @param data Data to provide to the callback function. 127 126 * @return EOK on success or an error code from errno.h. */ 128 static inline int bithenge_node_for_each(bithenge_node_t *node, bithenge_for_each_func_t func, void *data) 127 static inline int bithenge_node_for_each(bithenge_node_t *self, 128 bithenge_for_each_func_t func, void *data) 129 129 { 130 assert( node->type == BITHENGE_NODE_INTERNAL);131 return node->internal_ops->for_each(node, func, data);130 assert(self->type == BITHENGE_NODE_INTERNAL); 131 return self->internal_ops->for_each(self, func, data); 132 132 } 133 133 134 134 /** Get the value of a boolean node. 135 135 * @memberof bithenge_node_t 136 * @param nodeThe boolean node.136 * @param self The boolean node. 137 137 * @return The node's value. */ 138 static inline bool bithenge_boolean_node_value(bithenge_node_t * node)138 static inline bool bithenge_boolean_node_value(bithenge_node_t *self) 139 139 { 140 assert( node->type == BITHENGE_NODE_BOOLEAN);141 return node->boolean_value;140 assert(self->type == BITHENGE_NODE_BOOLEAN); 141 return self->boolean_value; 142 142 } 143 143 144 144 /** Get the value of an integer node. 145 145 * @memberof bithenge_node_t 146 * @param nodeThe integer node.146 * @param self The integer node. 147 147 * @return The node's value. */ 148 static inline bithenge_int_t bithenge_integer_node_value(bithenge_node_t * node)148 static inline bithenge_int_t bithenge_integer_node_value(bithenge_node_t *self) 149 149 { 150 assert( node->type == BITHENGE_NODE_INTEGER);151 return node->integer_value;150 assert(self->type == BITHENGE_NODE_INTEGER); 151 return self->integer_value; 152 152 } 153 153 154 154 /** Get the value of an string node. 155 155 * @memberof bithenge_node_t 156 * @param nodeThe string node.156 * @param self The string node. 157 157 * @return The node's value. */ 158 static inline const char *bithenge_string_node_value(bithenge_node_t * node)158 static inline const char *bithenge_string_node_value(bithenge_node_t *self) 159 159 { 160 assert( node->type == BITHENGE_NODE_STRING);161 return node->string_value.ptr;160 assert(self->type == BITHENGE_NODE_STRING); 161 return self->string_value.ptr; 162 162 } 163 163
Note:
See TracChangeset
for help on using the changeset viewer.