Blame yaml-filter/yaml.c

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
}