<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Stanton <charlie@shtanton.xyz>2021-10-01 20:07:40 +0100
committerCharlie Stanton <charlie@shtanton.xyz>2021-10-01 20:07:40 +0100
commit6a05583e37cd8db8a35179e6cfac0c97c435a377 (patch)
tree9618007476aba1604ddc2a724a3cf76808427ec8
parentdfcc320d3085f188a3aa02eb9edc69e3c4617fbd (diff)
downloadcudl-6a05583e37cd8db8a35179e6cfac0c97c435a377.tar
Changes approach to be more understandable
This is more in line with a definitional parser. A later implementation can be faster
-rw-r--r--cudl.c81
1 files changed, 34 insertions, 47 deletions
diff --git a/cudl.c b/cudl.c
index 04b3d9b..94e3f7f 100644
--- a/cudl.c
+++ b/cudl.c
@@ -1,70 +1,57 @@
#include <stdio.h>
-union cudl_val_uni {
- double num;
- char *str;
- size_t offset;
+struct cudl_array_value {
+ struct cudl_value *values;
+ size_t length;
};
-struct cudl_val {
- uint64_t tag;
- union cudl_val_uni data;
+struct cudl_map_value {
+ struct cudl_map_field {
+ char *key;
+ struct cudl_value value;
+ } *fields;
+ size_t length;
};
-struct cudl_doc {
- struct cudl_val *root;
- size_t length;
- size_t capacity;
- char *strings;
+struct cudl_value {
+ union {
+ char *string;
+ double number;
+ int boolean;
+ struct array_value array;
+ struct map_value map;
+ } data;
+ int tag;
};
#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_value *value) {
+}
-void cudl_debug(struct cudl_doc doc) {
+/* Free all children of the value, not the value itself */
+void cudl_deinit_value(struct cudl_value value) {
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;
- }
+ switch (value.tag) {
+ case CUDL_TAG_ARRAY:
+ for (i = 0; i < value.data.array.length; i++) {
+ cudl_deinit_value(value.data.array.values[i]);
+ }
+ free(value.data.array.values);
+ break;
+ case CUDL_TAG_NULL:
+ case default:
+ 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_value *value) {
}
-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;
+int cudl_parse(char *input, struct cudl_value *value) {
}