33 return malloc(size ? size : 1);
43 return ptr ?
realloc(ptr, size ? size : 1) :
malloc(size ? size : 1);
79 if (!new_start)
return 0;
81 memset(new_start + (*end - *start), 0, *end - *start);
83 *pointer = new_start + (*pointer - *start);
84 *end = new_start + (*end - *start)*2;
99 if (*b_start == *b_pointer)
102 while (*a_end - *a_pointer <= *b_pointer - *b_start) {
107 memcpy(*a_pointer, *b_start, *b_pointer - *b_start);
108 *a_pointer += *b_pointer - *b_start;
120 void *new_start =
yaml_realloc(*start, ((
char *)*end - (
char *)*start)*2);
122 if (!new_start)
return 0;
124 *top = (
char *)new_start + ((
char *)*top - (
char *)*start);
125 *end = (
char *)new_start + ((
char *)*end - (
char *)*start)*2;
140 if (*start == *head && *tail == *end) {
142 ((
char *)*end - (
char *)*start)*2);
144 if (!new_start)
return 0;
146 *head = (
char *)new_start + ((
char *)*head - (
char *)*start);
147 *tail = (
char *)new_start + ((
char *)*tail - (
char *)*start);
148 *end = (
char *)new_start + ((
char *)*end - (
char *)*start)*2;
155 if (*head != *tail) {
156 memmove(*start, *head, (
char *)*tail - (
char *)*head);
158 *tail = (
char *)*tail - (
char *)*head + (
char *)*start;
204 STACK_DEL(parser, parser->tag_directives);
228 while (!
STACK_EMPTY(parser, parser->tag_directives)) {
233 STACK_DEL(parser, parser->tag_directives);
258 memcpy(buffer, parser->
input.
string.current, size);
274 *size_read = fread(buffer, 1, size, parser->
input.
file);
287 assert(!parser->read_handler);
291 parser->read_handler_data = parser;
293 parser->input.string.start =
input;
294 parser->input.string.current =
input;
295 parser->input.string.end = input+
size;
306 assert(!parser->read_handler);
310 parser->read_handler_data = parser;
312 parser->input.file = file;
324 assert(!parser->read_handler);
327 parser->read_handler = handler;
328 parser->read_handler_data = data;
339 assert(!parser->encoding);
341 parser->encoding = encoding;
376 STACK_DEL(emitter, emitter->tag_directives);
398 while (!
STACK_EMPTY(emitter, emitter->tag_directives)) {
403 STACK_DEL(emitter, emitter->tag_directives);
444 return (fwrite(buffer, 1, size, emitter->
output.
file) == size);
452 unsigned char *
output,
size_t size,
size_t *size_written)
455 assert(!emitter->write_handler);
459 emitter->write_handler_data = emitter;
461 emitter->output.string.buffer =
output;
462 emitter->output.string.size =
size;
463 emitter->output.string.size_written = size_written;
475 assert(!emitter->write_handler);
479 emitter->write_handler_data = emitter;
481 emitter->output.file = file;
493 assert(!emitter->write_handler);
496 emitter->write_handler = handler;
497 emitter->write_handler_data = data;
508 assert(!emitter->encoding);
510 emitter->encoding = encoding;
522 emitter->canonical = (canonical != 0);
534 emitter->best_indent = (1 < indent && indent < 10) ? indent : 2;
546 emitter->best_width = (width >= 0) ? width : -1;
558 emitter->unicode = (unicode != 0);
570 emitter->line_break = line_break;
585 yaml_free(token->data.tag_directive.handle);
586 yaml_free(token->data.tag_directive.prefix);
625 while (pointer < end) {
632 width = (octet & 0x80) == 0x00 ? 1 :
633 (octet & 0xE0) == 0xC0 ? 2 :
634 (octet & 0xF0) == 0xE0 ? 3 :
635 (octet & 0xF8) == 0xF0 ? 4 : 0;
636 value = (octet & 0x80) == 0x00 ? octet & 0x7F :
637 (octet & 0xE0) == 0xC0 ? octet & 0x1F :
638 (octet & 0xF0) == 0xE0 ? octet & 0x0F :
639 (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
640 if (!width)
return 0;
641 if (pointer+width > end)
return 0;
642 for (k = 1; k < width; k ++) {
644 if ((octet & 0xC0) != 0x80)
return 0;
645 value = (value << 6) + (octet & 0x3F);
647 if (!((width == 1) ||
648 (width == 2 && value >= 0x80) ||
649 (width == 3 && value >= 0x800) ||
650 (width == 4 && value >= 0x10000)))
return 0;
711 } tag_directives_copy = {
NULL,
NULL, NULL };
715 assert((tag_directives_start && tag_directives_end) ||
716 (tag_directives_start == tag_directives_end));
719 if (version_directive) {
721 if (!version_directive_copy)
goto error;
722 version_directive_copy->
major = version_directive->major;
723 version_directive_copy->
minor = version_directive->minor;
726 if (tag_directives_start != tag_directives_end) {
730 for (tag_directive = tag_directives_start;
731 tag_directive != tag_directives_end; tag_directive ++) {
743 if (!
PUSH(&context, tag_directives_copy, value))
751 tag_directives_copy.start, tag_directives_copy.top,
752 implicit, mark, mark);
758 while (!
STACK_EMPTY(context, tag_directives_copy)) {
818 int plain_implicit,
int quoted_implicit,
833 if (!anchor_copy)
goto error;
839 if (!tag_copy)
goto error;
843 value_length =
strlen((
char *)value);
846 value_length = (size_t)length;
851 if (!value_copy)
goto error;
852 memcpy(value_copy, value, value_length);
853 value_copy[value_length] =
'\0';
856 plain_implicit, quoted_implicit, style, mark, mark);
886 if (!anchor_copy)
goto error;
892 if (!tag_copy)
goto error;
896 implicit, style, mark, mark);
941 if (!anchor_copy)
goto error;
947 if (!tag_copy)
goto error;
951 implicit, style, mark, mark);
992 yaml_free(event->data.document_start.version_directive);
993 for (tag_directive = event->data.document_start.tag_directives.start;
994 tag_directive != event->data.document_start.tag_directives.end;
999 yaml_free(event->data.document_start.tag_directives.start);
1013 yaml_free(event->data.sequence_start.anchor);
1014 yaml_free(event->data.sequence_start.tag);
1018 yaml_free(event->data.mapping_start.anchor);
1019 yaml_free(event->data.mapping_start.tag);
1038 int start_implicit,
int end_implicit)
1053 } tag_directives_copy = {
NULL,
NULL, NULL };
1058 assert((tag_directives_start && tag_directives_end) ||
1059 (tag_directives_start == tag_directives_end));
1064 if (version_directive) {
1066 if (!version_directive_copy)
goto error;
1067 version_directive_copy->
major = version_directive->major;
1068 version_directive_copy->
minor = version_directive->minor;
1071 if (tag_directives_start != tag_directives_end) {
1075 for (tag_directive = tag_directives_start;
1076 tag_directive != tag_directives_end; tag_directive ++) {
1088 if (!
PUSH(&context, tag_directives_copy, value))
1095 DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
1096 tag_directives_copy.start, tag_directives_copy.top,
1097 start_implicit, end_implicit, mark, mark);
1104 while (!
STACK_EMPTY(&context, tag_directives_copy)) {
1109 STACK_DEL(&context, tag_directives_copy);
1135 switch (node.
type) {
1152 for (tag_directive = document->tag_directives.start;
1153 tag_directive != document->tag_directives.end;
1158 yaml_free(document->tag_directives.start);
1172 if (index > 0 && document->nodes.start + index <= document->nodes.top) {
1173 return document->nodes.start + index - 1;
1187 if (document->nodes.top != document->nodes.start) {
1188 return document->nodes.start;
1209 size_t value_length;
1221 if (!tag_copy)
goto error;
1224 value_length =
strlen((
char *)value);
1227 value_length = (size_t)length;
1232 if (!value_copy)
goto error;
1233 memcpy(value_copy, value, value_length);
1234 value_copy[value_length] =
'\0';
1236 SCALAR_NODE_INIT(node, tag_copy, value_copy, value_length, style, mark, mark);
1237 if (!
PUSH(&context, document->nodes, node))
goto error;
1239 ret = document->nodes.top - document->nodes.start;
1240 #if PTRDIFF_MAX > INT_MAX
1241 if (ret > INT_MAX)
goto error;
1281 if (!tag_copy)
goto error;
1287 if (!
PUSH(&context, document->nodes, node))
goto error;
1289 ret = document->nodes.top - document->nodes.start;
1290 #if PTRDIFF_MAX > INT_MAX
1291 if (ret > INT_MAX)
goto error;
1331 if (!tag_copy)
goto error;
1337 if (!
PUSH(&context, document->nodes, node))
goto error;
1339 ret = document->nodes.top - document->nodes.start;
1340 #if PTRDIFF_MAX > INT_MAX
1341 if (ret > INT_MAX)
goto error;
1358 int sequence,
int item)
1366 && document->nodes.start + sequence <= document->nodes.top);
1370 assert(item > 0 && document->nodes.start + item <= document->nodes.top);
1374 document->nodes.start[sequence-1].data.sequence.items, item))
1386 int mapping,
int key,
int value)
1396 && document->nodes.start + mapping <= document->nodes.top);
1400 assert(key > 0 && document->nodes.start + key <= document->nodes.top);
1402 assert(value > 0 && document->nodes.start + value <= document->nodes.top);
1409 document->nodes.start[mapping-1].data.mapping.pairs, pair))