<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--Makefile9
-rw-r--r--cudl.c17
-rw-r--r--cudl.h34
-rw-r--r--test.c9
-rw-r--r--test.cudl5
6 files changed, 51 insertions, 25 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f4ab3d5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+test
+*.o
diff --git a/Makefile b/Makefile
index ebfaa61..0e38739 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,9 @@
CC=tcc
-BIN=test
+CFLAGS=-I.
-test: test.o
+test: test.o cudl.o
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+test.o: cudl.h
diff --git a/cudl.c b/cudl.c
index 02e7b1d..fc75bb6 100644
--- a/cudl.c
+++ b/cudl.c
@@ -1,6 +1,7 @@
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
+#include <string.h>
#include "cudl.h"
#define STRIP_WHITESPACE(text) while (isspace(*text)) text++
@@ -59,7 +60,7 @@ void cudl_deinit_value(struct cudl_value value) {
free(value.data.array.values);
break;
case CUDL_TAG_NULL:
- case default:
+ default:
break;
}
}
@@ -67,19 +68,19 @@ void cudl_deinit_value(struct cudl_value value) {
/* Parse a value from input and store it in value.
* Return the number of bytes consumed.
* Input must end with a null byte */
-size_t parse_value(char *input, struct cudl_value *value);
+static size_t parse_value(char *input, struct cudl_value *value);
static size_t parse_bool_or_null(char *input, struct cudl_value *value) {
- if (strncmp(input, "null", 4)) {
+ if (strncmp(input, "null", 4) == 0) {
value->tag = CUDL_TAG_NULL;
return 4;
}
- if (strncmp(input, "true", 4)) {
+ if (strncmp(input, "true", 4) == 0) {
value->tag = CUDL_TAG_BOOL;
value->data.boolean = 1;
return 4;
}
- if (strncmp(input, "false", 5)) {
+ if (strncmp(input, "false", 5) == 0) {
value->tag = CUDL_TAG_BOOL;
value->data.boolean = 0;
return 5;
@@ -158,8 +159,8 @@ static size_t parse_value(char *input, struct cudl_value *value) {
}
void cudl_parse_from_file(FILE *file, struct cudl_value *value) {
- char *input;
- if ((input = fread_all(file)) == NULL) {
+ char *input, *original_input;
+ if ((original_input = input = fread_all(file)) == NULL) {
if (ferror(file))
cudl_err = CUDL_ERR_READING;
else
@@ -169,7 +170,7 @@ void cudl_parse_from_file(FILE *file, struct cudl_value *value) {
input += cudl_parse(input, value);
if (*input != '\0')
cudl_deinit_value(*value);
- free(input);
+ free(original_input);
}
size_t cudl_parse(char *input, struct cudl_value *value) {
diff --git a/cudl.h b/cudl.h
index 6586bba..a96cc45 100644
--- a/cudl.h
+++ b/cudl.h
@@ -7,10 +7,7 @@ struct cudl_array_value {
};
struct cudl_map_value {
- struct cudl_map_field {
- char *key;
- struct cudl_value value;
- } *fields;
+ struct cudl_map_field *fields;
size_t length;
};
@@ -19,24 +16,31 @@ struct cudl_value {
char *string;
double number;
int boolean;
- struct array_value array;
- struct map_value map;
+ struct cudl_array_value array;
+ struct cudl_map_value map;
} data;
int tag;
};
+struct cudl_map_field {
+ char *key;
+ struct cudl_value value;
+};
+
enum {
- CUDL_TAG_NULL;
- CUDL_TAG_BOOL;
- CUDL_TAG_ARRAY;
-}
+ CUDL_TAG_NULL,
+ CUDL_TAG_BOOL,
+ CUDL_TAG_ARRAY,
+};
enum {
- CUDL_OK = 0;
- CUDL_ERR_OUT_OF_MEMORY;
- CUDL_ERR_EXPECTED_VALUE;
- CUDL_ERR_READING;
- CUDL_ERR_EXPECTED_BOOL_OR_NULL;
+ CUDL_OK = 0,
+ CUDL_ERR_OUT_OF_MEMORY,
+ CUDL_ERR_EXPECTED_VALUE,
+ CUDL_ERR_READING,
+ CUDL_ERR_EXPECTED_BOOL_OR_NULL,
+ CUDL_ERR_UNMATCHED_BRACK,
+ CUDL_ERR_UNRECOGNISED_VALUE,
};
extern int cudl_err;
diff --git a/test.c b/test.c
index b2f9976..d4d138b 100644
--- a/test.c
+++ b/test.c
@@ -1,2 +1,11 @@
+#include <stdio.h>
+#include "cudl.h"
+
int main() {
+ struct cudl_value value;
+ cudl_parse_from_file(stdin, &value);
+ if (cudl_err)
+ return cudl_err;
+ cudl_debug(value);
+ return 0;
}
diff --git a/test.cudl b/test.cudl
new file mode 100644
index 0000000..150217a
--- /dev/null
+++ b/test.cudl
@@ -0,0 +1,5 @@
+[
+ %true
+ %false
+ [%null %null %false]
+]