|
Packit Service |
569379 |
#include <yaml.h>
|
|
Packit Service |
569379 |
#include <stdio.h>
|
|
Packit Service |
569379 |
#include <stdlib.h>
|
|
Packit Service |
569379 |
#include <string.h>
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#include "yaml-path.h"
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#define INDENT " "
|
|
Packit Service |
569379 |
#define STRVAL(x) ((x) ? (char*)(x) : "")
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
void indent(int level)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
int i;
|
|
Packit Service |
569379 |
for (i = 0; i < level; i++) {
|
|
Packit Service |
569379 |
printf("%s", INDENT);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
void print_event(yaml_event_t *event)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
static int level = 0;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
switch (event->type) {
|
|
Packit Service |
569379 |
case YAML_NO_EVENT:
|
|
Packit Service |
569379 |
indent(level);
|
|
Packit Service |
569379 |
printf("no-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_STREAM_START_EVENT:
|
|
Packit Service |
569379 |
indent(level++);
|
|
Packit Service |
569379 |
printf("stream-start-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_STREAM_END_EVENT:
|
|
Packit Service |
569379 |
indent(--level);
|
|
Packit Service |
569379 |
printf("stream-end-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_DOCUMENT_START_EVENT:
|
|
Packit Service |
569379 |
indent(level++);
|
|
Packit Service |
569379 |
printf("document-start-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_DOCUMENT_END_EVENT:
|
|
Packit Service |
569379 |
indent(--level);
|
|
Packit Service |
569379 |
printf("document-end-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_ALIAS_EVENT:
|
|
Packit Service |
569379 |
indent(level);
|
|
Packit Service |
569379 |
printf("alias-event * (anc=\"%s\")\n", STRVAL(event->data.scalar.anchor));
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_SCALAR_EVENT:
|
|
Packit Service |
569379 |
indent(level);
|
|
Packit Service |
569379 |
printf("= scalar-event (anc=\"%s\" val=\"%s\", l=%d, t=%s, pl_impl=%d, q_impl=%d, st=%d)\n",
|
|
Packit Service |
569379 |
STRVAL(event->data.scalar.anchor),
|
|
Packit Service |
569379 |
STRVAL(event->data.scalar.value),
|
|
Packit Service |
569379 |
(int)event->data.scalar.length,
|
|
Packit Service |
569379 |
event->data.scalar.tag,
|
|
Packit Service |
569379 |
event->data.scalar.plain_implicit, event->data.scalar.quoted_implicit, event->data.scalar.style);
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_SEQUENCE_START_EVENT:
|
|
Packit Service |
569379 |
indent(level++);
|
|
Packit Service |
569379 |
printf("[ sequence-start-event (anc=\"%s\", t=%s)\n",
|
|
Packit Service |
569379 |
STRVAL(event->data.sequence_start.anchor),
|
|
Packit Service |
569379 |
event->data.sequence_start.tag);
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_SEQUENCE_END_EVENT:
|
|
Packit Service |
569379 |
indent(--level);
|
|
Packit Service |
569379 |
printf("] sequence-end-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_MAPPING_START_EVENT:
|
|
Packit Service |
569379 |
indent(level++);
|
|
Packit Service |
569379 |
printf("{ mapping-start-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
case YAML_MAPPING_END_EVENT:
|
|
Packit Service |
569379 |
indent(--level);
|
|
Packit Service |
569379 |
printf("} mapping-end-event\n");
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
if (level < 0) {
|
|
Packit Service |
569379 |
fprintf(stderr, "indentation underflow!\n");
|
|
Packit Service |
569379 |
level = 0;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
int yaml_parser_parse_and_filter (yaml_parser_t *parser, yaml_event_t *event, yaml_path_t *path)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
int valid_event = 0;
|
|
Packit Service |
569379 |
int res;
|
|
Packit Service |
569379 |
do {
|
|
Packit Service |
569379 |
res = yaml_parser_parse(parser, event);
|
|
Packit Service |
569379 |
if (res) {
|
|
Packit Service |
569379 |
printf("=====> ");
|
|
Packit Service |
569379 |
print_event(event);
|
|
Packit Service |
569379 |
if (!yaml_path_filter_event(path, parser, event, YAML_PATH_FILTER_RETURN_ALL)) {
|
|
Packit Service |
569379 |
yaml_event_delete(event);
|
|
Packit Service |
569379 |
} else {
|
|
Packit Service |
569379 |
printf("+------------------------------------------------------------------------------------> ");
|
|
Packit Service |
569379 |
print_event(event);
|
|
Packit Service |
569379 |
valid_event = 1;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
} else {
|
|
Packit Service |
569379 |
break;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
} while (!valid_event && res);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return res;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
int main(int argc, char *argv[])
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
yaml_parser_t parser;
|
|
Packit Service |
569379 |
yaml_event_t event;
|
|
Packit Service |
569379 |
yaml_event_type_t event_type;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
yaml_path_t *yp = yaml_path_create();
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".fruit.Oop[1]");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".first.Arr[:2][0]"); //.Arr[2][0]
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".first.Arr[3][:]");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".first.Map");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".first.Arr[:].k");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".first.Arr[:][2]");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".metadata.name");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".spec.outputs[0:2].name");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, ".second[0].abc");
|
|
Packit Service |
569379 |
//yaml_path_parse(yp, "&anc[0]");
|
|
Packit Service |
569379 |
yaml_path_parse(yp, ".first.Map");
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
//const char *yaml = "2";
|
|
Packit Service |
569379 |
//const char *yaml = "{'el': {'Z': &anc [{'key': 0}, {'item': 1}]}, first: {'Map': &anc {1: '1'}, 'Nop': 'b', 'Yep': '2', 'Arr': [[11,12],2,[31,32],[4, 5, 6],{'k': 1, 0: 0}]}}";
|
|
Packit Service |
569379 |
const char *yaml =
|
|
Packit Service |
569379 |
"{"
|
|
Packit Service |
569379 |
"first: {"
|
|
Packit Service |
569379 |
"'Map': {1: '1'},"
|
|
Packit Service |
569379 |
"'Nop': 0,"
|
|
Packit Service |
569379 |
"'Yep': '1',"
|
|
Packit Service |
569379 |
"'Arr': ["
|
|
Packit Service |
569379 |
"[11, 12],"
|
|
Packit Service |
569379 |
"2,"
|
|
Packit Service |
569379 |
"['31', '32'],"
|
|
Packit Service |
569379 |
"[4, 5, 6, 7, 8, 9],"
|
|
Packit Service |
569379 |
"{'k': 'val', 0: 0}"
|
|
Packit Service |
569379 |
"]"
|
|
Packit Service |
569379 |
"},"
|
|
Packit Service |
569379 |
"second: ["
|
|
Packit Service |
569379 |
"{'abc': &anc [1, 2], 'abcdef': 2, 'z': *anc},"
|
|
Packit Service |
569379 |
"{'abc': [3, 4], 'abcdef': 4, 'z': 'zzz'}"
|
|
Packit Service |
569379 |
"]"
|
|
Packit Service |
569379 |
"}";
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
char ypath[255] = {0};
|
|
Packit Service |
569379 |
yaml_path_snprint (yp, ypath, 255);
|
|
Packit Service |
569379 |
printf("%s\n", yaml);
|
|
Packit Service |
569379 |
printf("%s\n\n", ypath);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
yaml_parser_initialize(&parser);
|
|
Packit Service |
569379 |
//yaml_parser_set_input_file(&parser, fopen("../openshift-logging-1.yaml", "r"));
|
|
Packit Service |
569379 |
yaml_parser_set_input_string(&parser, (const unsigned char*)yaml, strlen(yaml));
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
do {
|
|
Packit Service |
569379 |
if (!yaml_parser_parse_and_filter(&parser, &event, yp))
|
|
Packit Service |
569379 |
goto error;
|
|
Packit Service |
569379 |
event_type = event.type;
|
|
Packit Service |
569379 |
yaml_event_delete(&event);
|
|
Packit Service |
569379 |
} while (event_type != YAML_STREAM_END_EVENT);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
yaml_path_destroy(yp);
|
|
Packit Service |
569379 |
yaml_parser_delete(&parser);
|
|
Packit Service |
569379 |
return 0;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
error:
|
|
Packit Service |
569379 |
yaml_path_destroy(yp);
|
|
Packit Service |
569379 |
fprintf(stderr, "Failed to parse: %s\n", parser.problem);
|
|
Packit Service |
569379 |
yaml_parser_delete(&parser);
|
|
Packit Service |
569379 |
return 1;
|
|
Packit Service |
569379 |
}
|