Index: libyaml/trunk/src/api.c
===================================================================
--- libyaml/trunk/src/api.c	(revision 179)
+++ libyaml/trunk/src/api.c	(revision 180)
@@ -47,8 +47,32 @@
     yaml_parser_t *parser;
 
+    /* Allocate the parser structure. */
+
     parser = yaml_malloc(sizeof(yaml_parser_t));
     if (!parser) return NULL;
 
     memset(parser, 0, sizeof(yaml_parser_t));
+
+    /* Allocate the raw buffer. */
+
+    parser->raw_buffer = yaml_malloc(YAML_RAW_BUFFER_SIZE);
+    if (!parser->raw_buffer) {
+        yaml_free(parser);
+        return NULL;
+    }
+    parser->raw_pointer = parser->raw_buffer;
+    parser->raw_unread = 0;
+
+    /* Allocate the character buffer. */
+
+    parser->buffer = yaml_malloc(YAML_BUFFER_SIZE);
+    if (!parser->buffer) {
+        yaml_free(parser->raw_buffer);
+        yaml_free(parser);
+        return NULL;
+    }
+    parser->buffer_end = parser->buffer;
+    parser->pointer = parser->buffer;
+    parser->unread = 0;
 
     return parser;
@@ -65,6 +89,5 @@
 
     yaml_free(parser->buffer);
-    if (!parser->raw_buffer_foreign)
-        yaml_free(parser->raw_buffer);
+    yaml_free(parser->raw_buffer);
 
     memset(parser, 0, sizeof(yaml_parser_t));
@@ -74,5 +97,5 @@
 
 /*
- * String read handler (always returns error).
+ * String read handler.
  */
 
@@ -81,5 +104,18 @@
         size_t *size_read)
 {
-    *size_read = 0;
+    yaml_string_input_t *input = data;
+
+    if (input->current == input->end) {
+        *size_read = 0;
+        return 1;
+    }
+
+    if (size > (input->end - input->current)) {
+        size = input->end - input->current;
+    }
+
+    memcpy(buffer, input->current, size);
+    input->current += size;
+    *size_read = size;
     return 1;
 }
@@ -93,6 +129,6 @@
         size_t *size_read)
 {
-    *size_read = fread(buffer, 1, size, (FILE *)ext);
-    return !ferror((FILE *)ext);
+    *size_read = fread(buffer, 1, size, (FILE *)data);
+    return !ferror((FILE *)data);
 }
 
@@ -106,14 +142,13 @@
 {
     assert(parser); /* Non-NULL parser object expected. */
-    assert(!parser->reader); /* You can set the source only once. */
+    assert(!parser->read_handler);  /* You can set the source only once. */
     assert(input);  /* Non-NULL input string expected. */
 
+    parser->string_input.start = input;
+    parser->string_input.current = input;
+    parser->string_input.end = input+size;
+
     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;
+    parser->read_handler_data = &parser->string_input;
 }
 
@@ -126,5 +161,5 @@
 {
     assert(parser); /* Non-NULL parser object expected. */
-    assert(!parser->reader); /* You can set the source only once. */
+    assert(!parser->read_handler);  /* You can set the source only once. */
     assert(file);   /* Non-NULL file object expected. */
 
@@ -142,9 +177,9 @@
 {
     assert(parser); /* Non-NULL parser object expected. */
-    assert(!parser->reader); /* You can set the source only once. */
+    assert(!parser->read_handler);  /* You can set the source only once. */
     assert(handler);    /* Non-NULL read handler expected. */
 
     parser->read_handler = handler;
-    parser->read_handler_data = data
+    parser->read_handler_data = data;
 }
 
