#include 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; }