Changeset 5c925ce in mainline
- Timestamp:
- 2012-06-07T17:00:12Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8375d0eb
- Parents:
- 5f679702
- Location:
- uspace/app/bithenge
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/blob.c
r5f679702 r5c925ce 42 42 #include <stdlib.h> 43 43 #include "blob.h" 44 #include "tree.h" 44 45 45 46 /** Initialize a random access blob. … … 59 60 assert(ops->size); 60 61 61 blob->ops = ops; 62 blob->base.type = BITHENGE_NODE_BLOB; 63 blob->base.blob_ops = ops; 62 64 return EOK; 63 65 } … … 234 236 * @param len The length of the data. 235 237 * @return EOK on success or an error code from errno.h. */ 236 int bithenge_new_blob_from_data(bithenge_ blob_t **out, const void *data,238 int bithenge_new_blob_from_data(bithenge_node_t **out, const void *data, 237 239 size_t len) 238 240 { … … 258 260 blob->size = len; 259 261 blob->needs_free = true; 260 *out = b lob_from_memory(blob);262 *out = bithenge_blob_as_node(blob_from_memory(blob)); 261 263 return EOK; 262 264 } … … 273 275 * blob is destroyed. 274 276 * @return EOK on success or an error code from errno.h. */ 275 int bithenge_new_blob_from_buffer(bithenge_ blob_t **out, const void *buffer,277 int bithenge_new_blob_from_buffer(bithenge_node_t **out, const void *buffer, 276 278 size_t len, bool needs_free) 277 279 { … … 291 293 blob->size = len; 292 294 blob->needs_free = needs_free; 293 *out = b lob_from_memory(blob);295 *out = bithenge_blob_as_node(blob_from_memory(blob)); 294 296 return EOK; 295 297 } -
uspace/app/bithenge/blob.h
r5f679702 r5c925ce 39 39 40 40 #include <sys/types.h> 41 #include "tree.h" 41 42 42 43 /** A blob of raw binary data. */ 43 44 typedef struct { 44 45 /** @privatesection */ 45 /** Operations providing random access. */ 46 const struct bithenge_random_access_blob_ops_t *ops; 46 struct bithenge_node_t base; 47 47 } bithenge_blob_t; 48 48 … … 121 121 { 122 122 assert(blob); 123 assert(blob-> ops);124 return blob-> ops->size(blob, size);123 assert(blob->base.blob_ops); 124 return blob->base.blob_ops->size(blob, size); 125 125 } 126 126 … … 144 144 { 145 145 assert(blob); 146 assert(blob-> ops);147 return blob-> ops->read(blob, offset, buffer, size);146 assert(blob->base.blob_ops); 147 return blob->base.blob_ops->read(blob, offset, buffer, size); 148 148 } 149 149 150 /** Destroy the blob. 151 * @memberof bithenge_blob_t 152 * @param blob The blob. 153 * @return EOK on success or an error code from errno.h. 154 */ 155 static inline int bithenge_blob_destroy(bithenge_blob_t *blob) 150 static inline bithenge_node_t *bithenge_blob_as_node(bithenge_blob_t *blob) 156 151 { 157 assert(blob); 158 assert(blob->ops); 159 return blob->ops->destroy(blob); 152 return &blob->base; 153 } 154 155 static inline bithenge_blob_t *bithenge_node_as_blob(bithenge_node_t *node) 156 { 157 return (bithenge_blob_t *)node; 160 158 } 161 159 … … 166 164 const bithenge_sequential_blob_ops_t *ops); 167 165 168 int bithenge_new_blob_from_data(bithenge_ blob_t **out, const void *data,166 int bithenge_new_blob_from_data(bithenge_node_t **out, const void *data, 169 167 size_t len); 170 168 171 int bithenge_new_blob_from_buffer(bithenge_ blob_t **out, const void *buffer,169 int bithenge_new_blob_from_buffer(bithenge_node_t **out, const void *buffer, 172 170 size_t len, bool needs_free); 173 171 -
uspace/app/bithenge/block.c
r5f679702 r5c925ce 97 97 * @param service_id The service ID of the block device. 98 98 * @return EOK on success or an error code from errno.h. */ 99 int bithenge_new_block_blob(bithenge_ blob_t **out, service_id_t service_id)99 int bithenge_new_block_blob(bithenge_node_t **out, service_id_t service_id) 100 100 { 101 101 assert(out); … … 138 138 blob->service_id = service_id; 139 139 blob->size = size; 140 *out = b lob_from_block(blob);140 *out = bithenge_blob_as_node(blob_from_block(blob)); 141 141 142 142 return EOK; -
uspace/app/bithenge/block.h
r5f679702 r5c925ce 41 41 #include "blob.h" 42 42 43 int bithenge_new_block_blob(bithenge_ blob_t **, service_id_t);43 int bithenge_new_block_blob(bithenge_node_t **, service_id_t); 44 44 45 45 #endif -
uspace/app/bithenge/file.c
r5f679702 r5c925ce 97 97 }; 98 98 99 static int new_file_blob(bithenge_ blob_t **out, int fd, bool needs_close)99 static int new_file_blob(bithenge_node_t **out, int fd, bool needs_close) 100 100 { 101 101 assert(out); … … 127 127 blob->size = stat.size; 128 128 blob->needs_close = needs_close; 129 *out = b lob_from_file(blob);129 *out = bithenge_blob_as_node(blob_from_file(blob)); 130 130 131 131 return EOK; … … 137 137 * @param filename The name of the file. 138 138 * @return EOK on success or an error code from errno.h. */ 139 int bithenge_new_file_blob(bithenge_ blob_t **out, const char *filename)139 int bithenge_new_file_blob(bithenge_node_t **out, const char *filename) 140 140 { 141 141 assert(filename); … … 153 153 * @param fd The file descriptor. 154 154 * @return EOK on success or an error code from errno.h. */ 155 int bithenge_new_file_blob_from_fd(bithenge_ blob_t **out, int fd)155 int bithenge_new_file_blob_from_fd(bithenge_node_t **out, int fd) 156 156 { 157 157 return new_file_blob(out, fd, false); … … 163 163 * @param file The file pointer. 164 164 * @return EOK on success or an error code from errno.h. */ 165 int bithenge_new_file_blob_from_file(bithenge_ blob_t **out, FILE *file)165 int bithenge_new_file_blob_from_file(bithenge_node_t **out, FILE *file) 166 166 { 167 167 int fd = fileno(file); -
uspace/app/bithenge/file.h
r5f679702 r5c925ce 41 41 #include "blob.h" 42 42 43 int bithenge_new_file_blob(bithenge_ blob_t **, const char *);44 int bithenge_new_file_blob_from_fd(bithenge_ blob_t **, int);45 int bithenge_new_file_blob_from_file(bithenge_ blob_t **, FILE *);43 int bithenge_new_file_blob(bithenge_node_t **, const char *); 44 int bithenge_new_file_blob_from_fd(bithenge_node_t **, int); 45 int bithenge_new_file_blob_from_file(bithenge_node_t **, FILE *); 46 46 47 47 #endif -
uspace/app/bithenge/print.c
r5f679702 r5c925ce 37 37 #include <errno.h> 38 38 #include <stdio.h> 39 #include "blob.h" 39 40 #include "print.h" 40 41 #include "tree.h" … … 120 121 } 121 122 123 static int print_blob(bithenge_print_type_t type, bithenge_node_t *node) 124 { 125 bithenge_blob_t *blob = bithenge_node_as_blob(node); 126 aoff64_t pos = 0; 127 char buffer[1024]; 128 aoff64_t size = sizeof(buffer); 129 int rc; 130 printf(type == BITHENGE_PRINT_PYTHON ? "b\"" : "\""); 131 do { 132 rc = bithenge_blob_read(blob, pos, buffer, &size); 133 if (rc != EOK) 134 return rc; 135 for (aoff64_t i = 0; i < size; i++) 136 printf("\\x%02x", buffer[i]); 137 pos += size; 138 } while (size == sizeof(buffer)); 139 printf("\""); 140 return EOK; 141 } 142 122 143 int bithenge_print_node(bithenge_print_type_t type, bithenge_node_t *tree) 123 144 { … … 133 154 case BITHENGE_NODE_STRING: 134 155 return print_string(type, tree); 156 case BITHENGE_NODE_BLOB: 157 return print_blob(type, tree); 135 158 } 136 159 return ENOTSUP; -
uspace/app/bithenge/test.c
r5f679702 r5c925ce 53 53 54 54 static void 55 print_blob(bithenge_ blob_t *blob)55 print_blob(bithenge_node_t *node) 56 56 { 57 bithenge_blob_t *blob = bithenge_node_as_blob(node); 57 58 aoff64_t size; 58 59 bithenge_blob_size(blob, &size); … … 66 67 int main(int argc, char *argv[]) 67 68 { 68 bithenge_ blob_t *blob;69 bithenge_node_t *node; 69 70 70 71 service_id_t service_id; 71 72 loc_service_get_id("bd/initrd", &service_id, 0); 72 bithenge_new_block_blob(& blob, service_id);73 bithenge_new_block_blob(&node, service_id); 73 74 printf("Data from block:bd/initrd: "); 74 print_blob( blob);75 bithenge_ blob_destroy(blob);75 print_blob(node); 76 bithenge_node_destroy(node); 76 77 77 78 const char data[] = "'Twas brillig, and the slithy toves"; 78 bithenge_new_blob_from_data(& blob, data, sizeof(data));79 bithenge_new_blob_from_data(&node, data, sizeof(data)); 79 80 printf("Data from memory (from_data): "); 80 print_blob( blob);81 bithenge_ blob_destroy(blob);81 print_blob(node); 82 bithenge_node_destroy(node); 82 83 83 bithenge_new_blob_from_buffer(& blob, data, sizeof(data), false);84 bithenge_new_blob_from_buffer(&node, data, sizeof(data), false); 84 85 printf("Data from memory (from_buffer): "); 85 print_blob( blob);86 bithenge_ blob_destroy(blob);86 print_blob(node); 87 bithenge_node_destroy(node); 87 88 88 bithenge_new_file_blob(& blob, "/textdemo");89 bithenge_new_file_blob(&node, "/textdemo"); 89 90 printf("Data from file:/textdemo: "); 90 print_blob( blob);91 bithenge_ blob_destroy(blob);91 print_blob(node); 92 bithenge_node_destroy(node); 92 93 93 bithenge_new_file_blob_from_fd(& blob, 0);94 bithenge_new_file_blob_from_fd(&node, 0); 94 95 printf("Data from fd:0: "); 95 print_blob( blob);96 bithenge_ blob_destroy(blob);96 print_blob(node); 97 bithenge_node_destroy(node); 97 98 98 // {True: {}, -1351: "zero", "true": False, 0: 17} 99 bithenge_node_t *node; 99 // {True: {}, -1351: "\"false\"", "true": False, 0: b"..."} 100 100 bithenge_node_t *nodes[8]; 101 101 bithenge_new_boolean_node(&nodes[0], true); 102 102 bithenge_new_simple_internal_node(&nodes[1], NULL, 0, false); 103 103 bithenge_new_integer_node(&nodes[2], -1351); 104 bithenge_new_string_node(&nodes[3], " zero", false);104 bithenge_new_string_node(&nodes[3], "\"false\"", false); 105 105 bithenge_new_string_node(&nodes[4], "true", false); 106 106 bithenge_new_boolean_node(&nodes[5], false); 107 107 bithenge_new_integer_node(&nodes[6], 0); 108 bithenge_new_ integer_node(&nodes[7], 17);108 bithenge_new_blob_from_data(&nodes[7], data, sizeof(data)); 109 109 bithenge_new_simple_internal_node(&node, nodes, 4, false); 110 110 bithenge_print_node(BITHENGE_PRINT_PYTHON, node); -
uspace/app/bithenge/tree.c
r5f679702 r5c925ce 37 37 #include <errno.h> 38 38 #include <stdlib.h> 39 #include "blob.h" 39 40 #include "tree.h" 41 42 static int blob_destroy(bithenge_node_t *base) 43 { 44 bithenge_blob_t *blob = bithenge_node_as_blob(base); 45 assert(blob->base.blob_ops); 46 return blob->base.blob_ops->destroy(blob); 47 } 40 48 41 49 int bithenge_node_destroy(bithenge_node_t *node) 42 50 { 43 51 switch (bithenge_node_type(node)) { 52 case BITHENGE_NODE_BLOB: 53 return blob_destroy(node); 44 54 case BITHENGE_NODE_STRING: 45 55 if (node->string_value.needs_free) … … 47 57 break; 48 58 case BITHENGE_NODE_INTERNAL: 49 /* TODO */ 50 break; 59 return node->internal_ops->destroy(node); 51 60 case BITHENGE_NODE_BOOLEAN: 52 61 return EOK; // the boolean nodes are allocated statically below … … 84 93 } 85 94 95 static int simple_internal_node_destroy(bithenge_node_t *base) 96 { 97 int rc; 98 simple_internal_node_t *node = node_as_simple(base); 99 for (bithenge_int_t i = 0; i < node->len; i++) { 100 rc = bithenge_node_destroy(node->nodes[2*i+0]); 101 if (rc != EOK) 102 return rc; 103 rc = bithenge_node_destroy(node->nodes[2*i+1]); 104 if (rc != EOK) 105 return rc; 106 } 107 if (node->needs_free) 108 free(node->nodes); 109 free(node); 110 return EOK; 111 } 112 86 113 static bithenge_internal_node_ops_t simple_internal_node_ops = { 87 .for_each = simple_internal_node_for_each 114 .for_each = simple_internal_node_for_each, 115 .destroy = simple_internal_node_destroy, 88 116 }; 89 117 -
uspace/app/bithenge/tree.h
r5f679702 r5c925ce 57 57 BITHENGE_NODE_INTEGER, 58 58 BITHENGE_NODE_STRING, 59 // TODO:BITHENGE_NODE_BLOB,59 BITHENGE_NODE_BLOB, 60 60 } bithenge_node_type_t; 61 61 … … 63 63 bithenge_node_type_t type; 64 64 union { 65 struct bithenge_internal_node_ops_t *internal_ops;65 const struct bithenge_internal_node_ops_t *internal_ops; 66 66 bool boolean_value; 67 67 bithenge_int_t integer_value; … … 70 70 bool needs_free; 71 71 } string_value; 72 const struct bithenge_random_access_blob_ops_t *blob_ops; 72 73 }; 73 74 } bithenge_node_t; … … 82 83 typedef struct bithenge_internal_node_ops_t { 83 84 int (*for_each)(bithenge_node_t *node, bithenge_for_each_func_t func, void *data); 85 int (*destroy)(bithenge_node_t *node); 84 86 } bithenge_internal_node_ops_t; 85 87 86 88 static inline int bithenge_node_for_each(bithenge_node_t *node, bithenge_for_each_func_t func, void *data) 87 89 { 90 assert(node->type == BITHENGE_NODE_INTERNAL); 88 91 return node->internal_ops->for_each(node, func, data); 89 92 } … … 91 94 static inline bool bithenge_boolean_node_value(bithenge_node_t *node) 92 95 { 96 assert(node->type == BITHENGE_NODE_BOOLEAN); 93 97 return node->boolean_value; 94 98 } … … 96 100 static inline bithenge_int_t bithenge_integer_node_value(bithenge_node_t *node) 97 101 { 102 assert(node->type == BITHENGE_NODE_INTEGER); 98 103 return node->integer_value; 99 104 } … … 101 106 static inline const char *bithenge_string_node_value(bithenge_node_t *node) 102 107 { 108 assert(node->type == BITHENGE_NODE_STRING); 103 109 return node->string_value.ptr; 104 110 }
Note:
See TracChangeset
for help on using the changeset viewer.