diff options
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | Makefile | 9 | ||||
| -rw-r--r-- | cudl.c | 17 | ||||
| -rw-r--r-- | cudl.h | 34 | ||||
| -rw-r--r-- | test.c | 9 | ||||
| -rw-r--r-- | test.cudl | 5 | 
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 @@ -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 @@ -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) { @@ -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; @@ -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] +] | 
