From dfcc320d3085f188a3aa02eb9edc69e3c4617fbd Mon Sep 17 00:00:00 2001 From: Charlie Stanton Date: Fri, 1 Oct 2021 17:29:10 +0100 Subject: Initial commit --- cudl.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 cudl.c (limited to 'cudl.c') diff --git a/cudl.c b/cudl.c new file mode 100644 index 0000000..04b3d9b --- /dev/null +++ b/cudl.c @@ -0,0 +1,70 @@ +#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; +} -- cgit v1.2.3