diff options
Diffstat (limited to 'cudl.c')
-rw-r--r-- | cudl.c | 70 |
1 files changed, 70 insertions, 0 deletions
@@ -0,0 +1,70 @@ +#include <stdio.h> + +union cudl_val_uni { + double num; + char *str; + size_t offset; +}; + +struct cudl_val { + uint64_t tag; + union cudl_val_uni data; +}; + +struct cudl_doc { + struct cudl_val *root; + size_t length; + size_t capacity; + char *strings; +}; + +#define CUDL_TAG_NULL 0 +#define CUDL_TAG_ARRAY 1 + +#define CUDL_GET_TAG(tag) ((tag) >> 56) + +#define CUDL_OK 0 +#define CUDL_ERR_OUT_OF_MEMORY 1 +#define CUDL_ERR_MISSING_VALUE 2 + +#define BUFFER_LEN 1024 + +static FILE file; +static char buffer[BUFFER_LEN]; + +void cudl_debug(struct cudl_doc doc) { + int i; + for (i = 0; i < doc.length; i++) { + switch (CUDL_GET_TAG(doc.root[i].tag)) { + case CUDL_TAG_NULL: + fprintf(stderr, "null\n"); + break; + case CUDL_TAG_ARRAY: + fprintf(stderr, "array with %d elements, ending after %d blocks\n", CUDL_GET_LENGTH(doc.root[i].tag), doc.root[i].data.offset); + break; + case default: + fprintf(stderr, "Unknown value\n"); + break; + } + } +} + +void cudl_deinit_doc(struct cudl_doc doc) { + free(doc.cudl_val); + free(doc.strings); +} + +int cudl_parse_from_file(FILE input_file, struct cudl_doc *doc) { + int c; + + /* Init doc */ + if ((doc->root = malloc(256 * sizeof(struct cudl_val))) == NULL) + return CUDL_ERR_OUT_OF_MEMORY; + if ((doc->strings = malloc(256)) == NULL) { + free(doc->root); + return CUDL_ERR_OUT_OF_MEMORY; + } + + if ((c = next_char(file)) == EOF) + return CUDL_ERR_MISSING_VALUE; +} |