Ticket #88: yaml_error.c

File yaml_error.c, 2.7 KB (added by mzagrabe@…, 6 years ago)

source code generating error condition

Line 
1#include <yaml.h>
2#include <stdio.h>
3
4/*
5 *  gcc -c yaml_error.c && gcc -lyaml -o yaml_error yaml_error.o
6 */
7
8int main(int _argc, char * _argv[])
9{
10  yaml_parser_t parser;
11  yaml_event_t event;
12  yaml_emitter_t emitter;
13
14  yaml_parser_initialize(&parser);
15  yaml_emitter_initialize(&emitter);
16
17  unsigned char buf[1000];
18  size_t written;
19  yaml_emitter_set_output_string(&emitter, buf, 1000, &written);
20
21  FILE * input = fopen(_argv[1], "rb");
22
23  yaml_parser_set_input_file(&parser, input);
24
25  int done = 0;
26
27  do {
28    if (!yaml_parser_parse(&parser, &event)) {
29      goto error;
30    }
31    if (event.type == YAML_NO_EVENT) {
32      printf("Event is YAML_NO_EVENT\n");
33    } else if (event.type == YAML_STREAM_START_EVENT) {
34      printf("Event is YAML_STREAM_START_EVENT\n");
35    } else if (event.type == YAML_STREAM_END_EVENT) {
36      printf("Event is YAML_STREAM_END_EVENT\n");
37    } else if (event.type == YAML_DOCUMENT_START_EVENT) {
38      printf("Event is YAML_DOCUMENT_START_EVENT\n");
39    } else if (event.type == YAML_DOCUMENT_END_EVENT) {
40      printf("Event is YAML_DOCUMENT_END_EVENT\n");
41    } else if (event.type == YAML_ALIAS_EVENT) {
42      printf("Event is YAML_ALIAS_EVENT\n");
43    } else if (event.type == YAML_SCALAR_EVENT) {
44      printf("Event is YAML_SCALAR_EVENT\n");
45      if (! yaml_emitter_emit(&emitter, &event)) {
46        goto emitter_error;
47      }
48      printf(">>%s<<\n", buf);
49    } else if (event.type == YAML_SEQUENCE_START_EVENT) {
50      printf("Event is YAML_SEQUENCE_START_EVENT\n");
51    } else if (event.type == YAML_SEQUENCE_END_EVENT) {
52      printf("Event is YAML_SEQUENCE_END_EVENT\n");
53    } else if (event.type == YAML_MAPPING_START_EVENT) {
54      printf("Event is YAML_MAPPING_START_EVENT\n");
55    } else if (event.type == YAML_MAPPING_END_EVENT) {
56      printf("Event is YAML_MAPPING_END_EVENT\n");
57    } else {
58      printf("Event is UNKNOWN\n");
59    }
60    done = (event.type == YAML_STREAM_END_EVENT);
61
62  } while (!done);
63
64  yaml_event_delete(&event);
65  yaml_parser_delete(&parser);
66  return 0;
67
68  error:
69    printf("Error!\n");
70    return 1;
71
72  emitter_error:
73    fprintf(stderr, "Emitter error!\n");
74
75    /* Display an emitter error message. */
76
77    switch (emitter.error)
78    {   
79        case YAML_MEMORY_ERROR:
80            fprintf(stderr, "Memory error: Not enough memory for emitting\n");
81            break;
82
83        case YAML_WRITER_ERROR:
84            fprintf(stderr, "Writer error: %s\n", emitter.problem);
85            break;
86
87        case YAML_EMITTER_ERROR:
88            fprintf(stderr, "Emitter error: %s\n", emitter.problem);
89            break;
90
91        default:
92            /* Couldn't happen. */
93            fprintf(stderr, "Internal error\n");
94            break;
95    }   
96  return 2;
97}