diff options
| -rw-r--r-- | README | 3 | ||||
| -rw-r--r-- | cudl.c | 70 | 
2 files changed, 73 insertions, 0 deletions
| @@ -0,0 +1,3 @@ +CUDL - Clear and Unmistakable Data Language + +In C @@ -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; +} | 
