summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxi <xi@18f92427-320e-0410-9341-c67f048884a3>2006-07-25 20:54:28 +0000
committerxi <xi@18f92427-320e-0410-9341-c67f048884a3>2006-07-25 20:54:28 +0000
commit79d9c7788d0f618459c42fc1962b87ca53ea4f64 (patch)
treeb7e66246c8189366cb689e54b23c79b79ead0f2e
parentdb8e1eda9ed12e85a008747a6ea5f38c39ad23e0 (diff)
downloadlibyaml-79d9c7788d0f618459c42fc1962b87ca53ea4f64.tar.gz
Add yaml_emitter_emit_* set of functions.
git-svn-id: http://svn.pyyaml.org/libyaml/trunk@212 18f92427-320e-0410-9341-c67f048884a3
-rw-r--r--include/yaml.h4
-rw-r--r--src/Makefile.am2
-rw-r--r--src/api.c12
-rw-r--r--src/emitter.c408
-rw-r--r--src/parser.c4
-rw-r--r--src/yaml_private.h4
6 files changed, 423 insertions, 11 deletions
diff --git a/include/yaml.h b/include/yaml.h
index 204872a..a4fc4e8 100644
--- a/include/yaml.h
+++ b/include/yaml.h
@@ -1139,14 +1139,14 @@ yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical);
* Set the intendation increment.
*
* @param[in] emitter An emitter object.
- * @param[in] indent The indentation increment (> 1).
+ * @param[in] indent The indentation increment (1 < . < 10).
*/
YAML_DECLARE(void)
yaml_emitter_set_indent(yaml_emitter_t *emitter, int indent);
/**
- * Set the preferred line width. @c 0 means unlimited.
+ * Set the preferred line width. @c -1 means unlimited.
*
* @param[in] emitter An emitter object.
* @param[in] width The preferred line width.
diff --git a/src/Makefile.am b/src/Makefile.am
index 25a5bc8..cc815e7 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 = api.c reader.c scanner.c parser.c writer.c
+libyaml_la_SOURCES = api.c reader.c scanner.c parser.c writer.c emitter.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 90d86fd..8d5f624 100644
--- a/src/api.c
+++ b/src/api.c
@@ -57,10 +57,13 @@ yaml_free(void *ptr)
* Duplicate a string.
*/
-YAML_DECLARE(char *)
-yaml_strdup(const char *str)
+YAML_DECLARE(yaml_char_t *)
+yaml_strdup(const yaml_char_t *str)
{
- return strdup(str);
+ if (!str)
+ return NULL;
+
+ return (yaml_char_t *)strdup((char *)str);
}
/*
@@ -389,6 +392,7 @@ yaml_emitter_delete(yaml_emitter_t *emitter)
yaml_event_delete(&DEQUEUE(emitter, emitter->events));
}
STACK_DEL(emitter, emitter->indents);
+ yaml_event_delete(&emitter->event);
while (!STACK_EMPTY(empty, emitter->tag_directives)) {
yaml_tag_directive_t tag_directive = POP(emitter, emitter->tag_directives);
yaml_free(tag_directive.handle);
@@ -536,7 +540,7 @@ yaml_emitter_set_width(yaml_emitter_t *emitter, int width)
{
assert(emitter); /* Non-NULL emitter object expected. */
- emitter->best_width = (width > 0) ? width : 0;
+ emitter->best_width = (width >= 0) ? width : -1;
}
/*
diff --git a/src/emitter.c b/src/emitter.c
new file mode 100644
index 0000000..e659e3e
--- /dev/null
+++ b/src/emitter.c
@@ -0,0 +1,408 @@
+
+#include "yaml_private.h"
+
+/*
+ * API functions.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
+ yaml_encoding_t encoding);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_stream_end(yaml_emitter_t *emitter);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
+ yaml_version_directive_t *version_directive,
+ yaml_tag_directive_t *tag_directives_start,
+ yaml_tag_directive_t *tag_directives_end,
+ int implicit);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_document_end(yaml_emitter_t *emitter, int implicit);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_alias(yaml_emitter_t *emitter, yaml_char_t *anchor);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_scalar(yaml_emitter_t *emitter,
+ yaml_char_t *anchor, yaml_char_t *tag,
+ yaml_char_t *value, size_t length,
+ int plain_implicit, int quoted_implicit,
+ yaml_scalar_style_t style);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_sequence_start(yaml_emitter_t *emitter,
+ yaml_char_t *anchor, yaml_char_t *tag, int implicit,
+ yaml_sequence_style_t style);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_sequence_end(yaml_emitter_t *emitter);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_mapping_start(yaml_emitter_t *emitter,
+ yaml_char_t *anchor, yaml_char_t *tag, int implicit,
+ yaml_mapping_style_t style);
+
+YAML_DECLARE(int)
+yaml_emitter_emit_mapping_end(yaml_emitter_t *emitter);
+
+/*
+ * Emit STREAM-START.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
+ yaml_encoding_t encoding)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+
+ STREAM_START_EVENT_INIT(event, encoding, mark, mark);
+
+ return yaml_emitter_emit(emitter, &event);
+}
+
+/*
+ * Emit STREAM-END.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_stream_end(yaml_emitter_t *emitter)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+
+ STREAM_END_EVENT_INIT(event, mark, mark);
+
+ return yaml_emitter_emit(emitter, &event);
+}
+
+/*
+ * Emit DOCUMENT-START.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
+ yaml_version_directive_t *version_directive,
+ yaml_tag_directive_t *tag_directives_start,
+ yaml_tag_directive_t *tag_directives_end,
+ int implicit)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+ yaml_version_directive_t *version_directive_copy = NULL;
+ struct {
+ yaml_tag_directive_t *start;
+ yaml_tag_directive_t *end;
+ yaml_tag_directive_t *top;
+ } tag_directives_copy = { NULL, NULL, NULL };
+ yaml_tag_directive_t value = { NULL, NULL };
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+ assert((tag_directives_start && tag_directives_end) ||
+ (tag_directives_start == tag_directives_end));
+ /* Valid tag directives are expected. */
+
+ if (version_directive) {
+ version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t));
+ if (!version_directive_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ version_directive_copy->major = version_directive->major;
+ version_directive_copy->minor = version_directive->minor;
+ }
+
+ if (tag_directives_start != tag_directives_end) {
+ yaml_tag_directive_t *tag_directive;
+ if (!STACK_INIT(emitter, tag_directives_copy, INITIAL_STACK_SIZE))
+ goto error;
+ for (tag_directive = tag_directives_start;
+ tag_directive != tag_directives_end; tag_directive ++) {
+ value.handle = yaml_strdup(tag_directive->handle);
+ value.prefix = yaml_strdup(tag_directive->prefix);
+ if (!value.handle || !value.prefix) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ if (!PUSH(emitter, tag_directives_copy, value))
+ goto error;
+ value.handle = NULL;
+ value.prefix = NULL;
+ }
+ }
+
+ DOCUMENT_START_EVENT_INIT(event, version_directive_copy,
+ tag_directives_copy.start, tag_directives_copy.end,
+ implicit, mark, mark);
+
+ if (yaml_emitter_emit(emitter, &event)) {
+ return 1;
+ }
+
+error:
+ yaml_free(version_directive_copy);
+ while (!STACK_EMPTY(emitter, tag_directives_copy)) {
+ yaml_tag_directive_t value = POP(emitter, tag_directives_copy);
+ yaml_free(value.handle);
+ yaml_free(value.prefix);
+ }
+ STACK_DEL(emitter, tag_directives_copy);
+ yaml_free(value.handle);
+ yaml_free(value.prefix);
+
+ return 0;
+}
+
+/*
+ * Emit DOCUMENT-END.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_document_end(yaml_emitter_t *emitter, int implicit)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+
+ DOCUMENT_END_EVENT_INIT(event, implicit, mark, mark);
+
+ return yaml_emitter_emit(emitter, &event);
+}
+
+/*
+ * Emit ALIAS.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_alias(yaml_emitter_t *emitter, yaml_char_t *anchor)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+ yaml_char_t *anchor_copy = NULL;
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+ assert(anchor); /* Non-NULL anchor is expected. */
+
+ anchor_copy = yaml_strdup(anchor);
+ if (!anchor_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ return 0;
+ }
+
+ ALIAS_EVENT_INIT(event, anchor_copy, mark, mark);
+
+ if (yaml_emitter_emit(emitter, &event)) {
+ return 1;
+ }
+
+ yaml_free(anchor_copy);
+
+ return 0;
+}
+
+/*
+ * Emit SCALAR.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_scalar(yaml_emitter_t *emitter,
+ yaml_char_t *anchor, yaml_char_t *tag,
+ yaml_char_t *value, size_t length,
+ int plain_implicit, int quoted_implicit,
+ yaml_scalar_style_t style)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+ yaml_char_t *anchor_copy = NULL;
+ yaml_char_t *tag_copy = NULL;
+ yaml_char_t *value_copy = NULL;
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+ assert(value); /* Non-NULL anchor is expected. */
+
+ if (anchor) {
+ anchor_copy = yaml_strdup(anchor);
+ if (!anchor_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ }
+
+ if (tag) {
+ tag_copy = yaml_strdup(tag);
+ if (!tag_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ }
+
+ value_copy = yaml_malloc(length+1);
+ if (!value_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ memcpy(value_copy, value, length);
+ value_copy[length] = '\0';
+
+ SCALAR_EVENT_INIT(event, anchor_copy, tag_copy, value_copy, length,
+ plain_implicit, quoted_implicit, style, mark, mark);
+
+ if (yaml_emitter_emit(emitter, &event)) {
+ return 1;
+ }
+
+error:
+ yaml_free(anchor_copy);
+ yaml_free(tag_copy);
+ yaml_free(value_copy);
+
+ return 0;
+}
+
+/*
+ * Emit SEQUENCE-START.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_sequence_start(yaml_emitter_t *emitter,
+ yaml_char_t *anchor, yaml_char_t *tag, int implicit,
+ yaml_sequence_style_t style)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+ yaml_char_t *anchor_copy = NULL;
+ yaml_char_t *tag_copy = NULL;
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+
+ if (anchor) {
+ anchor_copy = yaml_strdup(anchor);
+ if (!anchor_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ }
+
+ if (tag) {
+ tag_copy = yaml_strdup(tag);
+ if (!tag_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ }
+
+ SEQUENCE_START_EVENT_INIT(event, anchor_copy, tag_copy,
+ implicit, style, mark, mark);
+
+ if (yaml_emitter_emit(emitter, &event)) {
+ return 1;
+ }
+
+error:
+ yaml_free(anchor_copy);
+ yaml_free(tag_copy);
+
+ return 0;
+}
+
+/*
+ * Emit SEQUENCE-END.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_sequence_end(yaml_emitter_t *emitter)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+
+ SEQUENCE_END_EVENT_INIT(event, mark, mark);
+
+ return yaml_emitter_emit(emitter, &event);
+}
+
+/*
+ * Emit MAPPING-START.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_mapping_start(yaml_emitter_t *emitter,
+ yaml_char_t *anchor, yaml_char_t *tag, int implicit,
+ yaml_mapping_style_t style)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+ yaml_char_t *anchor_copy = NULL;
+ yaml_char_t *tag_copy = NULL;
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+
+ if (anchor) {
+ anchor_copy = yaml_strdup(anchor);
+ if (!anchor_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ }
+
+ if (tag) {
+ tag_copy = yaml_strdup(tag);
+ if (!tag_copy) {
+ emitter->error = YAML_MEMORY_ERROR;
+ goto error;
+ }
+ }
+
+ MAPPING_START_EVENT_INIT(event, anchor_copy, tag_copy,
+ implicit, style, mark, mark);
+
+ if (yaml_emitter_emit(emitter, &event)) {
+ return 1;
+ }
+
+error:
+ yaml_free(anchor_copy);
+ yaml_free(tag_copy);
+
+ return 0;
+}
+
+/*
+ * Emit MAPPING-END.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit_mapping_end(yaml_emitter_t *emitter)
+{
+ yaml_event_t event;
+ yaml_mark_t mark = { 0, 0, 0 };
+
+ assert(emitter); /* Non-NULL emitter object is expected. */
+
+ MAPPING_END_EVENT_INIT(event, mark, mark);
+
+ return yaml_emitter_emit(emitter, &event);
+}
+
+/*
+ * Emit an event.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+ return 0;
+}
+
diff --git a/src/parser.c b/src/parser.c
index 020d5d6..ed3c019 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1335,8 +1335,8 @@ yaml_parser_append_tag_directive(yaml_parser_t *parser,
}
}
- copy.handle = (yaml_char_t *)yaml_strdup((char *)value.handle);
- copy.prefix = (yaml_char_t *)yaml_strdup((char *)value.prefix);
+ copy.handle = yaml_strdup(value.handle);
+ copy.prefix = yaml_strdup(value.prefix);
if (!copy.handle || !copy.prefix) {
parser->error = YAML_MEMORY_ERROR;
goto error;
diff --git a/src/yaml_private.h b/src/yaml_private.h
index 7304d8d..faa855b 100644
--- a/src/yaml_private.h
+++ b/src/yaml_private.h
@@ -20,8 +20,8 @@ yaml_realloc(void *ptr, size_t size);
YAML_DECLARE(void)
yaml_free(void *ptr);
-YAML_DECLARE(char *)
-yaml_strdup(const char *);
+YAML_DECLARE(yaml_char_t *)
+yaml_strdup(const yaml_char_t *);
/*
* Reader: Ensure that the buffer contains at least `length` characters.