Path: blob/main/contrib/libyaml/tests/run-emitter.c
39507 views
#include <yaml.h>12#include <stdlib.h>3#include <stdio.h>4#include <string.h>56#ifdef NDEBUG7#undef NDEBUG8#endif9#include <assert.h>1011#define BUFFER_SIZE 6553612#define MAX_EVENTS 10241314int copy_event(yaml_event_t *event_to, yaml_event_t *event_from)15{16switch (event_from->type)17{18case YAML_STREAM_START_EVENT:19return yaml_stream_start_event_initialize(event_to,20event_from->data.stream_start.encoding);2122case YAML_STREAM_END_EVENT:23return yaml_stream_end_event_initialize(event_to);2425case YAML_DOCUMENT_START_EVENT:26return yaml_document_start_event_initialize(event_to,27event_from->data.document_start.version_directive,28event_from->data.document_start.tag_directives.start,29event_from->data.document_start.tag_directives.end,30event_from->data.document_start.implicit);3132case YAML_DOCUMENT_END_EVENT:33return yaml_document_end_event_initialize(event_to,34event_from->data.document_end.implicit);3536case YAML_ALIAS_EVENT:37return yaml_alias_event_initialize(event_to,38event_from->data.alias.anchor);3940case YAML_SCALAR_EVENT:41return yaml_scalar_event_initialize(event_to,42event_from->data.scalar.anchor,43event_from->data.scalar.tag,44event_from->data.scalar.value,45event_from->data.scalar.length,46event_from->data.scalar.plain_implicit,47event_from->data.scalar.quoted_implicit,48event_from->data.scalar.style);4950case YAML_SEQUENCE_START_EVENT:51return yaml_sequence_start_event_initialize(event_to,52event_from->data.sequence_start.anchor,53event_from->data.sequence_start.tag,54event_from->data.sequence_start.implicit,55event_from->data.sequence_start.style);5657case YAML_SEQUENCE_END_EVENT:58return yaml_sequence_end_event_initialize(event_to);5960case YAML_MAPPING_START_EVENT:61return yaml_mapping_start_event_initialize(event_to,62event_from->data.mapping_start.anchor,63event_from->data.mapping_start.tag,64event_from->data.mapping_start.implicit,65event_from->data.mapping_start.style);6667case YAML_MAPPING_END_EVENT:68return yaml_mapping_end_event_initialize(event_to);6970default:71assert(1);72}7374return 0;75}7677int compare_events(yaml_event_t *event1, yaml_event_t *event2)78{79int k;8081if (event1->type != event2->type)82return 0;8384switch (event1->type)85{86case YAML_STREAM_START_EVENT:87return 1;88/* return (event1->data.stream_start.encoding ==89event2->data.stream_start.encoding); */9091case YAML_DOCUMENT_START_EVENT:92if ((event1->data.document_start.version_directive && !event2->data.document_start.version_directive)93|| (!event1->data.document_start.version_directive && event2->data.document_start.version_directive)94|| (event1->data.document_start.version_directive && event2->data.document_start.version_directive95&& (event1->data.document_start.version_directive->major != event2->data.document_start.version_directive->major96|| event1->data.document_start.version_directive->minor != event2->data.document_start.version_directive->minor)))97return 0;98if ((event1->data.document_start.tag_directives.end - event1->data.document_start.tag_directives.start) !=99(event2->data.document_start.tag_directives.end - event2->data.document_start.tag_directives.start))100return 0;101for (k = 0; k < (event1->data.document_start.tag_directives.end - event1->data.document_start.tag_directives.start); k ++) {102if ((strcmp((char *)event1->data.document_start.tag_directives.start[k].handle,103(char *)event2->data.document_start.tag_directives.start[k].handle) != 0)104|| (strcmp((char *)event1->data.document_start.tag_directives.start[k].prefix,105(char *)event2->data.document_start.tag_directives.start[k].prefix) != 0))106return 0;107}108/* if (event1->data.document_start.implicit != event2->data.document_start.implicit)109return 0; */110return 1;111112case YAML_DOCUMENT_END_EVENT:113return 1;114/* return (event1->data.document_end.implicit ==115event2->data.document_end.implicit); */116117case YAML_ALIAS_EVENT:118return (strcmp((char *)event1->data.alias.anchor,119(char *)event2->data.alias.anchor) == 0);120121case YAML_SCALAR_EVENT:122if ((event1->data.scalar.anchor && !event2->data.scalar.anchor)123|| (!event1->data.scalar.anchor && event2->data.scalar.anchor)124|| (event1->data.scalar.anchor && event2->data.scalar.anchor125&& strcmp((char *)event1->data.scalar.anchor,126(char *)event2->data.scalar.anchor) != 0))127return 0;128if ((event1->data.scalar.tag && !event2->data.scalar.tag129&& strcmp((char *)event1->data.scalar.tag, "!") != 0)130|| (!event1->data.scalar.tag && event2->data.scalar.tag131&& strcmp((char *)event2->data.scalar.tag, "!") != 0)132|| (event1->data.scalar.tag && event2->data.scalar.tag133&& strcmp((char *)event1->data.scalar.tag,134(char *)event2->data.scalar.tag) != 0))135return 0;136if ((event1->data.scalar.length != event2->data.scalar.length)137|| memcmp(event1->data.scalar.value, event2->data.scalar.value,138event1->data.scalar.length) != 0)139return 0;140if ((event1->data.scalar.plain_implicit != event2->data.scalar.plain_implicit)141|| (event1->data.scalar.quoted_implicit != event2->data.scalar.quoted_implicit)142/* || (event2->data.scalar.style != event2->data.scalar.style) */)143return 0;144return 1;145146case YAML_SEQUENCE_START_EVENT:147if ((event1->data.sequence_start.anchor && !event2->data.sequence_start.anchor)148|| (!event1->data.sequence_start.anchor && event2->data.sequence_start.anchor)149|| (event1->data.sequence_start.anchor && event2->data.sequence_start.anchor150&& strcmp((char *)event1->data.sequence_start.anchor,151(char *)event2->data.sequence_start.anchor) != 0))152return 0;153if ((event1->data.sequence_start.tag && !event2->data.sequence_start.tag)154|| (!event1->data.sequence_start.tag && event2->data.sequence_start.tag)155|| (event1->data.sequence_start.tag && event2->data.sequence_start.tag156&& strcmp((char *)event1->data.sequence_start.tag,157(char *)event2->data.sequence_start.tag) != 0))158return 0;159if ((event1->data.sequence_start.implicit != event2->data.sequence_start.implicit)160/* || (event2->data.sequence_start.style != event2->data.sequence_start.style) */)161return 0;162return 1;163164case YAML_MAPPING_START_EVENT:165if ((event1->data.mapping_start.anchor && !event2->data.mapping_start.anchor)166|| (!event1->data.mapping_start.anchor && event2->data.mapping_start.anchor)167|| (event1->data.mapping_start.anchor && event2->data.mapping_start.anchor168&& strcmp((char *)event1->data.mapping_start.anchor,169(char *)event2->data.mapping_start.anchor) != 0))170return 0;171if ((event1->data.mapping_start.tag && !event2->data.mapping_start.tag)172|| (!event1->data.mapping_start.tag && event2->data.mapping_start.tag)173|| (event1->data.mapping_start.tag && event2->data.mapping_start.tag174&& strcmp((char *)event1->data.mapping_start.tag,175(char *)event2->data.mapping_start.tag) != 0))176return 0;177if ((event1->data.mapping_start.implicit != event2->data.mapping_start.implicit)178/* || (event2->data.mapping_start.style != event2->data.mapping_start.style) */)179return 0;180return 1;181182default:183return 1;184}185}186187int print_output(char *name, unsigned char *buffer, size_t size, int count)188{189FILE *file;190char data[BUFFER_SIZE];191size_t data_size = 1;192size_t total_size = 0;193if (count >= 0) {194printf("FAILED (at the event #%d)\nSOURCE:\n", count+1);195}196file = fopen(name, "rb");197assert(file);198while (data_size > 0) {199data_size = fread(data, 1, BUFFER_SIZE, file);200assert(!ferror(file));201if (!data_size) break;202assert(fwrite(data, 1, data_size, stdout) == data_size);203total_size += data_size;204if (feof(file)) break;205}206fclose(file);207printf("#### (length: %ld)\n", (long)total_size);208printf("OUTPUT:\n%s#### (length: %ld)\n", buffer, (long)size);209return 0;210}211212int213main(int argc, char *argv[])214{215int number;216int canonical = 0;217int unicode = 0;218219number = 1;220while (number < argc) {221if (strcmp(argv[number], "-c") == 0) {222canonical = 1;223}224else if (strcmp(argv[number], "-u") == 0) {225unicode = 1;226}227else if (argv[number][0] == '-') {228printf("Unknown option: '%s'\n", argv[number]);229return 0;230}231if (argv[number][0] == '-') {232if (number < argc-1) {233memmove(argv+number, argv+number+1, (argc-number-1)*sizeof(char *));234}235argc --;236}237else {238number ++;239}240}241242if (argc < 2) {243printf("Usage: %s [-c] [-u] file1.yaml ...\n", argv[0]);244return 0;245}246247for (number = 1; number < argc; number ++)248{249FILE *file;250yaml_parser_t parser;251yaml_emitter_t emitter;252yaml_event_t event;253unsigned char buffer[BUFFER_SIZE+1];254size_t written = 0;255yaml_event_t events[MAX_EVENTS];256size_t event_number = 0;257int done = 0;258int count = 0;259int error = 0;260int k;261memset(buffer, 0, BUFFER_SIZE+1);262memset(events, 0, MAX_EVENTS*sizeof(yaml_event_t));263264printf("[%d] Parsing, emitting, and parsing again '%s': ", number, argv[number]);265fflush(stdout);266267file = fopen(argv[number], "rb");268assert(file);269270assert(yaml_parser_initialize(&parser));271yaml_parser_set_input_file(&parser, file);272assert(yaml_emitter_initialize(&emitter));273if (canonical) {274yaml_emitter_set_canonical(&emitter, 1);275}276if (unicode) {277yaml_emitter_set_unicode(&emitter, 1);278}279yaml_emitter_set_output_string(&emitter, buffer, BUFFER_SIZE, &written);280281while (!done)282{283if (!yaml_parser_parse(&parser, &event)) {284error = 1;285break;286}287288done = (event.type == YAML_STREAM_END_EVENT);289assert(event_number < MAX_EVENTS);290assert(copy_event(&(events[event_number++]), &event));291assert(yaml_emitter_emit(&emitter, &event) ||292print_output(argv[number], buffer, written, count));293count ++;294}295296yaml_parser_delete(&parser);297assert(!fclose(file));298yaml_emitter_delete(&emitter);299300if (!error)301{302count = done = 0;303assert(yaml_parser_initialize(&parser));304yaml_parser_set_input_string(&parser, buffer, written);305306while (!done)307{308assert(yaml_parser_parse(&parser, &event) || print_output(argv[number], buffer, written, count));309done = (event.type == YAML_STREAM_END_EVENT);310assert(compare_events(events+count, &event) || print_output(argv[number], buffer, written, count));311yaml_event_delete(&event);312count ++;313}314yaml_parser_delete(&parser);315}316317for (k = 0; k < event_number; k ++) {318yaml_event_delete(events+k);319}320321printf("PASSED (length: %ld)\n", (long)written);322print_output(argv[number], buffer, written, -1);323}324325return 0;326}327328329