From 36a7954df4bf02c1aa65f20ce265c7bc50e1c387 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Wed, 20 Aug 2014 10:36:34 -0700 Subject: [PATCH] Add yamldumper utility Just dumps YAML parser events to the console. Handy for a few things I'm pondering... --- SConstruct | 12 +++- util/yamldumper/SConscript | 8 +++ util/yamldumper/yamldumper.cc | 101 ++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 util/yamldumper/SConscript create mode 100644 util/yamldumper/yamldumper.cc diff --git a/SConstruct b/SConstruct index ef0d09f..c7723b8 100644 --- a/SConstruct +++ b/SConstruct @@ -1,5 +1,5 @@ # SConstruct -# vim: set ft=python: +# vim: set ft=python tw=80: # Eryn Wells @@ -114,6 +114,11 @@ common_env.Append(CCFLAGS=CCFLAGS) common_env.Append(CFLAGS=['-std=c99']) common_env.Append(CXXFLAGS=['-std=c++11']) +# Separate base environment for building utilities. They're all written by me, +# so they need my usual flags, but each should have its own build environment +# derived from this one. +util_env = common_env.Clone() + # Add color error messages for clang if sys.stdout.isatty(): if 'clang' in common_env['CC'] or 'clang' in common_env['CXX']: @@ -123,6 +128,7 @@ BUILD_DIR = Dir('#build') LIB_DIR = Dir('#lib') SRC_DIR = Dir('#src') TEST_DIR = Dir('#test') +UTIL_DIR = Dir('#util') def create_env(name, appends=None): @@ -198,6 +204,10 @@ for mode in build_modes: do_sconscript(env, lib_env, LIB_DIR.Dir(lib), lib_out_dir) env.Append(LIBPATH=[lib_out_dir]) + for util in os.listdir(UTIL_DIR.abspath): + util_out_dir = out_dir.Dir('util').Dir(util) + do_sconscript(env, util_env.Clone(), UTIL_DIR.Dir(util), util_out_dir) + # Get test binaries. do_sconscript(env, env, TEST_DIR, out_dir.Dir('test')) diff --git a/util/yamldumper/SConscript b/util/yamldumper/SConscript new file mode 100644 index 0000000..6595bbc --- /dev/null +++ b/util/yamldumper/SConscript @@ -0,0 +1,8 @@ +# SConscript +# vim: set ft=python: +# Eryn Wells + +Import('env') + +prog = env.Program('yamldumper', ['yamldumper.cc'], LIBS=['yaml']) +env.Alias('yamldumper', prog) diff --git a/util/yamldumper/yamldumper.cc b/util/yamldumper/yamldumper.cc new file mode 100644 index 0000000..6e3434e --- /dev/null +++ b/util/yamldumper/yamldumper.cc @@ -0,0 +1,101 @@ +/* yamldumper.cc + * vim: set tw=80: + * Eryn Wells + */ +/** + * A small utility that reads a YAML file and dumps the parser events. + */ + +#include +#include + +#include "yaml.h" + + +int +main(int argc, + char* argv[]) +{ + if (argc < 2) { + fprintf(stderr, "Usage: %s [yaml_file ...]\n", argv[0]); + return -1; + } + + bool writeNewline = false; + for (int i = 1; i < argc; i++) { + if (writeNewline) { + printf("\n"); + } + + printf("--- %s\n", argv[i]); + + yaml_parser_t parser; + yaml_parser_initialize(&parser); + + FILE *f = fopen(argv[i], "rb"); + if (!f) { + fprintf(stderr, "Couldn't open file.\n"); + } + yaml_parser_set_input_file(&parser, f); + + bool done = false; + yaml_event_t event; + while (!done) { + if (!yaml_parser_parse(&parser, &event)) { + fprintf(stderr, "Error parsing file.\n"); + goto error; + } + + switch (event.type) { + case YAML_NO_EVENT: + std::cout << "YAML_NO_EVENT\n"; + break; + + case YAML_STREAM_START_EVENT: + std::cout << "YAML_STREAM_START_EVENT\n"; + break; + case YAML_STREAM_END_EVENT: + std::cout << "YAML_STREAM_END_EVENT\n"; + break; + + case YAML_DOCUMENT_START_EVENT: + std::cout << "YAML_DOCUMENT_START_EVENT\n"; + break; + case YAML_DOCUMENT_END_EVENT: + std::cout << "YAML_DOCUMENT_END_EVENT\n"; + break; + + case YAML_ALIAS_EVENT: + std::cout << "YAML_ALIAS_EVENT\n"; + break; + case YAML_SCALAR_EVENT: + std::cout << "YAML_SCALAR_EVENT\n"; + break; + + case YAML_SEQUENCE_START_EVENT: + std::cout << "YAML_SEQUENCE_START_EVENT\n"; + break; + case YAML_SEQUENCE_END_EVENT: + std::cout << "YAML_SEQUENCE_END_EVENT\n"; + break; + + case YAML_MAPPING_START_EVENT: + std::cout << "YAML_MAPPING_START_EVENT\n"; + break; + case YAML_MAPPING_END_EVENT: + std::cout << "YAML_MAPPING_END_EVENT\n"; + break; + } + + done = (event.type == YAML_STREAM_END_EVENT); + yaml_event_delete(&event); + } /* while (!done) */ + +error: + yaml_parser_delete(&parser); + fclose(f); + writeNewline = true; + } /* for file : argv */ + + return 0; +}