summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKirill Simonov <xi@resolvent.net>2006-05-27 17:19:07 +0000
committerKirill Simonov <xi@resolvent.net>2006-05-27 17:19:07 +0000
commit95b98ba9b588df2f28b0a0acca11a1133fb266f0 (patch)
tree57b669d90579bb58e5b88c21596e45b0f0283c35 /src
parenta51447c932b63bcf7cc0226dafd621c6cd8a347a (diff)
downloadlibyaml-hg-95b98ba9b588df2f28b0a0acca11a1133fb266f0.tar.gz
Implementing Reader: first tries.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am2
-rw-r--r--src/api.c135
-rw-r--r--src/reader.c53
3 files changed, 186 insertions, 4 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index fac4a55..6816d81 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,4 @@
AM_CPPFLAGS = -I$(top_srcdir)/include
lib_LTLIBRARIES = libyaml.la
-libyaml_la_SOURCES = version.c api.c
+libyaml_la_SOURCES = version.c api.c reader.c
libyaml_la_LDFLAGS = -release $(YAML_LT_RELEASE) -version-info $(YAML_LT_CURRENT):$(YAML_LT_REVISION):$(YAML_LT_AGE)
diff --git a/src/api.c b/src/api.c
index cffa8e9..0594727 100644
--- a/src/api.c
+++ b/src/api.c
@@ -5,8 +5,40 @@
#include <yaml/yaml.h>
+#include <assert.h>
+
+/*
+ * Allocate a dynamic memory block.
+ */
+
+void *
+yaml_malloc(size_t size)
+{
+ return malloc(size ? size : 1);
+}
+
+/*
+ * Reallocate a dynamic memory block.
+ */
+
+void *
+yaml_realloc(void *ptr, size_t size)
+{
+ return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1);
+}
+
/*
- * Create a new parser.
+ * Free a dynamic memory block.
+ */
+
+void
+yaml_free(void *ptr)
+{
+ if (ptr) free(ptr);
+}
+
+/*
+ * Create a new parser object.
*/
yaml_parser_t *
@@ -14,7 +46,7 @@ yaml_parser_new(void)
{
yaml_parser_t *parser;
- parser = malloc(sizeof(yaml_parser_t));
+ parser = yaml_malloc(sizeof(yaml_parser_t));
if (!parser) return NULL;
memset(parser, 0, sizeof(yaml_parser_t));
@@ -29,6 +61,103 @@ yaml_parser_new(void)
void
yaml_parser_delete(yaml_parser_t *parser)
{
- free(parser);
+ assert(parser); /* Non-NULL parser object expected. */
+
+ yaml_free(parser->buffer);
+ if (!parser->raw_buffer_foreign)
+ yaml_free(parser->raw_buffer);
+
+ memset(parser, 0, sizeof(yaml_parser_t));
+
+ yaml_free(parser);
+}
+
+/*
+ * String read handler (always returns error).
+ */
+
+static int
+yaml_string_read_handler(void *data, unsigned char *buffer, size_t size,
+ size_t *size_read)
+{
+ *size_read = 0;
+ return 1;
+}
+
+/*
+ * File read handler.
+ */
+
+static int
+yaml_file_read_handler(void *data, unsigned char *buffer, size_t size,
+ size_t *size_read)
+{
+ *size_read = fread(buffer, 1, size, (FILE *)ext);
+ return !ferror((FILE *)ext);
+}
+
+/*
+ * Set a string input.
+ */
+
+void
+yaml_parser_set_input_string(yaml_parser_t *parser,
+ unsigned char *input, size_t size)
+{
+ assert(parser); /* Non-NULL parser object expected. */
+ assert(!parser->reader); /* You can set the source only once. */
+ assert(input); /* Non-NULL input string expected. */
+
+ parser->read_handler = yaml_string_read_handler;
+ parser->read_handler_data = NULL;
+
+ /* We use the input string as a raw (undecoded) buffer. */
+ parser->raw_buffer = input;
+ parser->raw_buffer_size = size;
+ parser->raw_buffer_foreign = 1;
+}
+
+/*
+ * Set a file input.
+ */
+
+void
+yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
+{
+ assert(parser); /* Non-NULL parser object expected. */
+ assert(!parser->reader); /* You can set the source only once. */
+ assert(file); /* Non-NULL file object expected. */
+
+ parser->read_handler = yaml_file_read_handler;
+ parser->read_handler_data = file;
+}
+
+/*
+ * Set a generic input.
+ */
+
+void
+yaml_parser_set_input(yaml_parser_t *parser,
+ yaml_read_handler_t *handler, void *data)
+{
+ assert(parser); /* Non-NULL parser object expected. */
+ assert(!parser->reader); /* You can set the source only once. */
+ assert(handler); /* Non-NULL read handler expected. */
+
+ parser->read_handler = handler;
+ parser->read_handler_data = data
+}
+
+/*
+ * Set the source encoding.
+ */
+
+void
+yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
+{
+ assert(parser); /* Non-NULL parser object expected. */
+ assert(!parser->encoding); /* Encoding is already set or detected. */
+
+ parser->encoding = encoding;
}
diff --git a/src/reader.c b/src/reader.c
new file mode 100644
index 0000000..787f785
--- /dev/null
+++ b/src/reader.c
@@ -0,0 +1,53 @@
+
+#define RAW_BUFFER_SIZE 16384
+#define BUFFER_SIZE (RAW_BUFFER_SIZE*2) /* Should be enough for decoding
+ the whole raw buffer. */
+
+/*
+ * Ensure that the buffer contains at least length characters.
+ * Return 1 on success, 0 on failure.
+ */
+
+int
+yaml_parser_update_reader(yaml_parser_t *parser, size_t length)
+{
+ /* If the EOF flag is set, do nothing. */
+
+ if (parser->eof)
+ return 1;
+
+ /* First, let us check that the buffers are allocated. */
+
+ if (!parser->buffer) {
+ parser->buffer = yaml_malloc(BUFFER_SIZE);
+ if (!parser->buffer) {
+ parser->error = YAML_MEMORY_ERROR;
+ return 0;
+ }
+ parser->buffer_size = BUFFER_SIZE;
+ parser->buffer_pointer = parser->buffer;
+ parser->buffer_length = 0;
+ }
+
+ if (!parser->raw_buffer) {
+ parser->raw_buffer = yaml_malloc(RAW_BUFFER_SIZE);
+ if (!parser->raw_buffer) {
+ parser->error = YAML_MEMORY_ERROR;
+ return 0;
+ }
+ parser->raw_buffer_size = RAW_BUFFER_SIZE;
+ }
+
+ /* Next, determine the input encoding. */
+
+ if (!parser->encoding) {
+ if (!yaml_parser_determine_encoding(parser))
+ return 0;
+ }
+
+ /* more... */
+
+}
+
+
+